ZeroMQ是一个很有个性的项目,它原来是定位为“史上最快消息队列”,所以名字里面有“MQ”两个字母,但是后来逐渐演变发展,慢慢淡化了消息队列的身影,改称为消息内核,或者消息层了。从网络通信的角度看,它处于会话层之上,应用层之下,有了它,你甚至不需要自己写一行的socket函数调用就能完成复杂的网络通信工作。

借用官方的例子:

客户端(发送N个“Hello”消息到服务端,接受回应):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//
//  Hello World client
//  Connects REQ socket to tcp://localhost:5555
//  Sends "Hello" to server, expects "World" back
//
#include <zmq.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
int main () {
    void *context = zmq_init (1);
    //  Socket to talk to server
    printf ("Connecting to hello world server...\n");
    void *requester = zmq_socket (context, ZMQ_REQ);
    zmq_connect (requester, "tcp://localhost:5555");
    int request_nbr;
    for (request_nbr = 0; request_nbr != 10; request_nbr++) {
        zmq_msg_t request;
        zmq_msg_init_data (&request, "Hello", 6, NULL, NULL);
        printf ("Sending request %d...\n", request_nbr);
        zmq_send (requester, &request, 0);
        zmq_msg_close (&request);
        zmq_msg_t reply;
        zmq_msg_init (&reply);
        zmq_recv (requester, &reply, 0);
        printf ("Received reply %d: [%s]\n", request_nbr,
            (char *) zmq_msg_data (&reply));
        zmq_msg_close (&reply);
    }
    zmq_close (requester);
    zmq_term (context);
    return 0;
}

服务端(接收客户端的消息,返回“World”给客户端):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//
//  Hello World server in C++
//  Binds REP socket to tcp://*:5555
//  Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main () {
    //  Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");
    while (true) {
        zmq::message_t request;
        //  Wait for next request from client
        socket.recv (&request);
        printf ("Received request: [%s]\n",
            (char *) request.data ());
        //  Do some 'work'
        sleep (1);
        //  Send reply back to client
        zmq::message_t reply (6);
        memcpy ((void *) reply.data (), "World", 6);
        socket.send (reply);
    }
    return 0;
}

一个套接字相关的调用都没有,一个网络程序就写好了,生活真美好啊。

与其他的消息队列相比,ZeroMQ有以下一些特点

1.点对点无中间节点。

传统的消息队列都需要一个消息服务器来存储转发消息。而ZeroMQ则放弃了这个模式,把侧重点放在了点对点的消息传输上,并且(试图)做到极致。以为消息服务器最终还是转化为服务器对其他节点的点对点消息传输上。ZeroMQ能缓存消息,但是是在发送端缓存。ZeroMQ里有水位设置的相关接口来控制缓存量。当然,ZeroMQ也支持传统的消息队列(通过zmq_device来实现)。

2.强调消息收发模式。

在点对点的消息传输上ZeroMQ将通信的模式做了归纳,比如常见的订阅模式(一个消息发多个客户),分发模式(N个消息平均分给X个客户)等等。下面是目前支持的消息模式配对,任何一方都可以做为服务端。

  • PUB and SUB
  • REQ and REP
  • REQ and XREP
  • XREQ and REP
  • XREQ and XREP
  • XREQ and XREQ
  • XREP and XREP
  • PUSH and PULL
  • PAIR and PAIR

3.以统一接口支持多种底层通信方式(线程间通信,进程间通信,跨主机通信)。

如果你想把本机多进程的软件放到跨主机的环境里去执行,通常要将IPC接口用套接字重写一遍。非常麻烦。而有了ZeroMQ就方便多了,只要把通信协议从"ipc:///xxx"改为"tcp://*.*.*.*:****"就可以了,其他代码通通不需要改,如果这个是从配置文件里读的话,那么程序就完全不要动了,直接复制到其他机器上就可以了。以为ZeroMQ为我们做了很多。

4.异步,强调性能。

ZeroMQ设计之初就是为了高性能的消息发送而服务的,所以其设计追求简洁高效。它发送消息是异步模式,通过单独出一个IO线程来实现,所以消息发送调用之后不要立刻释放相关资源哦,会出错的(以为还没发送完),要把资源释放函数交给ZeroMQ让ZeroMQ发完消息自己释放。

目前ZeroMQ还不是非常成熟(本文写作时最新版是2.0.10版),设计上还有一点点小缺陷,比如不能得到客户端的IP,丢消息等。不过,开发很活跃,很有潜力。另外,ZeroMQ配合Protocol buffer使用真是绝了。

官方的教程写的非常详细:http://zguide.zeromq.org/chapter:all大家可以去看看。

相关文章:

  • 纠结的ZeroMQ
  • Tornado中ioloop.py代码略读
  • 异步IO编程中的Idiom、Pattern和Framework
  • 多路复用select(2)与事件通知poll(2)、epoll(7)内核源码初探
  • 异步编程经典 读skipfish源码

转自:http://blog.dccmx.com/2011/02/zeromq/

