我有一个庞大的Python库,各种进程使用ZeroMQ通过队列交换信息。我正在AWS EC2 Ubuntu实例上运行这些进程。
具体来说,我有一个在ProcessPub
上不断运行的流程InstanceA
,每天生成一组3组消息,这些消息将发布到3个不同的队列Q1
,{ {1}}和Q2
。我还有Q3
上运行的另一个进程ProcessSub
和另一个InstanceA
的两个副本,它们订阅这3个队列,处理传入的消息并将结果(包括摄取的消息)转储到本地文件中在磁盘上。这是我观察的内容:
InstanceB
同时在ProcessSub
和InstanceA
上运行,发送到InstanceB
和Q1
Q2
上运行的ProcessSub
会将发布的所有消息发送到InstanceA
除了第一条和最后一条消息Q3
上运行的ProcessSub
无法发布到InstanceB
换句话说,Q3
和Q1
似乎在Q2
和InstanceA
上完全可见,而InstanceB
似乎在部分可见消息生成的实例(Q3
),InstanceA
完全不可见。
我订阅InstanceB
中的3个队列的方式是相同的。
如何弄清楚访问ProcessSub
消息时遇到问题的原因?
更新:在Q3
中,我有一段代码,用于为ProcessPub
准备消息,然后将其发布到Q3
,然后对Q3
执行相同的操作{ {1}}。作为一项实验,我通过将发布的块放在发布到Q2
的块之后和Q1
块之前的Q3
来修改代码。完成此更改后,Q2
上显示所有3个队列。因此,对于每一次活动,我都会将所有消息发布到所有3个队列。但是,我发现了另一个问题。 Q1
上运行的InstanceB
会将从ProcessSub
捕获的所有邮件重定向到磁盘上的本地文件。因此,每次发生突发时,数据都会以块的形式添加到这些文件中。我注意到的是,本地文件中缺少来自每个队列的每个突发的第一条消息。我怀疑这与磁盘上任何类型的文件缓冲有关,因为它是每个突发的第一个消息,而不是最后一个。顺便说一句,在InstanceA
上,第一封邮件被捕获得很好。所以仍然存在某种问题(或问题)。
答案 0 :(得分:0)
在评论中,您说“我认为单独的套接字”。我想这可能是你问题的原因。根据{{3}},你应该只为每个ZMQ实例打开1个套接字,而不是每个PUB / SUB队列打开1个套接字。