追求简单的设计.

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

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

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

好回归正题,先上图:

每层的角色职责分别为:

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长连接框架--设计模型的更多相关文章

  1. 分享基于分布式Http长连接框架--架构模型

    我画了个简单的架构图来帮助说明: 其实为发布订阅架构模式. 生产者和消费者我们统一可理解为客户端,消息中间件可认为是服务端. 生产者和消费者做为客户端要跟服务端交互,则先通过代理订阅服务端,订阅成功后 ...

  2. 分享基于分布式Http长连接框架--代码模型

    好的代码应该是方便客户端使用,代码能够自描述,规范化,大众标准化. 而且我相信代码也是有生命的,需要不断的维护它,你以什么样的态度对待它,它就会以同样的态度回敬你,所以在写代码前,先摆好自己的态度(一 ...

  3. 分享基于分布式Http长连接框架

    第一次在博客园写文章,长期以来只是潜水中.本着不只索取,而要奉献的精神,随笔文章之. 现贡献一套长连接的框架.如下特性: 1:发布者可异步发送消息,消息如果发送失败,可重试发送,重试次数基于配置,消息 ...

  4. 不仅仅是百万级TCP长连接框架 t-io

    t-io: 不仅仅是百万级TCP长连接框架 t-io是基于jdk aio实现的易学易用.稳定.性能强悍.将多线程运用到极致.内置功能丰富的即时通讯框架(广义上的即时通讯,并非指im),字母 t 寓意t ...

  5. 基于Spring-Cloud的微服务框架设计

    基于Spring-Cloud的微服务框架设计 先进行大的整体的框架整理,然后在针对每一项进行具体的详细介绍

  6. 房产基于Swoole的PHP RPC框架设计

    房产基于Swoole的PHP RPC框架设计 https://mp.weixin.qq.com/s/XSrKEQ-0q4DvjOGTIwYYzg

  7. Android C# java 长连接框架

    mina框架详解 Apache Mina Server 是一个网络通信应用框架,也就是说,它主要是对基于TCP/IP.UDP/IP协议栈的通信框架(当然,也可以提供JAVA 对象的序列化服务.虚拟机管 ...

  8. 分享基于Entity Framework的Repository模式设计(附源码)

    关于Repository模式,在这篇文章中有介绍,Entity Framework返回IEnumerable还是IQueryable? 这篇文章介绍的是使用Entity Framework实现的Rep ...

  9. React Native之基于AsyncStorage的离线缓存框架设计

    1.为什么要离线缓存? 宏观上来说: 提升用户体验: 我们要为用户提供流畅的APP操作体验,但我们无法保证所有用户的网络流畅度是好的,所以我们需要离线缓存来提升用户体验. 节省流量: 节省流量又分为两 ...

随机推荐

  1. [2016-07-15]nuget包管理器控制台下的powershell脚本介绍

    博客有阵子没打理了,今天刚恢复样式,但是标题还是不太正常,总算能凑合看看. 回到正题,最近为了能在VS的程序包管理器控制台上能方便的自定义ps脚本去调整project的package,就开始看powe ...

  2. POI单元格添加公式以及读取公式结果的值

    POI提供了为单元格添加条件样式的方法,但是我并没有找到获取单元格改变后样式的方法,获取到样式依旧是没有改变之前的. 比如为单元格添加条件样式用于监听单元格值是否被修改,如果单元格值被修改那么字体颜色 ...

  3. vue.js路由参数简单实例讲解------简单易懂

    vue中,我们构建单页面应用时候,一定必不可少用到vue-router vue-router 就是我们的路由,这个由vue官方提供的插件 首先在我们项目中安装vue-router路由依赖 第一种,我们 ...

  4. HandlerThread实现数字时钟

    1.描述 刚看完Android多线程编程,对HandlerThread比较感兴趣,趁热巩固练习,实现一个了数字时钟,希望对学习HandlerThread有所帮助.如下: 启动一个HandlerThre ...

  5. 网络协议UDP

    ------------------------------互联网协议与协议族------------------------------tcp/ip协议介绍:计算机网络协议,不同类型不同厂家之间的终 ...

  6. 通过业务系统的重构实践DDD

    最近新接了一个业务系统——社区服务系统,为了快速熟悉和梳理老系统的业务逻辑和代码,同时对老系统代码做一些优化,于是打算花上一个月时间不间断地对老系统服务进行重构.同时,考虑到社区业务的复杂性,想起了之 ...

  7. mbatis_逆向工程

    mybatis逆向工程 什么是逆向工程? mybatis需要程序员自己编写sql语句,mybatis官方提供逆向工程,可以针对单表自动生成所需的代码(mapper,java,po...)等,对于新手不 ...

  8. react 入门

    一:virtual DOM  虚拟DOM树 在React中,render执行的结果得到的并不是真正的DOM节点,结果仅仅是轻量级的JavaScript对象,我们称之为virtual DOM. 虚拟DO ...

  9. Adobe Flash Player 因过期而遭遇阻止怎么办

    百度搜索"adobe flash player ppapi "并找到搜索结果中包含www.adobe.com的网址进行在线下载安装即可搞定这个问题[注意要对应你电脑系统中的浏览器, ...

  10. SNS团队第四次站立会议(2017.04.25)

    一.当天站立式会议照片 本次会议主要内容:汇报工作进度,根据完成情况调整进度 二.每个人的工作 成员 今天已完成的工作 明天计划完成的工作 罗于婕 相关数据库文件建立起来  完善数据库文件 龚晓婷 研 ...