网络上各种各样的通讯中间件/MQ多不胜数。具作者所知,比较有名的有ACE、ICE、Boost::ASIO、MSMQ、ActiveMQ、RabbitMQ、ZeroMQ等等。
其中ACE、ICE是经典,网上资料很丰富,不过入门门槛较高,说白了就是有点难学难精。属于高端大气上档次的货。
Boost::ASIO作为大名鼎鼎的Boost模块之一,感觉很不错,只需引用.hpp文件,不需要动态库,性能据说也不错,跨平台,值得推荐和学习。不过没有最简单只有更简单,当有更好的选择时,Boost::ASIO的语法就略显复杂了。(不过还是强力推荐)。
MSMQ 微软的东西,用起来还可以,不过一般不推荐,毕竟linux下没人会用它。
JSM、ActiveMQ、RabbitMQ、ZeroMQ基本上是一类东西。activemq,基于jms稳定可靠安全。rabbitmq,基于erlang,充分利用并发和分布式特性。zeromq,号称世上最快消息内核。
lActiveMQ
pActiveMQ是Apache开发的开源消息中间件,纯Java实现,基于JMS1.1及J2EE 1.4规范。
lRabbitMQ
pRabbitMQ 是由 LShift 提供的一个 Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的 Erlang 写成,因此也是继承了这些优点。
lZeroMQ
p是由iMatix公司使用C语言开发的高性能消息中间件,是对socket的封装,在发送端缓存消息。

ActiveMQ

RabbitMQ

ZeroMQ

遵循规范

JMS1.1及J2EE1.4

AMPQ

---

架构模型

消息代理架构Broker

消息代理架构Broker

C/S架构

实现语言

Java

Erlang

C/C++

支持消息协议

Stomp

AMPQ、Stomp等

---

主要推动力量

Apache、Redhat

Lshift、Vmware、SpringSource

iMatix

支持编程语言

C,Java,Python

C,Java,Python

C,Java,Python

编程复杂度

复杂

简单

中等

持久化

支持

支持,不支持第三方数据库

发送端缓存

性能

Normal

Normal

High

内存使用率

High

High

Normal

引用自邱志刚的Message oriented middleware analysis,抱歉未找到链接。
下面是一个网上对消息系统的总结,也可以参考以下。

常见开源消息系统

3.最快的消息中间件zeroMQ

ZeroMQ简介
参考1: ?MQ(ZeroMQ)简介
参考2:ZeroMQ研究与应用分析[推荐]
参考3:高性能的通讯库-zeroMQ的几个高性能特征
参考4:ZeroMQ详细教程,从入门到深入,34篇

4.ZeroMQ的C版本nanomsg,更快

为啥又整出个ZeroMQ的C版本呢?
具本人所知,ZeroMQ作者在实现ZeroMQ后,有一天幡然醒悟“如果用C来实现ZeroMQ会不会更快呢?”所以他就用C语言重新实现了ZeroMQ,即nanomsg,目前是alpha2版本。官方网站:http://nanomsg.org/index.html
关于为什么要用C实现zeromq,其实上面是作者的杜撰。具体原因可以参照以下分析:)
为什么我希望用C而不是C++来实现ZeroMQ
为什么我希望用C而不是C++来实现ZeroMQ(第二篇)
从网上的资料来看,nanomsg确实比zeromq更快。

5.ZeorMQ优点,我为什么使用MQ?

1)使用简单,不需要部署服务器什么的,直接编译后作为一个动态库使用;
2)  编程开发简单
以下是zeromq的一个“helloword”示例:
Server

Hello World server in C++// Binds REP socket to tcp://*:5555// Expects "Hello" from client, replies with "World"//#include <zmq.hpp>#include <string>#include <iostream>#ifndef _WIN32#include <unistd.h>#else#include <windows.h>#endifint 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); std::cout << "Received Hello" << std::endl; // Do some 'work'#ifndef _WIN32 sleep(1);#else Sleep (1);#endif // Send reply back to client zmq::message_t reply (5); memcpy ((void *) reply.data (), "World", 5); socket.send (reply); } return 0;}

Client

