分享基于分布式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层的类图:

类图关系就不多说了,看源码部分即可.
设计是偏技术的,但还是要立足于业务需求的,而领域设计既迎合了技术又重视业务,那什么是领域我理解的领域是代表者客观事实规律,而领域设计我觉的是面向对象式的去表示客观事实,技术和领域相辅相成,没有技术则领域无法落地,没有领域技术显的没有价值,那如何面向领域去思考设计,我看一些牛人的文章使用四元模式,即明确实体,角色,描述及时刻.我比较认同.
简单的设计,不简单的业务.持续优化重构.
分享基于分布式Http长连接框架--设计模型的更多相关文章
- 分享基于分布式Http长连接框架--架构模型
我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...
- 分享基于分布式Http长连接框架--代码模型
好的代码应该是方便客户端使用,代码能够自描述,规范化,大众标准化. 而且我相信代码也是有生命的,需要不断的维护它,你以什么样的态度对待它,它就会以同样的态度回敬你,所以在写代码前,先摆好自己的态度(一 ...
- 分享基于分布式Http长连接框架
第一次在博客园写文章,长期以来只是潜水中.本着不只索取,而要奉献的精神,随笔文章之. 现贡献一套长连接的框架.如下特性: 1:发布者可异步发送消息,消息如果发送失败,可重试发送,重试次数基于配置,消息 ...
- 不仅仅是百万级TCP长连接框架 t-io
t-io: 不仅仅是百万级TCP长连接框架 t-io是基于jdk aio实现的易学易用.稳定.性能强悍.将多线程运用到极致.内置功能丰富的即时通讯框架(广义上的即时通讯,并非指im),字母 t 寓意t ...
- 基于Spring-Cloud的微服务框架设计
基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍
- 房产基于Swoole的PHP RPC框架设计
房产基于Swoole的PHP RPC框架设计 https://mp.weixin.qq.com/s/XSrKEQ-0q4DvjOGTIwYYzg
- Android C# java 长连接框架
mina框架详解 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管 ...
- 分享基于Entity Framework的Repository模式设计(附源码)
关于Repository模式,在这篇文章中有介绍,Entity Framework返回IEnumerable还是IQueryable? 这篇文章介绍的是使用Entity Framework实现的Rep ...
- React Native之基于AsyncStorage的离线缓存框架设计
1.为什么要离线缓存? 宏观上来说: 提升用户体验: 我们要为用户提供流畅的APP操作体验,但我们无法保证所有用户的网络流畅度是好的,所以我们需要离线缓存来提升用户体验. 节省流量: 节省流量又分为两 ...
随机推荐
- 第三篇--Jmeter测试数据库Mysql
Jmeter模拟100用户访问Mysql数据库 1.将Mysql数据库的驱动[mysql-connector-java-5.1.15-bin.jar]放到jmeter的lib目录下,新建线程组100[ ...
- mybatis的延迟加载
1. 什么是延迟加载 举个例子: 如果查询订单并且关联查询用户信息.如果先查询订单信息即可满足要求,当我们需要查询用户信息时再查询用户信息.把对用户信息的按需去查询就是延迟加载. 所以延迟加载即先从单 ...
- .NET Core多平台开发体验[2]: Mac OS X
除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL.Ubuntu.Debian.Fedora.CentOS和SUSE等)都提供了很好的支持,我们先来体验 ...
- Servlet和JSP生命周期概述
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt374 Servlet生命周期分为三个阶段: 1,初始化阶段 调用init( ...
- protobuf和thrift对比
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt383 数据类型 protobuf thrift protobuf thrif ...
- 为什么说汽车VIN码是汽车唯一的"身份证"
人有身份证,那么车有吗?当然了,汽车也是有"身份证"的,出厂时就会跟着车辆一起出生, 一般在车辆的挡风玻璃处.按照国际SAE国际规定,Vin码由17位字符组成,其中包含了车辆的生产 ...
- 【Alpha】 第七次Daily Scrum Meeting
一.本次会议为第七次meeting会议 二.时间:9:37AM-9:50AM 地点:禹州三楼 三.会议站立式照片 四.今日任务 成员 昨日任务 今日任务 林清青 学习并了解微信程序相关方面知识,为小组 ...
- 201521123061 《Java程序设计》第八周学习总结
201521123061 <Java程序设计>第八周学习总结 1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 主要是应用到了list中的a ...
- 201521123040《Java程序设计》第8周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 我们每次删除元 ...
- 201521123007《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public bool ...