以ZMQ为基础的通信模型
最近使用了一下ZMQ的java版本,先不评述其它,网上已经有很多内容了。
我通过ZMQ的模式,在MsgClient,MsgServer中封装了基础ZMQ的使用。以此扩展了使用模型;
主要是基于2类分布式
1.订阅发布模型
你可以原样使用订阅发布ZMQ。我再此基础上进行了如图扩展
MQ为消息中心,发布端将消息发送给MQ,订阅端订阅;每个MQ处理了接收发布,订阅的端口外,另外添加了自己节点的全数据接口,可以将节点的所有数据发送出去,我称为级联接口,另外还有一个服务验证端口;
如图,MQ1与MQ2建立了级联,则SUB2将可以收到PUB1,PUB2的数据,SUB1只能接受PUB1的数据,类似,SUB3可以接收PUB1,PUB2,PUB3的数据,MQ2启动后与MQ1级联,则MQ2会订阅MQ1的全数据。
如果MQ1如果通过请求服务端口,连接不上,则认为MQ1死亡,有MQ2建立了级联关系,如果发布订阅端设置了允许判断更新,那么PUB1,SUB1将自动连接到MQ2,直到MQ1恢复,PUB1,SUB1将再次连接到MQ1.
级联信息及发布订阅地址,是每个MQ提供一个服务接收,专门处理,所以一个完整的扩展,MQ就需要5个端口;分别是发布订阅的前后端2个,级联全数据1个,请求服务1个以及1个监视端口;
MQ定时会向监视管理地址发送MQ信息,原设计是监视管理接收到MQ信息,通过该信息,可以向每个MQ的请求服务发送指令,随时建立级联,网页图像化,类似上图,拖到箭头就可以使MQ建立级联关系。监视管理客户端现在没有实现,我不是做前端的。
补充:上面的扩展有一个问题,监测MQ的死亡需要时间,默认20秒,那么这20秒内的数据怎么办呢,为了解决该问题,默认把最近20000包数据缓存在内存中,如果超出就落盘(嵌入式数据库),开启一个线程,不断删除20秒以外的落盘数据,同时最新的落盘。一旦MQ发送死亡通过级联更新发布订阅地址,则将最新的数据再次发送。开启该功能订阅端已经了消息重复判断。每一个发布端进程,都会在消息数据头上加入一个消息ID(IP+PID+标识,标识的方式是时间戳(ddHHmmss)+序列号,当前认为每秒最大10w包生成);订阅端会记录接收的消息ID,判断最近30s内是否接收过该信息,解析的时间是根据标识的时间戳30s,这样解决死亡丢失和重复问题。当然如果开启了该功能,则会造成jar很大,引入了嵌入式数据库包,同时会增加内存。所以在没有必要的情况下建议关闭。缓存的包数,判断的时间都可以自己根据需要设置。
2.分布式服务模型
分布式服务模型直接使用了ZMQ的代理模式router-dealer
简单使用原来模式即可完成,也可以自己多重组合
针对以上模式的扩展,将代理变为多个,进行主从备份,原来类似订阅发布
扩展模型如图:
REQ,REP封装了生产类,为一个REQ,REP组,生产的组可以将代理1,代理2的地址同时传入,在生产时,获取到master,双方都会去连接master地址,如果代理没有指定master,则IP,端口大的为master.生产类会隔一段时间要求各个组检查自己的连接状态,如果连接的代理死亡,就连接其它代理,直到master恢复后重新置回。
检查的方式依然是每个代理另外提供一个端口(代理的服务端口+1),提供一个服务检查,检查失败或者检查到代理设置了master就要要求各个组处理。服务不用解决时间内失效问题,请求会自然返回错误。
该代码已经上传git
地址:
https://github.com/jinyuttt/ZMQMSG.git
以ZMQ为基础的通信模型的更多相关文章
- 网络通信 --> ZMQ安装和使用
ZMQ安装和使用 ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯.进程通讯和线程通 ...
- ZeroMQ(ZMQ)函数接口英汉直译
找了好多地方都找不到ZMQ接口函数的中文文档,就厚着脸皮自己翻译了下.但因为作者本人涉世未深,翻译有错误的地方还请大家不吝赐教,在下感激不尽. 因为时间有限,只能一点一点翻译了. ZMQ接口文档的官方 ...
- 异步编程系列06章 以Task为基础的异步模式(TAP)
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- zookeeper系列之通信模型(转)
本文的主题就是讲解Zookeeper通信模型,本节将通过一个概要图来说明Zookeeper的通信模型. Zookeeper的通信架构 在Zookeeper整个系统中,有3中角色的服务,client.F ...
- ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核
官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...
- ZeroMQ接口函数之 :zmq_close - 关闭ZMQ socket
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_close zmq_close(3) ØMQ Manual - ØMQ/3.2.5 Name zmq_close ...
- ZeroMQ接口函数之 :zmq_ctx_destroy - 销毁一个ZMQ环境上下文
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_destroy zmq_ctx_destroy(3) ØMQ Manual - ØMQ/3.2.5 Nam ...
- ZeroMQ接口函数之 :zmq_ctx_new – 创建一个新的ZMQ 环境上下文
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_new zmq_ctx_new(3) ØMQ Manual - ØMQ/3.2 ...
- ZeroMQ接口函数之 :zmq_ctx_shutdown - 停止一个ZMQ context
ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_shutdown zmq_ctx_shutdown(3) ØMQ Manual - ØMQ/4.1.0 N ...
随机推荐
- 分支结构case……end
语法: case when 条件1 then 结果1 when 条件2 then 结果2 ……….. else 其它结果 end 执行顺序: 条件1成立执行结果1 条件2成立执行结果2 如果所有的wh ...
- PLC通信网络
PLC通信网络的分层 PLC通信网络大致可分为3层,管理层,单元层以及现场执行(AS-I)层.如下图所示. 在PLC通信网络的三层架构中,管理层,通信方式包括MPI,工业以太网(Profinet)以及 ...
- Bash 终端快捷键
在终端下输大量的命令,有些快捷键还是挺有帮助的. 跳跃 跳到最后 ctrl + e (end) 跳到最前 ctrl + a (abcde....) 向后跳一个单词 alt + 右方向键 向前跳一个单词 ...
- Csharp: Detect Mobile Browsers
/// <summary> /// 檢測手機客戶端 HttpCapabilitiesBase.IsMobileDevice /// .NET 4.5 /// 塗聚文注 /// </s ...
- Required Integer parameter 'XXX' is not present
1.异常提示: DEBUG o.s.w.s.m.m.a.ServletInvocableHandlerMethod - Error resolving argument [2] [type=java. ...
- Kafka监控利器
开发过程中,kafka几乎是标配的Mq,如果有一个kafka的监控助手,哪就更完美了,常用的kafka监控工具有 KafkaOffsetMonitor .Kafka Manager.Capillary ...
- MCU & 51单片机
- centos的nginx支持ssl
首先看centos是否支持ssl 输入:openssl version 如无 则去 http://slproweb.com/products/Win32OpenSSL.html 寻找 生成私钥后面的 ...
- WIN7系统程序放在中文文件夹打开报错及界面汉字变乱码
今天发现在一个服务商提供的设备的WIN7系统里,一个稳定运行的程序打开时报错,且界面汉字变乱码. 经测试发现程序放在英文名称的文件夹中可以正常打开,但界面上的汉字仍为乱码. 后检查“控制面板“--”区 ...
- Perl Unicode全攻略
Perl Unicode全攻略 耐心看完本文,相信你今后在unicode处理上不会再有什么问题. 本文内容适用于perl 5.8及其以上版本. perl internal form 在Perl看来, ...