Hello World client in C++// Connects REQ socket to tcp://localhost:5555// Sends "Hello" to server, expects "World" back//#include <zmq.hpp>#include <string>#include <iostream>int main (){ // Prepare our context and socket zmq::context_t context (1); zmq::socket_t socket (context, ZMQ_REQ); std::cout << "Connecting to hello world server..." << std::endl; socket.connect ("tcp://localhost:5555"); // Do 10 requests, waiting each time for a response for (int request_nbr = 0; request_nbr != 10; request_nbr++) { zmq::message_t request (6); memcpy ((void *) request.data (), "Hello", 5); std::cout << "Sending Hello " << request_nbr << "..." << std::endl; socket.send (request); // Get the reply. zmq::message_t reply; socket.recv (&reply); std::cout << "Received World " << request_nbr << std::endl; } return 0;}

很简单吧。对比其他MQ要么需要部署Server(ActiveMQ,RabbitMQ),要么复杂Boost::ASIO。
作为反面教材,Boost::ASIO中简单的echo-server例子如下:
Server

blocking_tcp_echo_server.cpp// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//#include <cstdlib>#include <iostream>#include <boost/bind.hpp>#include <boost/smart_ptr.hpp>#include <boost/asio.hpp>#include <boost/thread/thread.hpp>using boost::asio::ip::tcp;const int max_length = 1024;typedef boost::shared_ptr<tcp::socket> socket_ptr;void session(socket_ptr sock){ try { for (;;) { char data[max_length]; boost::system::error_code error; size_t length = sock->read_some(boost::asio::buffer(data), error); if (error == boost::asio::error::eof) break; // Connection closed cleanly by peer. else if (error) throw boost::system::system_error(error); // Some other error. boost::asio::write(*sock, boost::asio::buffer(data, length)); } } catch (std::exception& e) { std::cerr << "Exception in thread: " << e.what() << "\n"; }}void server(boost::asio::io_service& io_service, unsigned short port){ tcp::acceptor a(io_service, tcp::endpoint(tcp::v4(), port)); for (;;) { socket_ptr sock(new tcp::socket(io_service)); a.accept(*sock); boost::thread t(boost::bind(session, sock)); }}int main(int argc, char* argv[]){ try { if (argc != 2) { std::cerr << "Usage: blocking_tcp_echo_server <port>\n"; return 1; } boost::asio::io_service io_service; using namespace std; // For atoi. server(io_service, atoi(argv[1])); } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0;}

Client

blocking_tcp_echo_client.cpp// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) Distributed under the Boost Software License, Version 1.0. (See accompanying// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)//#include <cstdlib>#include <cstring>#include <iostream>#include <boost/asio.hpp>using boost::asio::ip::tcp;enum { max_length = 1024 };int main(int argc, char* argv[]){ try { if (argc != 3) { std::cerr << "Usage: blocking_tcp_echo_client <host> <port>\n"; return 1; } boost::asio::io_service io_service; tcp::resolver resolver(io_service); tcp::resolver::query query(tcp::v4(), argv[1], argv[2]); tcp::resolver::iterator iterator = resolver.resolve(query); tcp::socket s(io_service); boost::asio::connect(s, iterator); using namespace std; // For strlen. std::cout << "Enter message: "; char request[max_length]; std::cin.getline(request, max_length); size_t request_length = strlen(request); boost::asio::write(s, boost::asio::buffer(request, request_length)); char reply[max_length]; size_t reply_length = boost::asio::read(s, boost::asio::buffer(reply, request_length)); std::cout << "Reply is: "; std::cout.write(reply, reply_length); std::cout << "\n"; } catch (std::exception& e) { std::cerr << "Exception: " << e.what() << "\n"; } return 0;}

其实Boost算是简单的了,只是有对比才有进步嘛,ZeroMQ的代码仅有一半(不过这似乎说明不了什么问题)。
3)效率高(其实这个不是最重要的,最重要的是1、2)
为了让大伙儿有一个感性的认识,俺特地找来了消息队列软件的性能测评。这是某老外写的一篇帖子(在"这里"),不懂洋文的同学可以看"这里"。连帖子都懒得看的同学,可以直接看下图。

从图中可以明显看出,ZMQ 相比其它几款MQ,简直是鹤立鸡群啊!性能根本不在一个档次嘛。
更多

