只能部分访问发布到ZeroMQ队列的消息

时间:2013-12-16 18:33:24

标签: python queue zeromq subscribe

我有一个庞大的Python库,各种进程使用ZeroMQ通过队列交换信息。我正在AWS EC2 Ubuntu实例上运行这些进程。

具体来说,我有一个在ProcessPub上不断运行的流程InstanceA,每天生成一组3组消息,这些消息将发布到3个不同的队列Q1,{ {1}}和Q2。我还有Q3上运行的另一个进程ProcessSub和另一个InstanceA的两个副本,它们订阅这3个队列,处理传入的消息并将结果(包括摄取的消息)转储到本地文件中在磁盘上。这是我观察的内容:

  1. InstanceB同时在ProcessSubInstanceA上运行,发送到InstanceBQ1
  2. 的每个爆发的所有邮件 在Q2上运行的
  3. ProcessSub会将发布的所有消息发送到InstanceA除了第一条和最后一条消息
  4. Q3上运行的
  5. ProcessSub无法发布到InstanceB
  6. 的消息

    换句话说,Q3Q1似乎在Q2InstanceA上完全可见,而InstanceB似乎在部分可见消息生成的实例(Q3),InstanceA完全不可见。

    我订阅InstanceB中的3个队列的方式是相同的。

    如何弄清楚访问ProcessSub消息时遇到问题的原因?

    更新:在Q3中,我有一段代码,用于为ProcessPub准备消息,然后将其发布到Q3,然后对Q3执行相同的操作{ {1}}。作为一项实验,我通过将发布的块放在发布到Q2的块之后和Q1块之前的Q3来修改代码。完成此更改后,Q2上显示所有3个队列。因此,对于每一次活动,我都会将所有消息发布到所有3个队列。但是,我发现了另一个问题。 Q1上运行的InstanceB会将从ProcessSub捕获的所有邮件重定向到磁盘上的本地文件。因此,每次发生突发时,数据都会以块的形式添加到这些文件中。我注意到的是,本地文件中缺少来自每个队列的每个突发的第一条消息。我怀疑这与磁盘上任何类型的文件缓冲有关,因为它是每个突发的第一个消息,而不是最后一个。顺便说一句,在InstanceA上,第一封邮件被捕获得很好。所以仍然存在某种问题(或问题)。

1 个答案:

答案 0 :(得分:0)

在评论中,您说“我认为单独的套接字”。我想这可能是你问题的原因。根据{{​​3}},你应该只为每个ZMQ实例打开1个套接字,而不是每个PUB / SUB队列打开1个套接字。