流行的通讯库/消息中间件
网络上各种各样的通讯中间件/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,简直是鹤立鸡群啊!性能根本不在一个档次嘛。
更多
流行的通讯库/消息中间件相关推荐
- 活学活用流行的JavaScript库——《JavaScript实战》
媒体评论 "本书并不像一本教材,畅读之后,你会觉得它就是一位讲课生动的老师,带领你遨游 JavaScript 海洋,把你推向技术风浪的前沿,同时又给了你一个功能完备的冲浪板,接下来就是你在风 ...
- 安卓流行布局开源库_如何使用流行度在开源库之间进行选择
安卓流行布局开源库 by Ashish Singal 通过Ashish Singal 如何使用流行度在开源库之间进行选择 (How to choose between open source libr ...
- C# 串口操作系列(5)--通讯库雏形
串口是很简单的,编写基于串口的程序也很容易.新手们除了要面对一堆的生僻概念,以及跨线程访问的细节,还有一个需要跨越的难题,就是协议解析,上一篇已经说明了: 一个二进制格式的协议一般包含: 协议头 + ...
- Android 须知2019流行的框架库及开发语言
Android 须知2019流行的框架库及开发语言 导语 2018 已经悄悄的走了,2019 也已经匆匆的来了,我们在总结过去的同时,也要展望一下未来,来规划一下今年要学哪些新技术.这几年优秀Andr ...
- 流行的JavaScript库 ——jQuery
1.为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度交互的 Web2.0 特性的富客 ...
- android/iphone/windows/linux声波通讯库
声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居.医疗设备.工业应用等各个行业有了大力应用的机会. 声波通讯让电脑与手机连通:电脑一般都有音 ...
- android/iphone/windows/linux/微信声波通讯库
声波通讯让传统的各种linux设备,单片机设备等等能编程的设备与智能手机之间有了数据传输的能力,这在智能家居.医疗设备.工业应用等各个行业有了大力应用的机会. 声波通讯让电脑与手机连通:电脑一般都有音 ...
- 流行的javascript库介绍
JavaScript简介 JavaScript是为了适应动态网页制作的需要而诞生的一种编程语言.它是由 Netscape公司开发的一种脚本语言(scripting language).JavaScri ...
- C# For Q Series Ethernet Communication Library,C#与三菱Q系列PLC以太网通讯库
C# For MITSUBISHI Q Series PLC Ethernet Communication Library C# 与 三菱 Q 系列PLC以太网通讯库 此通讯库使用简单,支持bool, ...
最新文章
- 大学加权平均分计算器_墨尔本大学商学院(MBS)2021研究生、博士、本科、预科录取要求更新...
- 成功解决RuntimeWarning: divide by zero encountered in double_scalars
- [Hei-Ocelot-Gateway ].Net Core Api网关Ocelot的开箱即用版本
- 剑指offer python版 数组中只出现一次的两个数字
- 水晶报表设置图片高度与宽度
- VMware在NAT模式下配置静态IP
- iOS 常用正则表达式一览表
- 米克科技 - 全新开发悬赏任务APP系统源码平台
- 我市首个湿地公园大连湾前关湿地公园今秋纳客
- Fibonacci 斐波那契数列的R语言实现
- 【论文简述及翻译】RAFT: Recurrent All-Pairs Field Transforms for Optical Flow(ECCV 2020)
- 详细不啰嗦,电脑重装系统win10教程分享
- 计算机专业技术个人小结,计算机专业技术个人小结.doc
- 2022最新SCI影响因子TOP100榜单
- 学期计算机教学工作反思,小学信息技术老师一月工作反思总结教育教学笔记
- 1000卡路里计算器_Excel卡路里燃烧计算器
- shell 中匹配正则 字符串处理【整理版】
- python绘制等值线图_Python/Matplotlib双线性插值等值线图
- mysql数据库表中插入中文字段时报错 ‘\xCD\xF5\xBB\xAA‘
- python学习笔记:第8天 文件操作