流行的通讯库/消息中间件相关推荐

  1. 活学活用流行的JavaScript库——《JavaScript实战》

    媒体评论 "本书并不像一本教材,畅读之后,你会觉得它就是一位讲课生动的老师,带领你遨游 JavaScript 海洋,把你推向技术风浪的前沿,同时又给了你一个功能完备的冲浪板,接下来就是你在风 ...

  2. 安卓流行布局开源库_如何使用流行度在开源库之间进行选择

    安卓流行布局开源库 by Ashish Singal 通过Ashish Singal 如何使用流行度在开源库之间进行选择 (How to choose between open source libr ...

  3. C# 串口操作系列(5)--通讯库雏形

    串口是很简单的,编写基于串口的程序也很容易.新手们除了要面对一堆的生僻概念,以及跨线程访问的细节,还有一个需要跨越的难题,就是协议解析,上一篇已经说明了: 一个二进制格式的协议一般包含: 协议头 + ...

  4. Android 须知2019流行的框架库及开发语言

    Android 须知2019流行的框架库及开发语言 导语 2018 已经悄悄的走了,2019 也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来,来规划一下今年要学哪些新技术.这几年优秀Andr ...

  5. 流行的JavaScript库 ——jQuery

    1.为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的 Web2.0 特性的富客 ...

  6. android/iphone/windows/linux声波通讯库

    声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居.医疗设备.工业应用等各个行业有了大力应用的机会. 声波通讯让电脑与手机连通:电脑一般都有音 ...

  7. android/iphone/windows/linux/微信声波通讯库

    声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居.医疗设备.工业应用等各个行业有了大力应用的机会. 声波通讯让电脑与手机连通:电脑一般都有音 ...

  8. 流行的javascript库介绍

    JavaScript简介 JavaScript是为了适应动态网页制作的需要而诞生的一种编程语言.它是由 Netscape公司开发的一种脚本语言(scripting language).JavaScri ...

  9. C# For Q Series Ethernet Communication Library,C#与三菱Q系列PLC以太网通讯库

    C# For MITSUBISHI Q Series PLC Ethernet Communication Library C# 与 三菱 Q 系列PLC以太网通讯库 此通讯库使用简单,支持bool, ...

最新文章

  1. 大学加权平均分计算器_墨尔本大学商学院(MBS)2021研究生、博士、本科、预科录取要求更新...
  2. 成功解决RuntimeWarning: divide by zero encountered in double_scalars
  3. [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
  4. 剑指offer python版 数组中只出现一次的两个数字
  5. 水晶报表设置图片高度与宽度
  6. VMware在NAT模式下配置静态IP
  7. iOS 常用正则表达式一览表
  8. 米克科技 - 全新开发悬赏任务APP系统源码平台
  9. 我市首个湿地公园大连湾前关湿地公园今秋纳客
  10. Fibonacci 斐波那契数列的R语言实现
  11. 【论文简述及翻译】RAFT: Recurrent All-Pairs Field Transforms for Optical Flow(ECCV 2020)
  12. 详细不啰嗦,电脑重装系统win10教程分享
  13. 计算机专业技术个人小结,计算机专业技术个人小结.doc
  14. 2022最新SCI影响因子TOP100榜单
  15. 学期计算机教学工作反思,小学信息技术老师一月工作反思总结教育教学笔记
  16. 1000卡路里计算器_Excel卡路里燃烧计算器
  17. shell 中匹配正则 字符串处理【整理版】
  18. python绘制等值线图_Python/Matplotlib双线性插值等值线图
  19. mysql数据库表中插入中文字段时报错 ‘\xCD\xF5\xBB\xAA‘
  20. python学习笔记:第8天 文件操作

热门文章

  1. Windows 环境下查看 Redis 版本号命令
  2. 计算机操作系统读书笔记___信号量机制
  3. java中兴参与实参相同_java错题集
  4. java 2017技术_2017《Java技术》预备作业 计科1502 李宇蒙
  5. 数字人轻松学习Blender系列之八:建模-6
  6. Redis第 2讲:配置Redis访问密码及端口号
  7. 把一个表格里的数据添加到另一个表格并且去重
  8. android byte[] 清空,android byte的使用
  9. apriori和关联规则算法
  10. Angr Manual