zmq的庫的資料太過豐富。爲了不誤人子弟,還是將諸位引導到最權威的zmq作者的項目主頁吧。自行github,不送。
我只說明一點,zmq的作者後面用c語言重寫了zmq,新的庫叫nanomsg。
相比zmq(2.0),nanomsg有不少優勢,其一,sub/pub過濾是在pub方處理,zmq是sub方過濾(減少流量)。其二,nanomsg用的epoll。
如果業務非常確定只涉及C/C++以及python,則可以放心採用nanomsg,否則,不用考慮,選ZMQ是不二隻選。
ZMQ 的官方sample有一些bug,特別是兼容C++ 11的時候,官方的一些寫法是編譯不過的。
例如ZMQ的代理相關的例子,MQ的代理。
//
// Simple message queuing broker in C++
// Same as request-reply broker but using QUEUE device
//
// Olivier Chamoux <[email protected]>
#include "zhelpers.hpp"
int main (int argc, char *argv[])
{
zmq::context_t context(1);
// Socket facing clients
zmq::socket_t frontend (context, ZMQ_ROUTER);
frontend.bind("tcp://*:5559");
// Socket facing services
zmq::socket_t backend (context, ZMQ_DEALER);
backend.bind("tcp://*:5560");
// Start the proxy
zmq::proxy(frontend, backend, nullptr); //error
return 0;
}
上述代碼在C++ 98標準中可以編譯通過(代碼作者聲明的說法),C++ 11中則會報錯。
轉去看看看報錯的行的
inline void proxy (void *frontend, void *backend, void *capture)
{
int rc = zmq_proxy (frontend, backend, capture);
if (rc != 0)
throw error_t ();
}
我們看看zmq_proxy的定義
ZMQ_EXPORT int zmq_proxy (void *frontend, void *backend, void *capture);
接受的是指針類型,傳入類的對象實際上是不妥的,嚴格一點的編譯檢查,縱使是C++ 98標準按道理也是不能編譯通過的。
另外需要注意的是,別看到接收的是指針就試圖通過取地址做參數,強制轉換編譯通不過。
int rc = zmq_proxy (&frontend, &backend, capture); //error
https://github.com/nanomsg/nanomsg
nanomsg的幾種常見模式如下官方文檔,十分推薦,這是分佈式消息的精華。很想轉載這篇博客。。還是忍住了。
http://tim.dysinger.net/posts/2013-09-16-getting-started-with-nanomsg.html