【问题标题】:ZeroMQ is dropping messagesZeroMQ 正在丢弃消息
【发布时间】:2020-10-13 15:27:49
【问题描述】:
我正在使用 ZeroMQ 在多个服务之间进行通信。我遇到了一个问题,我正在发送回复,但他们从未联系到呼叫者。我做了很多调试,无法弄清楚发生了什么。我最终减小了消息大小(我正在返回查询结果)并且消息开始进入。然后我增加了我的 JVM 的内存大小并且原始消息开始返回。
这让我相信消息太大而无法放入内存,ZeroMQ 只是将它们丢弃。我的问题是,我怎样才能正确调试这个? ZeroMQ 是否输出任何日志或内存转储?
我正在使用 Java 版本的 ZeroMQ。
【问题讨论】:
标签:
zeromq
distributed-computing
low-latency
jzmq
【解决方案1】:
Q:“...我怎样才能正确调试这个?”
好吧,如果有人知道原生 ZeroMQ API 设置,至少知道缓冲“机制”和一对{ SNDHWM | RCVHWM }-hard-cut-off 限制,那么可能会进行一些试错测试以确保正常- 调整这些参数。
Q:“ZeroMQ 是否输出任何日志或内存转储?”
嗯,不,本机 ZeroMQ 故意从未尝试过这样做。 ZeroMQ 概念的关键优先级是几乎线性可扩展的性能和 Zen-of-Zero 反射,它排除了任何单个操作,不支持在极简的低延迟信封上实现这一目标。
然而,较新版本的原生 API 提供了一个名为 socket-monitor 的工具。如果需要,这可能会帮助您编写自己的内部套接字事件分析器。
我在 ZeroMQ 的 11 年多来从未让我陷入无法解决的困境。最好了解Context()-instance 和Socket()-instance 参数,这将更好地配置L3、协议相关和O/S 相关的缓冲属性(其中一些不需要存在于java-绑定,但本机 API 以最佳状态显示了 ZeroMQ 数据泵引擎的所有可能和可调整的参数)。