ZeroMQ PUB/SUB模式高低流量主题及主题级消息丢弃策略设置问题
ZeroMQ PUB/SUB模式差异化消息可靠性场景方案梳理
问题背景
使用ZeroMQ的PUB/SUB模式时存在一类共性问题:发布端同时对外发布高流量和低流量两类主题的消息,其中高频率高流量主题在订阅端或网络拥堵时允许丢消息,但低频率低流量主题的消息不允许被丢弃。
现有调研方案及缺陷
- 发布端设置无界队列:该方案虽能暂存消息,但高流量主题消息发送速率过快可能导致内存溢出,无法实现高流量主题可丢弃、低流量主题优先保障的需求。
- 为高流量主题或全量主题单独配置PUB socket:结合ZeroMQ的队列模型,发布端与订阅端的每个连接都对应独立队列,该方案可避免低流量主题消息被高流量主题挤占丢弃,但会大幅提升订阅端复杂度:订阅端需要提前掌握端口与主题的映射关系,或向发布端请求索引映射,同时要求端口固定,或每次出现连接异常时都要校验索引是否发生变更。
- 按连接维度在发布端、订阅端单独维护主题队列:当前唯一可自研实现的方案是在底层库中封装逻辑,为每个订阅者+每个主题在发布端和订阅端分别维护独立队列,特定主题队列溢出时仅丢弃该主题的消息,不会影响其他主题的消息传输;同时需要额外维护有序字典,管控工作进程向PUB socket喂入消息、或订阅端拉取事件的顺序。该方案需要通过
ZMQ_XPUB_NODROP参数感知发布端ZeroMQ队列的静默丢包状态,避免发送大概率会丢失的消息,但该方案实现复杂度较高,若使用Python开发性能可能达不到预期,且这类能力本应是消息通信库原生支持的特性。
内容的提问来源于stack exchange,提问作者steve
相关产品推荐
相关产品推荐

