本教程转自:http://blog.csdn.net/kobejayandy/article/details/20163527

在开始之前先把guid里面提到的几个ZeroMQ的特性列一下吧:

(1)ZeroMQ有自己的I/O线程来异步的处理I/O,而且后台采用了无锁的数据结构

(2)在ZeroMQ中,所有的组件都可以动态的加入和移除,而且可以启动组件以任何的顺利,例如我们可以先启动request,再启动response,依然可以工作,而且还会自动的重连接。

(3)如果有需要的话,会自动的将message进行排队,当然这都是有一套的模式的,一般情况下会尽量早的将数据发送到receiver。

(4)当缓冲的message队列满了以后,ZeroMQ有自己的行为,有的组件会阻塞,有的则会将message抛弃。

(5)底层的通信可以采用各种各样的都行,例如TCP,IPC啥的。

(6)它会自动的处理那些比较慢而且阻塞的reader

(7)支持message的路由

(8)ZeroMQ确保全部的数据被receiver接收到,例如发送10K,那么也接受到10K

(9)它发送的数据格式是二进制,所以对发送的内容无要求

(10)ZeroMQ会自动处理网络错误,而且会自动尝试恢复

(11)节能。。。(我擦,居然还有这个)

好了,先来看一下poller这个东西吧,蛮有意思的,类似与epoll或者java里面的selector,

在前面的例子中我们都只是创建一个socket,那如果我们要创建两个socket在同一个线程中该怎么处理呢,那么这个时候就可以用到poller这东西了。。。可以将已经建立好的socket注册到poller上面去,并注册相应的事件。。

这里就用push/pull来举例子吧,就直接来看pull端的代码吧:

  1. package poller;
  2. import org.zeromq.ZMQ;
  3. public class Pull {
  4. public static void main(String args[]) {
  5. ZMQ.Context context = ZMQ.context();
  6. ZMQ.Socket pull1 = context.socket(ZMQ.PULL);  //创建一个pull
  7. pull1.connect("tcp://127.0.0.1:5555");    //建立于push的连接
  8. ZMQ.Socket pull2 = context.socket(ZMQ.PULL);
  9. pull2.connect("tcp://127.0.0.1:5555");
  10. ZMQ.Poller poller = new ZMQ.Poller();  //创建一个大小为2的poller
  11. poller.register(pull1, ZMQ.Poller.POLLIN);  //分别将上述的pull注册到poller上,注册的事件是读
  12. poller.register(pull2, ZMQ.Poller.POLLIN);
  13. int i = ;
  14. while (!Thread.currentThread().isInterrupted()) {
  15. poller.poll();
  16. if (poller.pollin()) {
  17. while (null != pull1.recv(ZMQ.NOBLOCK)) {  //这里采用了非阻塞,确保一次性将队列中的数据读取完
  18. i++;
  19. }
  20. }
  21. if (poller.pollin()) {
  22. while (null != pull2.recv(ZMQ.NOBLOCK)) {
  23. i++;
  24. }
  25. }
  26. if (i %  == ) {
  27. System.out.println(i);
  28. }
  29. }
  30. pull1.close();
  31. pull2.close();
  32. context.term();
  33. }
  34. }

这里还算简单吧,同时创建了两个pull,都将他们注册到了poller上面去。。。其实这个样子很像是selector或者epoll啥的。。。

好啦,接下来进入正题:

request/response算是一种非常常用的模式了,但是前面的例子中,我们的response端都只能在单线程中运行,因为必须要recv与send配对使用,那么就很大程度上限制了response的伸缩性,如果有大量的request来提交很多request请求的话,那么性能将会受到极大的限制,当然这种情况下我们可以采用如下的方式来解决:

这里让request同时连接到多个response,这里就可以将request请求分散到多个response,这样当有多个request的时候的性能要求。。。但是有一个问题,如果我们又10个request端,他们每一个都不断的提交request请求,这个时候我们的reponse可能就会很忙,那么在这种结构下无法动态的添加response,依然限制了整个系统的伸缩性。。。

那么最终的解决方案就来了:

这里可以看到,在request端与response端之间加了一个中间层,可以将其看成一个路由器,它将request端的请求路由到response端,如果性能不够的话,可以再建立新的response将其连接到中间层就可以了,就方便的解决系统的伸缩性问题了。。。

好了,这里直接就上中间层与response端的代码吧:

  1. package multireqrep;
  2. import org.zeromq.ZMQ;
  3. public class Response {
  4. public static void main(String args[]) {
  5. final ZMQ.Context context = ZMQ.context();
  6. ZMQ.Socket router = context.socket(ZMQ.ROUTER);
  7. ZMQ.Socket dealer = context.socket(ZMQ.DEALER);
  8. router.bind("ipc://fjs1");
  9. dealer.bind("ipc://fjs2");
  10. for (int i = ; i < ; i++) {
  11. new Thread(new Runnable(){
  12. public void run() {
  13. // TODO Auto-generated method stub
  14. ZMQ.Socket response = context.socket(ZMQ.REP);
  15. response.connect("ipc://fjs2");
  16. while (!Thread.currentThread().isInterrupted()) {
  17. response.recv();
  18. response.send("hello".getBytes());
  19. try {
  20. Thread.currentThread().sleep();
  21. } catch (InterruptedException e) {
  22. // TODO Auto-generated catch block
  23. e.printStackTrace();
  24. }
  25. }
  26. response.close();
  27. }
  28. }).start();
  29. }
  30. ZMQ.proxy(router, dealer, null);
  31. router.close();
  32. dealer.close();
  33. context.term();
  34. }
  35. }

