ZeroMq + Jgroups 无中心化数据发布订阅
消息中间件ZeroMq实现数据交互
1.TCP协议实现远程节点的代理,IPC协议实现本地节点的代理
2.通过接口方式支持多语言访问,节点提供发布接口,代理端会间隔时间访问该接口的订阅数据:包括该节点的域、主题、以及主题发布的消息。
该节点只能发布自己节点的域和主题,以及主题消息。不能发布其他节点的数据。
代理端提供订阅接口,节点调用订阅接口,获取当前网络系统中的所用域、主题,选择进行订阅。
一个节点下可以同时进行发布和订阅,发布者和订阅者可能同时出现。
jgroups实现可靠的群组通讯
1.中心数据存储:整个代理点放入到一个组播列表中进行管理,每间隔5秒进行相互广播数据,相互复制共享中心数据。
2.创建和删除组,组成员加入和离开组,侦测并删除丢失的成员
基于代理模式的数据无中心订阅发布流程
1.代理端启动初始化,查看是否多网卡的情况下,根据配置选择中网卡。
2.查看是否在没有网络的情况下我们的机器并没有网络连接 (比如,DSL调制解调器宕机了),或者我们只想要在本机上进行多播。
3.连接到该网络系统中,进行连接。读取广播消息时候当前节点的唯一标识。
4.查看,是否有历史广播记录,如有则进行数据添加。
5.通过节点提供的发布接口,获取该节点的域、主题、以及主题发布的消息,间隔时间进行消息广播。
6.在整个运行期中, 有节点通过代理端进行发布和订阅主题,有节点加入和退出都有监听。
jgroups实现可靠的群组通讯代码
import org.jgroups.*;
import org.jgroups.conf.ProtocolConfiguration;
import org.jgroups.conf.XmlConfigurator;
import org.jgroups.stack.IpAddress;
import org.jgroups.util.Util;
import java.io.*;
import java.util.LinkedList;
import java.util.List;
public class SimpleChat1 extends ReceiverAdapter {
JChannel channel;
String userName = "ABC1";
String ipAddress;
private List<String> state = new LinkedList<String>();
private void start() throws Exception {
InputStream input = Thread.currentThread().getContextClassLoader().getResourceAsStream("udp.xml");
XmlConfigurator conf = XmlConfigurator.getInstance(input);
String UDP = conf.getProtocolStack().get(0).getProtocolString();
UDP = UDP.replace("replace_bind_addr", "192.168.1.3");
conf.getProtocolStack()