转载于:https://www.cnblogs.com/viviancc/archive/2012/04/24/2468391.html

史上最快消息内核——ZeroMQ相关推荐

  1. 微信服务通知消息找回_微信好友删除了怎么找回?史上最快的找回方法,确定不看下么?...

    微信好友删除了怎么找回?史上最快的找回方法,确定不看下么? 微信好友删除了怎么找回?随着现在微信使用的越来越频繁,导致手机通讯录的功能已经退化,可以说现在一个人可能会没有对方的手机号,但是一定不会没有 ...

  2. miui android 更新更快,即日起,“史上最快的安卓系统”要停更了!或将迎来MIUI 10?...

    原标题:即日起,"史上最快的安卓系统"要停更了!或将迎来MIUI 10? 今日,小米官方宣布:MIUI 将在4月27日发布最后一个更新包MIUI 9开发版/体验版8.4.26之后大 ...

  3. 半年 5 战 5 金:Kaggle 史上最快 GrandMaster 是如何炼成的?

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 转载自机器之心(id: almosthuman2014) 这是 Kaggle 你问我答 ...

  4. 一年六篇顶会的清华大神提出Fastformer:史上最快、效果最好的Transformer

    来源:新智元 [导读]Transformer模型好是好,可惜太慢了!最近一位清华大神在arxiv上传了一篇论文,提出新模型Fastformer,线性时间复杂度,训练和推理效率史上最快,还顺手在排行榜刷 ...

  5. DeepFaceLab史上最快的环境搭建(虚拟环境)

    DeepFaceLab史上最快的环境搭建(虚拟环境) 文章目录: 一.测试环境 二.搭建虚拟环境 1.创建虚拟环境 2.激活虚拟环境 3.离开虚拟环境 三.配置GPU环境 四.安装配置python库包 ...

  6. MySQL史上最快逻辑备份工具

    MySQL Shell 8.0.21 增加了一种新的逻辑备份恢复方法,有更快的备份恢复效率,支持zstd实时压缩,支持分块并行导出,load data并行导入,还能备份到OCI的对象存储. util. ...

  7. 史上最快的内网视频会议部署方案-turbomeeting视频会议系统

    之前的文章有提到过,市面上用电脑安装视频会议软件.手机安装视频会议软件来开会的"软视频会议系统"主要是以租赁的形式提供给用户使用,很多优秀的软件甚至只需要付费6000K就可以获得5 ...

  8. Android开发者福音-史上最快模拟器genymotion

    Android开发者福音-史上最快模拟器genymotion 2014年3月17日 这个模拟器是我在新公司第一天上班的时候,公司同事推荐给我的,这么好的东西,我自然不忘跟大家分享一下.我们都知道Ecl ...

  9. 史上最快的文件复制软件FastCopy

    大家每天几乎都会在磁盘间相互拷贝文件的,通常情况下都是利用Windows自带的复制粘贴功能来实现.这样做在数据量较小的情况下倒也没什么问题,但是数据量较大时,如电影.游戏等数GB的大文件的复制,特别是 ...

最新文章

  1. 并发基础篇(二):Thread类的API总结
  2. 关于IDEA代码的整理以及函数
  3. Fiddler使用AutoResponder进行本地文件和线上文件的映射
  4. 2021-09-08321. 拼接最大数 单调栈
  5. pp助手苹果版本_这可能是最简单的下载APP历史版本方法(支持iOS和安卓)
  6. Qt 5.9.0安装教程
  7. 计算机主板的电路,电脑主板电路图全).pdf
  8. 简历中“项目经历“该如何写?
  9. 计算机专业人才需求调研背景,计算机专业人才需求调研报告
  10. 利用免费的必应 Bing 自定义搜索打造站内全文搜索
  11. react组件设计原则_可靠React组件设计的7个准则之封装
  12. CM311-1a_YST代工_安卓9_S905L3A_没无线版Emotn UI桌面线刷固件包
  13. SpringBoot 集成SpringSecurity整体流程
  14. PB 数据窗口数据导入Excel, 如果存在则追加,不存在则创建。
  15. vue之封装loading组件
  16. 【DBA100人】Payso张耀辉:学材料专业出身的他转身做了“码农”
  17. 微信摇一摇插件ios_iOS仿微信摇一摇功能
  18. .Net读取post传递参数(body)小计
  19. python-docx中文文档使用小结
  20. 文秘类计算机,文秘类包括哪些专业

热门文章

  1. 排序算法——堆排序(C++)
  2. sp_executesql介绍和使用
  3. luogu1341 无序字母对
  4. Spring Data 分页和排序 PagingAndSortingRepository的使用(九)
  5. MySQL学习笔记7:基本查询
  6. [转载] 在网页中拖放和停靠div的例子
  7. CG-CTF-Web-单身二十年
  8. 移动端H5页面返回并且刷新页面(BFcache)
  9. 山东大学计算机系统原理,山东大学计算机组成原理三套题汇总
  10. JavaScript数据结构与算法——列表详解(上)