我正在使用 C# NetMQ 库。我使用 Service Fabric 有状态服务在 Azure 中部署了生产者和消费者服务。我对两个服务进行了分区,以便每个服务都有两个实例。
生产者实例各自创建一个PublisherSocket
并调用Bind
。第一个绑定到 (eg) tcp://10.0.0.1:9501
,第二个绑定到tcp://10.0.0.2:9502
. (端口保持唯一,因为 SF 可能会重新平衡两个实例以在同一物理节点上运行。)
他们发布到一些任意主题(与这个问题无关)。(我用几帧数据调用SendMultipartMessage
并传递它。)NetMQMessage
消费者实例各自创建一个SubscriberSocket
和调用Connect
。它们每个都连接到两个生产者地址。然后他们调用Subscribe
并传递一个空字符串""
作为主题。这应该会导致他们使用任一生产者发送的所有消息。
预期成绩:
- 两个生产者绑定,两个消费者连接/订阅。
- Producer1 发送消息 A,Producer2 发送消息 B。
- Consumer1 同时接收 A 和 B。
- Consumer2 同时接收 A 和 B。
本地 SF 集群上的实际结果:一切都符合预期。两个消费者都收到来自两个生产者的所有消息。
在 Azure 上运行的 SF 集群的实际结果:
- 绑定/连接/订阅都发生,没有异常或明显错误。
- 生产者发送消息没有错误。
- 两个消费者都从 Producer1 接收消息。
- 两个消费者都没有收到来自 Producer2 的消息。
笔记:
- 生产处于循环中,所以这不是一些奇怪的启动问题。
- 增加生产者/消费者的数量(例如每个 5 个实例)导致第一个生产者的消息总是被消费,然后其他生产者的一些消息被消费。大约一半的消息被消耗,但我看不到任何明显的模式。
问题:
- 在 Azure 中运行的 Service Fabric 群集与 ZeroMQ 的组合是否会导致 ZeroMQ 问题?
- 我应该设置任何 ZeroMQ 套接字选项吗?
- SF中有什么我可以改变的吗?
任何想法表示赞赏。