ZeroMQ 教程 002 : 高级技巧 (16)

如果你使用的是SUB类型的socket, 上面两点你都做正确了, 还是有可能收不到消息. 这是因为ZMQ内部的队列在连接建立之后可能还没有初始化完成. 这种情况没什么好的解决办法, 有两个土办法

让消息发送方在同步之后再sleep(1)

如果拓扑允许的话在, 让SUB socket去执行bind操作, 反过来让PUB socket去执行connect操作. 这是ZMQ官方给出的糊屎方法, 我都不知道该怎么吐槽.

如果你使用的是REQ/REP类型的socket, 注意收与发的先后顺序, 顺序错了调用收发包接口会报错, 这个时候如果你忽略掉了报错, 程序的行为会和丢包差不多.

如果你在使用PUSH/PULL类型的socket, 如果你发现消息的分发不是公平的, 那可能是因为在发送消息时, 还有PULL没有与PUSH建立连接, 于是这个PULL就没有位于公平分发的候选人中. 使用PUSH/PULL要特别注意这一点.

如果你在线程间共享了socket句柄, 赶紧改代码, 顺便打自己两巴掌.

如果你使用的是inproc通讯手段, 那么请确保通信的双方创建socket时使用的context是同一个context.

ROUTER socket最能造作. 第三章会看到, ROUTER与DEALER涉及到会话追踪, 如果这部分内容出现异常, 也会类似于数据丢失.

最后, 如果你确实找不到出错的原因, 但就是看不到消息, 请考虑向ZeroMQ 社区提问.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zypgfs.html