文章目录

  • 共享项目收获总结
    • 起源
    • 结果
    • 效率评估
    • 设计得与失
      • 跨进程请求
      • 下载文件管理
      • 通信层选择
      • 预研效果
      • 长连接->短连接
      • 单元测试
      • 设计艺术之骨架先行
      • 性能改善
      • 通信结构设计-效率至上
      • 类设计的新探究
    • 知识所得
      • std::string作为内存管理器
      • C++ 创建对象的三种方法之栈中分配
      • Socket代码也并不复杂
      • 如何将一个类作为参数传入方法中
    • 事后诸葛
    • 总结

共享项目收获总结

这是一个局域网分布式资源存储项目,没有涉及外部P2P的穿墙技术.

得失
目的
技术道路

起源

一直希望在P2P上有所进展.
特别某次思考到分布式计算的设计.
留下了一个思考框架在笔记中.

此次正值上份更新完成空档时间,看了下最近的项目需求是减少流量,而局域网P2P是个有效措施,
遂向领导申请做此事.
开始进行预研.

结果

本项目:
总行数: 4300
代码规模:2600

实际编程历时在:三周.
28,29,30,31,18,
19,20,21,22,25,
26,27

作为对比:Proxy项目:
总行数:5200.
代码规模:3400.

另一个对比是RPC项目
总行数: 4200
代码规模:2300
历时:两周+

效率评估

时间不是太长.提升很大.基本都在设计和实现中.

设计得与失

从时间上来说没什么太大问题.
但是前期设计还是费了不少时间.

跨进程请求

为了稳定性,独立服务端目的,因为有同机有多个程序在不同阶段需要调用P2P下载服务.
如果再组织一个跨进程通信…太麻烦了:其实可以通过共享内存来处理.原因是我没有做过这个…
这里采用的措施是:
将下载需求放入配置文件中…

下载文件管理

ini中hash作为key.也算是一个好设计.

通信层选择

经历:

  • MailSlot
    切换原因:
    受限制的发送长度.
    不能适应多端通信.没有单独的向不同客户端通信的设计.
    导致一次只能向一端通信,即使这样也不太方便切换端.
    也就是KD-RPC设计的时候只考虑了向单一服务器通信.
    改进方向是:在通信层上增加不同的目标地址.
    此外其设计上偏重于发送数据给服务器.而不是从服务器拉回数据.
  • Pipe
    切换原因:
    受限制的网络服务.
    以为这个可以不限制通信长度.从资料中了解到它跨机限制长度后:改成服务器回复使用:分片发送.限制客户端的发送长度.
  • Socket
    沿用了客户端发送请求限制在一个包里,收到即返回.

如果能更早的使用Socket来做处理可少走很多弯路.
这是一条经验.

三种选择.
通信层至少花费4天时间.后期会更快.

预研效果

前期预研主要集中在通信结构设计.
初步研判:这也是KD-RPC即不能很好的表达从服务器上拉回数据这一需求.
测试用例仅存在于最外部,导致内部代码轻易改动不了.

任务分为如下:

  • 新的通信结构的设计
  • 新的通信协议封装

总体上预研还是不错的.特别是在定下结构为项目设计.
使用空函数的方式使得逻辑能呈现在代码中,并在后续过程中陆续对空函数进行实现.
空函数使用了异常抛出来防止误用.

长连接->短连接

早期设计是长连接.

与特定客户端的通信,不是每次都关闭.

即组成P2P网.但是由于一些考虑,导致无法做合理复用,只能使用短连接暂时解决.

单元测试

真正做到了类级单元测试.
这极大地改善了代码的可靠性,
为代码的稳步建构提供了保障.

设计艺术之骨架先行

性能改善

主要遇到过以下性能问题:

  • 内存管理
  • 扫描局域网范围
  • 缩小范围
  • 无法缩短时间的阻塞类请求
  1. 将对象指针作为参数传给多线程.
  2. 无论成功失败都将在设置对象数据后退出线程
  3. 统一等待所有线程退出.
  4. 循环检查各个线程的结果.
    //这里可以优化,现在的检查方案是:没有成败独立标识,直接操作句柄,导致异常来判断.
    //应该改为更有效率的标识法.