好吧,代码还算蛮简单的,直接用了ZeroMQ定义的router和dealer组件,以及内置的proxy方法就好了。。。

嗯,再来赞叹一次,ZeroMQ确实好用。。。

ZeroMQ(java)之Router/Dealer模式的更多相关文章

  1. ZeroMQ(java)之Router与Dealer运行原理

    在开始这部分的内容之前,先来看看ZeroMQ中HWM概念---High-Water Marks 当系统的数据量很大,而且发送频率很高的情况下,内存就很重要了,如果处理不好会出现很多问题,例如如下场景: ...

  2. ZeroMQ(java)中的数据流SessionBase与SocketBase

    前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...

  3. ZeroMQ(JAVA)中的数据流,SessionBase与SocketBase

    前面的文章中已经比较的清楚了ZeroMQ(java)中如何在底层处理IO, 通过StreamEngine对象来维护SelectableChannel对象以及IO的事件回调,然后通过Poller对象来维 ...

  4. java运行时内存模式学习

    学习java运行时内存模式: 各区介绍: 方法区(线程共享):用于存放被虚拟机加载的类的元数据:静态变量,常量,以及编译和的代码(字节码),也称为永久代(所有该类的实例被回收,或者此类classLoa ...

  5. java设计模式之原型模式

    原型模式概念 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.java中复制通过clone()实现的.clone中涉及深.浅复制.深.浅复制的概念如下: ⑴浅复制 ...

  6. Java设计模式——装饰者模式

    JAVA 设计模式 装饰者模式 用途 装饰者模式 (Decorator) 动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator 模式相比生成子类更为灵活. 装饰者模式是一种结构式模式 ...

  7. ZeroMQ(java)中监控Socket

    基本上ZeroMQ(java)中基本的代码都算是过了一遍了吧,不过觉得它在日志这一块貌似基本没有做什么工作,也就是我们通过日志来知道ZeroMQ都发生了什么事情.. 而且由于ZeroMQ中将连接的建立 ...

  8. 说说Java中的代理模式

    今天看到传智播客李勇老师的JDBC系列的第36节——通过代理模式来保持用户关闭连接的习惯.讲的我彻底蒙蔽了,由于第一次接触代理模式,感到理解很难,在博客园找到一篇文章,先记录如下: 引用自java设计 ...

  9. java反射机制(工厂模式)

    http://www.phpddt.com/dhtml/338.html java里面没有typeof,js有. 我终于实现了用反射机制编写的工厂模式.java反射在工厂模式可以体现. 包含产品接口类 ...

随机推荐

  1. 关于js字符串替换的一道笔试题目

    题目描述 请写出一个字符串转换函数,接受两个参数: 1.字符串 形如{a}ab-{b}cde{c}fff{d}{}: 2.对象,形如{'a':'1','b':'2','d':'4'} 根据,对象的属性 ...

  2. HDU 5973 Game of Taking Stones 威佐夫博弈+大数

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5973 Game of Taking Stones Time Limit: 2000/1000 MS ...

  3. WebView加载本地html、js文件常见问题及解决办法

    声明:基于android studio平台,php语言搭建服务器 目录: 一.JavaScript脚本语言没有反应 二.alert无法弹出 三.html页面之间不能跳转 四.屏幕缩放没有达到预期效果 ...

  4. Windows7下出现“不支持此接口”的解决方案

    今天学校里的辅导员突然找到我说Windows 7下什么文件夹都打不开了,提示“不支持此接口”.怀疑是病毒所致,但运行杀毒软件没有结果.重启也问题依旧. 上网查了之后找到了修复方法: 在命令行中输入fo ...

  5. 【转】div居中代码 DIV水平居中显示CSS代码

    原文地址:http://www.divcss5.com/rumen/r622.shtml 如何使用CSS让DIV居中显示,让div水平居中有哪些CSS样式呢? 需要的主要css代码有两个,一个为tex ...

  6. neutron中的dhcp功能

    1. 分布式dhcp 特点: 1)一个dhcp port对应多个host上的tap设备. 2)基于port event的network与agent的绑定与解绑定,即创建tap设备.namespace. ...

  7. 【BZOJ 3036】 绿豆蛙的归宿

    求期望的题目(~~~water~~~) 压了下代码,压成15行hhh: 我把代码压成这么丑估计也没有人看吧: 毕竟是zky讲的一个水题,就当给博客除草了:    dfs回溯时求当前节点的f,除以当前节 ...

  8. c++ 函数调用在进入下一个循环的时候会再次初始化参数,将函数体直接写进去就正常

    #include"stdafx.h" #include"string" #include<iostream> #include<vector& ...

  9. sdk和ndk

    让我先来说说android sdk (Android Software Development Kit, 即Android软件开发工具包)可以说只要你使用java去开发Android这个东西就必须用到 ...

  10. 详细解读Jquery各Ajax函数:$.get(),$.post(),$.ajax(),$.getJSON()

    一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...