追求简单的设计.

也许你的设计功能很强大,但能够在满足你需求的前提下尽量简单明了设计.

当你的设计过于复杂的时候想想是不是有其它路可以走,你站在别人的角度想下,如果别人看了你的设计会不会心领神会,还是焦头烂额.

当然我们可以站在牛人的肩膀上,有很多的设计模式可以借鉴,拿来主义未尝不可.

好回归正题,先上图:

每层的角色职责分别为:

1:Guitar.Comet  封装通用接口,包括消费者接口,消息接口,消息总线接口,客户端接口(抽象为两种模式:1为推模式,2为拉模式),消息分发器接口,另外抽象出消息体模型.为了能够支持各种消息格式,我定义的字段比较泛化,包括消息名,发送时间,ID(GUID),消息体(以key/value形式存储),发送的客户端名.

2:Guitar.Comet.Client  封装基于SignalR的客户端实现.

    (1)消息分发到服务端(目前单线程异步分发);

    (2)代理客户端,订阅消息,监听消费者,响应消费者支持同步和异步两种方式,如果消息是无序的,无相关性则可异步处理.如果非得让消息有序处理,那也行!当然这可能造成阻塞.

    (3)长连接/断开后重连服务端机制;客户端连接上服务端后,连接通达一直打开(其实有定时 间隔的重连的),如果服务端offline,那客户端肯定保证消息不会丢,其次当服务端online后客户端重连服务端并继续发消息.

3:Guitar.Comet.Host   封装基于SignalR的服务端实现.

    (1) 分发消息给订阅的消费者;

    (2) 当消费者端口后负责重试发送,一旦消费者online,消息重新推给订阅者消费,当然这只是在消息没有过期的前提下,不然消费者一下收到N封消息,那怎么受得了,所以这里面有个消费消息的策略,给消息指定过期时间或统一消息在指定时间内有效;

那为什么这样分层:我主要考虑三点:一是角色职责划分,二是独立性(可测试性)要求,三是用户使用要求;有时候我们会比较纠结分一个什么层,我们的类文件到底放在那一层(无法安放的类).我觉的从上面3点考虑会清晰点.

Guitar.Comet层的类图:

Guitar.Comet.Client层的类图:

类图关系就不多说了,看源码部分即可.

设计是偏技术的,但还是要立足于业务需求的,而领域设计既迎合了技术又重视业务,那什么是领域我理解的领域是代表者客观事实规律,而领域设计我觉的是面向对象式的去表示客观事实,技术和领域相辅相成,没有技术则领域无法落地,没有领域技术显的没有价值,那如何面向领域去思考设计,我看一些牛人的文章使用四元模式,即明确实体,角色,描述及时刻.我比较认同.

简单的设计,不简单的业务.持续优化重构.

转载于:https://www.cnblogs.com/wangzhiyong/p/3906996.html

分享基于分布式Http长连接框架--设计模型相关推荐

  1. 基于cocos2d-x引擎的游戏框架设计【转载】

    http://www.cnblogs.com/lancidie/archive/2013/03/18/2965564.html 基于cocos2d-x引擎的游戏框架设计 移动互联网浪潮正在彻底改变人们 ...

  2. 基于构件开发的应用框架设计

    基于构件开发的应用框架设计 --------------------------------------------------------------------------------   框架必 ...

  3. python使用socket实现协议TCP长连接框架

    点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 使用python实现协议中常见的TCP长连接框架." 分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用 ...

  4. 兼具高效与易用,融云 IM 即时通讯长连接协议设计思路

    无论是 PC 端还是移动端,接入网络实现通信都需要建立双端的连接.关注[融云全球互联网通信云]了解更多 客户端和服务端建立连接后不断开,然后进行通信(也就是发送报文)的方式就是长连接. 与之相反,短连 ...

  5. Asp.net基于工作流引擎的系统框架设计开发(源代码+论文)

    工作流就是一系列相互衔接.自动进行的业务活动或任务.工作流引擎是工作流管理系统的核心,它的主要功能是通过计算机技术的支持去定义.执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互 ...

  6. 火车售票系统(基于UML的软件分析与设计模型建模实验)

    火车售票系统(基于UML的软件分析与设计模型建模试验) 文章目录 火车售票系统(基于UML的软件分析与设计模型建模试验) 一.需求 二.UML用例图 三.UML类图 四.UML时序图 一.需求 实现一 ...

  7. 分布式任务编排调度框架设计

    运维焦油坑 随着互联网+和去IOE浪潮的推进,传统行业X86服务器的数量逐渐增多.服务器数量剧增带来的直接后果就是运维复杂度的增加.原本一个人可以轻松维护十几台甚至几十台服务器:写几个常用的监控和配置 ...

  8. Netra(DM8168)基于Rdk平台的软件框架设计

    感谢原作者robin19890305的经验分享. =========================================================================== ...

  9. sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南

    原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...

最新文章

  1. ThinkPad L440 FN键设置
  2. 重温SQL——行转列,列转行
  3. php 卡号算法,PHP实现通过Luhn算法校验信用卡卡号是否有效_PHP
  4. jQuery api学习笔记
  5. java创建对象过七夕,想 new 个对象过七夕,她却抛了异常
  6. distenct oracle_Oracle的distinct关键字
  7. Android已申请动态权限报错,Android 读取或者写入U盘时,报错:Permission denied
  8. session和cookie_JSP学习
  9. 2014.12.1---Thema:EchartsD3
  10. regester正则用法_Regester学习笔记
  11. 基于 Linux 的文件操作 网络编程的最后一环
  12. android AsyncTask 详细例子
  13. css学习25:设置文本样式
  14. 巨佬就是巨佬,乔布斯 1973 年求职申请表,拍出22万美元高价!
  15. 饭店点餐系统之系统网络结构
  16. 【雅思大作文考官范文】——第十六篇:climate change essay
  17. MATLAB控制有效数字
  18. 什么是工业大数据?工业大数据的价值体现在哪些方面?
  19. 【python学习笔记】python运算符以及简单语句
  20. 决策树(Decision Tree)

热门文章

  1. myeclipse乱码
  2. C# Monitor 使用 多线程通信
  3. Dateset学习笔记
  4. linux进程--自旋锁和互斥锁的区别(十五)
  5. 【软件测试工程师】关于软件测试术语的定义,软件测试中的分类
  6. java Annotation 简单理解
  7. 8.2.1.3 Range 优化
  8. MongoDB入门学习(二):MongoDB的基本概念和数据类型
  9. 9Python全栈之路系列之Win字符编码深解
  10. xz命令--Linux命令应用大词典729个命令解读