通信结构设计-效率至上

由于我们采取了std::string作为存储的方式,
所以实际上并不太方便使用位处理和直接指针读取,eg:DWORD* 直接读的方式很不友好.

本次采取的是:完全是可视字符串处理.
虽然增大了那么一点的大小.但是相对于整体的安全和实现便利 来说是值得的.

MAGIC    6
MainVersion 1   ;主版本不匹配直接就返回错误了.
SecondaryVersion 1
PackageLength   10 ;10个十进制数字可以表达0xFFFFffff的范围
status  3   ;类型网络状态码:200,300之类所以占3个字符
MainType    8
SecondType  8
OtherData   ...

前期设计是按位处理,但是在添加\0的时候感觉不爽.来回转换也不好.
直接用"."来补位空缺.

最终本格式设计可以快乐的集成在任一通信层上了.比如JS之类也方便实现.
难道是因为我被JS荼毒?

类设计的新探究

  • 首次使用其他类指针作为构造函数参数
    用于处理A依赖B的关系.顺带学了UML.

CFormat和CClient类遇到一个另人困惑的设计.

CClient依赖具体CFormat.原本打算用CClient继承CFormat,但是想了一下这样很不合理.
因为CFormat需要被继承多态处理,而CClient也需要被继承多态处理.
总不能人家对CFormat继承时被迫对CClient也继承?相对不合理.

所以当想到以上设计时,惊为天人.

知识所得

这就是不按照经典书籍走的后果,会遗漏很多细节.
以下两处所得也是本次遗漏的细节

std::string作为内存管理器

C++ 创建对象的三种方法之栈中分配

  Test test1; //隐式调用,栈中分配 ,由操作系统进行内存的分配和管理Test test2 = Test; //显式调用,栈中分配 ,由操作系统进行内存的分配和管理Test *test3=new Test(); //堆中分配 ,由管理者进行内存的分配和管理,用完必须delete(),否则可能造成内存泄漏

之前以为栈中分配是不调用构造函数的,其实并不是.
这是在调试Socket通信的例子时发现的.
这一解决了我的疑问:std::string 为什么不new也能快乐的玩耍.

Socket代码也并不复杂

在网络层中尽早使用 Socket是有益的。

如何将一个类作为参数传入方法中

好吧,终究还是回来了.
当年难以理解和掌握的知识点,随着实践的增加一定更容易习得了.
使用的是类的引用:

事后诸葛

如果再次设计,我会:

  • 保持类级单元测试
  • 使用基本的Socket协议做通信
    简单淳朴不浪费时间
  • 时间预估上:
    P2P协议类通信类:4000行:10天/2周+预研1周+测试1周=4周.

总结

本次设计颇有收获,不仅仅是具体语言更细节的使用上.
也在设计上增长了经验.在测试上增加了.

掌握一门语言从其经典书籍中确实能掌握很多细节.
之前认为这些细节并不必要.
即使已经3年工作经验的我依然遭遇了很多难题却浑然不知.
如果能伏下身潜心做一些细致的基础学习,会有很大提升.

基础学习 和 开源代码的研读相互推动,自己迈向更高的台阶.

