2

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

具体来说,我有一个ProcessPub持续运行的进程,InstanceA每天一次它会产生一组 3 组消息,这些消息会发布到 3 个不同的队列Q1Q2Q3。我还有另一个进程的两个副本ProcessSub正在运行,InstanceA另一个进程InstanceB订阅这 3 个队列,处理传入的消息并将结果(包括摄取的消息)转储到磁盘上的本地文件中。这是我正在观察的:

  1. ProcessSub'在两者上运行InstanceA并从发布到和InstanceB的每个突发中获取所有消息Q1Q2
  2. ProcessSubrunning onInstanceA获取来自每个突发的所有消息,发布到Q3除了第一条和最后一条消息
  3. ProcessSubrunning onInstanceB获取 NONE 发布到的消息Q3

换句话说,Q1and在andQ2上似乎完全可见,而在产生消息的实例上似乎部分可见 ( ) 而在 上完全不可见。InstanceAInstanceBQ3InstanceAInstanceB

我订阅 3 个队列的ProcessSub方式是一样的。

如何找出我无法访问Q3消息的原因?

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

4

1 回答 1

0

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

于 2013-12-18T02:26:04.343 回答