最近使用了一下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为基础的通信模型的更多相关文章

  1. 网络通信 --> ZMQ安装和使用

    ZMQ安装和使用 ZMQ 并不像是一个传统意义上的消息队列服务器,事实上,它也根本不是一个服务器,它更像是一个底层的网络通讯库,在 Socket API 之上做了一层封装,将网络通讯.进程通讯和线程通 ...

  2. ZeroMQ(ZMQ)函数接口英汉直译

    找了好多地方都找不到ZMQ接口函数的中文文档,就厚着脸皮自己翻译了下.但因为作者本人涉世未深,翻译有错误的地方还请大家不吝赐教,在下感激不尽. 因为时间有限,只能一点一点翻译了. ZMQ接口文档的官方 ...

  3. 异步编程系列06章 以Task为基础的异步模式(TAP)

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  4. zookeeper系列之通信模型(转)

    本文的主题就是讲解Zookeeper通信模型,本节将通过一个概要图来说明Zookeeper的通信模型. Zookeeper的通信架构 在Zookeeper整个系统中,有3中角色的服务,client.F ...

  5. ZeroMQ接口函数之 :zmq - 0MQ 轻量级消息传输内核

    官方网址:http://api.zeromq.org/4-0:zmq zmq(7) 0MQ Manual - 0MQ/3.2.5 Name zmq – ØMQ 轻量级消息传输内核 Synopsis # ...

  6. 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  ...

  7. 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 ...

  8. ZeroMQ接口函数之 :zmq_ctx_new – 创建一个新的ZMQ 环境上下文

    ZeroMQ 官方地址 :http://api.zeromq.org/4-0:zmq_ctx_new zmq_ctx_new(3)               ØMQ Manual - ØMQ/3.2 ...

  9. 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 ...

随机推荐

  1. Jquery实现自动生成二级目录

    在博客园开通博客以后,就看到某位博友写的js自动生成目录的文章,当时觉得生成目录能给阅读带来方便,所以就直接拿来使用了.用了一段时间以后,发现只能生成一级目录,不能生成多级目录,有点美中不足.所以想着 ...

  2. js Base64与字符串互转

    1.base64加密 在页面中引入base64.js文件,调用方法为: <!DOCTYPE HTML> <html> <head> <meta charset ...

  3. Spring.NET入门

    Spring.NET入门  http://www.cnblogs.com/haogj/archive/2011/06/10/2077540.html http://www.cnblogs.com/ha ...

  4. (二)HTML中的部分标签

    HTML作为一种超文本标记语言,其中用到了大量的标签,昨天主要看了HTML中的图像标签和表格标签. (一)图像标签 <img> <img src="url"/&g ...

  5. C语言的前世今生

    1.计算机语言的发展 机器语言:其实就是二进制0和1,最小为00000000,最大为11111111,8位比特为1个字节(byte),1k=1024byte,1m=1024k,1g=1024m[第一代 ...

  6. IO流之序列化流与反序列化流

    序列化流与反序列化流 用于从流中读取对象的 操作流 ObjectInputStream    称为 反序列化流 用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流 l ...

  7. Python爬虫《Python网络爬虫相关基础概念》

    引入 之前在授课过程中,好多同学都问过我这样的一个问题:为什么要学习爬虫,学习爬虫能够为我们以后的发展带来那些好处?其实学习爬虫的原因和为我们以后发展带来的好处都是显而易见的,无论是从实际的应用还是从 ...

  8. CentOS 7 学习笔记

    Centos7 命令行   快捷键: 上方向键, 查看上一条命令 Ctrl+C 强制终止程序运行   新版 nmtui 配置网络 旧版 setup(已经没了)   网络接口   ip a = ip a ...

  9. CSS实现文本周围插入符号

    CSS实现文本周围插入符号的方案 本文要讨论的是如何在文本的周围插入图标,怎么样控制它们之间的位置关系,通过HTML结构合理性与CSS属性的使用来比较不同方案所实现效果的优缺点. 常见设计稿要求 在文 ...

  10. css border-radius的用法及自适应的椭圆

    我们知道border-radius允许您为元素添加圆角边框! 而border-radius 属性是一个简写属性,用于设置四个 border-*-radius 属性. 如果省略 bottom-left, ...