P2P分布式资源存储项目设计收获相关推荐

  1. 如何从零起步搭建一个分布式对象存储的架构

    早在几年前,云存储还只是存在于业界大佬们口中的一个概念,其应用场景仅供大公司使用.突飞猛进的网络技术似乎在一瞬间就把这个概念普及到千家万户,现在云存储已经是大家司空见惯的一个网络服务了.比如大家用的百 ...

  2. 什么是分布式_什么是分布式存储?分布式云存储有什么优势?

    点击蓝色字关注 [悦好创富圈]! 一个出类拔萃的公众号 关注的人都发大财了 什么是分布式存储 分布式存储是数据存储技术.它通过网络使用企业中每台机器的磁盘空间.这些分散的存储资源构成了虚拟存储设备,数 ...

  3. 达沃时代发布分布式块存储服务系统 启动存储生态圈

    10月27日,达沃时代在北京召开主题为"打造数据沃土,营造千亿生态"的新闻发布会,发布存储新品逸存B系列(YeeStor B serials)分布式块存储服务系统,同时宣告了&qu ...

  4. 区块链分布式云存储项目盘点

    随着人类发展,产生了无数PB的数据,存储它的位置和方式的问题变得越来越重要.从内部部署存储迁移到云存储一直是过去十年的主题,而且这一趋势正在加速.但是现目前云存储都是由科技巨头主导到这个市场,这些公司 ...

  5. Hadoop——分布式资源管理框架YARN总结

    分布式资源管理框架YARN 1. YARN概述   YARN是"Yet Another Resource Negotiator"的简称.   在进一步了解 YARN 框架之前我们需 ...

  6. 分布式存储--理解分布式文件系统、分布式块存储、分布式对象存储、分布式数据库

    1. 单机文件系统 vs 分布式文件系统 传统单机文件系统是计算机中一个非常重要的组件,为存储设备提供一致的访问和管理方式.在不同的操作系统中,文件系统会有一些差别,但也有一些共性几十年都没怎么变化: ...

  7. 架构方案(16) 常见分布式文件存储介绍、选型比较、以及架构设计

    数据正成为世界上最有价值的资源,分布式文件存储是应对数据爆炸的最好解决方案,那就会涉及到分布式文件存储方案.选型.架构设计等. 分布式文件存储的来源 在这个数据爆炸的时代,产生的数据量不断地在攀升,从 ...

  8. 盲沟低比?不不不,是芒果的笔,今天学一下分布式文件存储数据库MongoDB。

    老样子先上图,上一篇NOSQL有大佬说要把首图的数据库全部学习了,今天特意只上了一张小图,一个就够了! 文章目录 前言 一.MongoDB 历史 二.MongoDB 支持语言 三.MongoDB 与关 ...

  9. 分布式日志存储架构设计方案

    在一个完整的项目中,不仅仅是要完成正常的业务开发.同时为了提高一些开发效率.系统异常的追踪.系统功能的扩展等等因素,往往会用到系统在开发.运行过程中所产生的日志.这就需要我们有一个完善的日志系统来存储 ...

最新文章

  1. SaltStack状态导入(include)
  2. (0025)iOS 开发之Xcode常用快捷键
  3. 从Dart列表中删除重复项的2种方法
  4. 右键新建中增加新建.md文件
  5. JavaScript编程语言 基础 (1)
  6. C艹 指针和const的关系和注意事项(非常有意思)
  7. 关于location.href几种用法的区别
  8. Python 函数(三)
  9. [USACO4.1]麦香牛块Beef McNuggets By cellur925
  10. 变量定义与声明的区别
  11. C语言员工信息管理系统源代码
  12. win10系统打开/解压缩文件时出现文件名乱码
  13. 山海经鸿蒙手游iOS 版本,山海经鸿蒙异兽手游下载,山海经鸿蒙异兽手游最新官方版 v1.0-手游汇...
  14. 微信公众号——分享给朋友/分享至朋友圈(Vue)
  15. C语言---学生奖学金评定系统设计
  16. Java - 解释一下网络应用的模式及其特点。
  17. 类型 异常报告 消息 null 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 java.lang.NumberFormatException: null java.base/
  18. android recovery 和reboot
  19. 蓝旭后端第六次培训课 MySQL(二)
  20. 联通的光纤--无线路由--mac过滤--存在问题

热门文章

  1. 艾默生质量流量计用于流量测量的作用意义
  2. 笔记本键盘按键错乱怎么办
  3. 【H5/JS】游戏常用算法-碰撞检测-地图格子算法
  4. win7进不了系统怎么办
  5. URLEncode 编码
  6. 基于以太坊商城积分项目分析(一)
  7. python日常总结
  8. 好用的 js 压缩工具 压缩软件 压缩程序 精简压缩 JsZIP(JavaScript压缩工具)
  9. 中国移动Wlan手机客户端系统用户体验设计
  10. win7安装vc6 sp5的MDAC问题解决办法