首页 > 代码库 > ZeroMQ中PUB-SUB模式测试

ZeroMQ中PUB-SUB模式测试

    因为公司有需求,对程序模块之间通信效率有较高的需求。之前公司用的通信组件是ActiveMQ,根据网上公布的测试结果显示其效率比较低, 后来考虑准备在新的项目中开始使用ZeroMQ。看了几天发现用起来比较简单,但是不知道怎么用进我们的项目中,加之项目比较着急就搁浅了,转而选择了与socketAPI相近的boost库中的Asio库,因为本人比较菜,最近测试发现了各种坑!!!各种坑!!!(对Asio不熟悉的童鞋对新项目慎用)

    然后最近就又开始看ZeroMQ,发现网上demo程序不少,但是解释清楚的很少,所以在这里记录测试记录,并督促自己有始有终。官网上有很好的demo程序,我就不贴出来了,要注意的是,demo都是最新的Linux版本的,所以源码最好也是下载最新的,windows上编译需要稍微改动。

    ZeroMQ推崇模式编程,第一种请求应答没什么说的。第二种PUB-SUB模式中,服务端没什么,对客户端的配置接口有疑问:

    int zmq_setsockopt (void *s, int option, const void *optval, size_t optvallen);

    参数一:socket句柄;

    参数二:socket的模式,这里因为是客户端,所以是订阅模式:ZMQ_SUBSCRIBE;

    参数三:订阅关键字;

    参数四:参数三的长度;

对于参数三,官方文档:

技术分享

该接口必须显示调用,否则为不订阅,测试结果:
char *filter = (argc > 1) ? argv[1] : "";
rc = zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, filter, strlen(filter));
不过滤,会订阅所有信息;

如果
filter = “test ”;
则订阅以“test ”为开头的信息,中间出现关键字的信息不会接收到,(!!测试中,对于关键字中的空格“ ”,linux完全匹配,windows下不能正确匹配,有待推敲);

到这里PUB-SUB模式在一对多的情景中,可以使用了。那么问题来了,客户端接收机的消息是在哪边开始过滤的呢?ZeroMQ号称最快的消息中间件,猜测不会这么傻的全部接收数据,然后再客户端过滤,测试结果显示也确实如此,直接上结果:

技术分享


通过抓包显示,只有接收到的信息,出现在了抓包结果中,那么效率问题也不用担心了,PUB-SUB模式就可以用起来了,测试后面的多种分布式模式也一样没问题,ZeroMQ赞一个先。











ZeroMQ中PUB-SUB模式测试