基于ZeroMQ PUB/SUB改造Master/Worker集群实现任务主题感知功能
整体实现思路
你不需要替换原有的REQ/REP结果回传链路,仅需新增一套PUB/SUB的任务分发层即可,核心逻辑完全基于ZeroMQ原生的PUB/SUB前缀匹配规则实现,不依赖任何特定编程语言特性:
- 所有任务新增独立的主题字段,ZeroMQ原生支持SUB端的前缀匹配规则,可直接实现完全匹配、前缀通配、全量接收三种订阅模式
- 原有结果回传链路完全保留,不需要修改现有业务侧的结果上报逻辑
Master端修改点
- 保留原有ROUTER socket接收客户端提交的任务,解析任务的主题字段后,先通过新增的PUB socket(绑定独立端口)发送带主题前缀的任务帧
- 原有DEALER socket保持不变,专门用于接收worker端返回的执行结果,再通过ROUTER回传给对应的请求客户端
- 固定任务帧结构为两部分:第一帧为二进制/字符串格式的主题内容,第二帧为原有的任务序列化数据,和你现有任务格式完全兼容
ZeroMQ的PUB端不需要做任何过滤逻辑,所有过滤规则都在SUB端原生实现,不会额外占用Master侧的计算资源
Worker端修改点
- 新增SUB socket连接Master的PUB端口,启动时根据当前Worker支持的主题调用ZMQ原生的
zmq_setsockopt接口设置ZMQ_SUBSCRIBE参数:- 要监听特定主题直接传入对应主题的字节内容即可
- 要监听所有主题传入空字符串即可
- 要监听前缀匹配的主题传入对应的前缀字符串即可,比如传入
"data_"就能匹配所有以data_开头的主题
- 保留原有REP socket用于回传执行结果,不影响原有结果上报逻辑
- Worker的事件循环改用ZMQ的poll机制同时监听SUB socket的任务事件,以及其他可能的控制事件,收到SUB推送的任务后执行对应逻辑,完成后用原有链路回传结果即可
Client端可选调整
- 提交任务时新增主题字段,Master直接提取该字段作为PUB发送的第一帧即可,其余提交逻辑不需要修改
- 结果接收逻辑完全不变,和原有实现100%兼容
额外说明
如果你需要更复杂的通配符匹配能力(比如中间通配、后缀匹配),可以在Worker侧收到主题帧后自行做匹配过滤,不需要修改Master侧的任何逻辑。如果需要同主题的任务做负载均衡而非广播给所有订阅Worker,可以在Master侧针对每个主题维护独立的任务队列,结合PUB/SUB的订阅通知实现定向分发即可。
内容的提问来源于stack exchange,提问作者Homunculus Reticulli
相关产品推荐
相关产品推荐

