我有一个大型 Python 库,其中包含使用 ZeroMQ 通过队列交换信息的各种进程。我在 AWS EC2 Ubuntu 实例上运行这些进程。
具体来说,我有一个ProcessPub
持续运行的进程,InstanceA
每天一次它会产生一组 3 组消息,这些消息会发布到 3 个不同的队列Q1
、Q2
和Q3
。我还有另一个进程的两个副本ProcessSub
正在运行,InstanceA
另一个进程InstanceB
订阅这 3 个队列,处理传入的消息并将结果(包括摄取的消息)转储到磁盘上的本地文件中。这是我正在观察的:
ProcessSub
'在两者上运行InstanceA
并从发布到和InstanceB
的每个突发中获取所有消息Q1
Q2
ProcessSub
running onInstanceA
获取来自每个突发的所有消息,发布到Q3
除了第一条和最后一条消息ProcessSub
running onInstanceB
获取 NONE 发布到的消息Q3
换句话说,Q1
and在andQ2
上似乎完全可见,而在产生消息的实例上似乎部分可见 ( ) 而在 上完全不可见。InstanceA
InstanceB
Q3
InstanceA
InstanceB
我订阅 3 个队列的ProcessSub
方式是一样的。
如何找出我无法访问Q3
消息的原因?
更新:在ProcessPub
中,我有一段代码为 准备消息Q3
,然后将它们发布到Q3
,然后对Q2
和执行相同操作Q1
。作为一个实验,我通过代码修改,将发布到的块放在发布到Q3
的块之后和块Q2
之前Q1
。在此更改之后,所有 3 个队列都在 上可见InstanceB
。因此,随着每一次活动的爆发,我都会将所有消息发布到所有 3 个队列。但是,我发现了另一个问题。ProcessSub
运行时InstanceA
重定向它们从Q
's 到磁盘上的本地文件。因此,每次发生突发事件时,数据都会以块的形式添加到这些文件中。我注意到,本地文件中缺少来自每个队列的每个突发的第一条消息。我怀疑这与磁盘上任何类型的文件缓冲有关,因为它是每次突发的第一条消息,而不是最后一条。顺便说一句,InstanceB
第一条消息被很好地捕获了。所以仍然存在某种问题(或问题)。