Python 只能部分访问发布到ZeroMQ队列的消息
我有一个大型Python库,其中包含使用ZeroMQ通过队列交换信息的各种进程。我正在AWS EC2 Ubuntu实例上运行这些进程 具体来说,我有一个进程Python 只能部分访问发布到ZeroMQ队列的消息,python,queue,zeromq,subscribe,Python,Queue,Zeromq,Subscribe,我有一个大型Python库,其中包含使用ZeroMQ通过队列交换信息的各种进程。我正在AWS EC2 Ubuntu实例上运行这些进程 具体来说,我有一个进程ProcessPub,它在InstanceA上不断运行,每天产生一次突发的3组消息,这些消息被发布到3个不同的队列Q1、Q2和Q3。我还有另一个进程ProcessSub的两个副本,运行在InstanceA上,另一个InstanceB订阅这3个队列,处理传入消息并将结果(包括接收的消息)转储到磁盘上的本地文件中。以下是我观察到的情况: Proc
ProcessPub
,它在InstanceA
上不断运行,每天产生一次突发的3组消息,这些消息被发布到3个不同的队列Q1
、Q2
和Q3
。我还有另一个进程ProcessSub
的两个副本,运行在InstanceA
上,另一个InstanceB
订阅这3个队列,处理传入消息并将结果(包括接收的消息)转储到磁盘上的本地文件中。以下是我观察到的情况:
ProcessSub
在InstanceA
和InstanceB
上运行,从发布到Q1
和Q2
的每个突发中获取所有消息ProcessSub
在InstanceA上运行
获取发布到Q3
的每个突发中的所有消息,但第一条和最后一条消息除外ProcessSub
在InstanceB上运行
不会获取发布到Q3
Q1
和Q2
似乎在InstanceA
和InstanceB
上完全可见,而Q3
似乎在生成消息的实例(InstanceA
)上部分可见,在InstanceB
上完全不可见
我订阅ProcessSub
中的3个队列的方式是相同的
我如何找出访问Q3
消息时遇到问题的原因
更新:在
ProcessPub
中,我有一个代码块为Q3
准备消息,然后将它们发布到Q3
,然后对Q2
和Q1
执行相同的操作。作为一个实验,我通过代码修改,将发布到Q3
的块放在发布到Q2
的块之后,Q1
块之前。更改后,所有3个队列都在InstanceB
上可见。因此,每次活动爆发时,我都会将所有消息发布到所有3个队列中。但是,我发现了另一个问题。在InstanceA上运行的ProcessSub
将从Q
捕获的所有消息重定向到磁盘上的本地文件。因此,每次爆发时,数据都会以块的形式添加到这些文件中。我注意到,来自每个队列的每个突发的第一条消息在本地文件中丢失。我怀疑这与磁盘上的任何文件缓冲有关,因为它是每次突发的第一条消息,而不是最后一条。顺便说一下,在InstanceB
上,第一条消息被很好地捕获。所以仍然存在一些问题。在评论中,你说“我认为是单独的套接字”。我想这可能是你问题的原因。根据协议,每个ZMQ实例应该只打开一个套接字,而不是每个发布/订阅队列打开一个套接字。闻起来第三季度的连接速度不够快。三个队列是否都在同一个ømq套接字上发布?我认为是单独的套接字。顺便说一下,我在InstanceB
上运行了netstat
。对于Q1
和Q2
我得到了tcp。。。已建立
,用于第三季度
我获得了tcp。。。关闭\u等待。这能说明问题吗?我能在任一实例上使用netstat
来获取更多信息吗?我应该使用什么选项?这是否意味着,如果我在给定实例上运行多个进程,哪个sub/pub到不同的队列,我必须为所有这些进程都使用一个套接字?不是每个ZMQ实例只有一个套接字。这意味着在您的情况下,每个进程只有一个套接字。不确定我们是否可以对多个发布队列执行此操作。我们可以将一组队列细分为一个输入流,但当一个进程发布到多个队列时,我们不能这样做。这是因为我们必须区分对应于不同队列的不同输出流。我认为我们用一个插座做不到。还是我错了?