分享基于分布式Http长连接框架--设计模型
追求简单的设计.
也许你的设计功能很强大,但能够在满足你需求的前提下尽量简单明了设计.
当你的设计过于复杂的时候想想是不是有其它路可以走,你站在别人的角度想下,如果别人看了你的设计会不会心领神会,还是焦头烂额.
当然我们可以站在牛人的肩膀上,有很多的设计模式可以借鉴,拿来主义未尝不可.
好回归正题,先上图:
每层的角色职责分别为:
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长连接框架--设计模型相关推荐
- 基于cocos2d-x引擎的游戏框架设计【转载】
http://www.cnblogs.com/lancidie/archive/2013/03/18/2965564.html 基于cocos2d-x引擎的游戏框架设计 移动互联网浪潮正在彻底改变人们 ...
- 基于构件开发的应用框架设计
基于构件开发的应用框架设计 -------------------------------------------------------------------------------- 框架必 ...
- python使用socket实现协议TCP长连接框架
点击上方↑↑↑蓝字[协议分析与还原]关注我们 " 使用python实现协议中常见的TCP长连接框架." 分析多了协议就会发现,很多的应用,特别是游戏类和IM类应用,它们的协议会使用 ...
- 兼具高效与易用,融云 IM 即时通讯长连接协议设计思路
无论是 PC 端还是移动端,接入网络实现通信都需要建立双端的连接.关注[融云全球互联网通信云]了解更多 客户端和服务端建立连接后不断开,然后进行通信(也就是发送报文)的方式就是长连接. 与之相反,短连 ...
- Asp.net基于工作流引擎的系统框架设计开发(源代码+论文)
工作流就是一系列相互衔接.自动进行的业务活动或任务.工作流引擎是工作流管理系统的核心,它的主要功能是通过计算机技术的支持去定义.执行和管理工作流,协调工作流执行过程中工作之间以及群体成员之间的信息交互 ...
- 火车售票系统(基于UML的软件分析与设计模型建模实验)
火车售票系统(基于UML的软件分析与设计模型建模试验) 文章目录 火车售票系统(基于UML的软件分析与设计模型建模试验) 一.需求 二.UML用例图 三.UML类图 四.UML时序图 一.需求 实现一 ...
- 分布式任务编排调度框架设计
运维焦油坑 随着互联网+和去IOE浪潮的推进,传统行业X86服务器的数量逐渐增多.服务器数量剧增带来的直接后果就是运维复杂度的增加.原本一个人可以轻松维护十几台甚至几十台服务器:写几个常用的监控和配置 ...
- Netra(DM8168)基于Rdk平台的软件框架设计
感谢原作者robin19890305的经验分享. =========================================================================== ...
- sql 拆分_技术分享 | 基于分布式中间件的SQL改造指南
原创作者: 孙正方 4月12日,GOPS全球运维大会在深圳隆重召开,全球运维大会是国内第一个运维行业大会,爱可开源社区在基础架构及DevOps解决方案专场分享了<基于分布式中间件的SQL改造指南 ...
最新文章
- ThinkPad L440 FN键设置
- 重温SQL——行转列,列转行
- php 卡号算法,PHP实现通过Luhn算法校验信用卡卡号是否有效_PHP
- jQuery api学习笔记
- java创建对象过七夕,想 new 个对象过七夕,她却抛了异常
- distenct oracle_Oracle的distinct关键字
- Android已申请动态权限报错,Android 读取或者写入U盘时,报错:Permission denied
- session和cookie_JSP学习
- 2014.12.1---Thema:EchartsD3
- regester正则用法_Regester学习笔记
- 基于 Linux 的文件操作 网络编程的最后一环
- android AsyncTask 详细例子
- css学习25:设置文本样式
- 巨佬就是巨佬,乔布斯 1973 年求职申请表,拍出22万美元高价!
- 饭店点餐系统之系统网络结构
- 【雅思大作文考官范文】——第十六篇:climate change essay
- MATLAB控制有效数字
- 什么是工业大数据?工业大数据的价值体现在哪些方面?
- 【python学习笔记】python运算符以及简单语句
- 决策树(Decision Tree)