Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 只能部分访问发布到ZeroMQ队列的消息_Python_Queue_Zeromq_Subscribe - Fatal编程技术网

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

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

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

具体来说,我有一个进程
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实例只有一个套接字。这意味着在您的情况下,每个进程只有一个套接字。不确定我们是否可以对多个发布队列执行此操作。我们可以将一组队列细分为一个输入流,但当一个进程发布到多个队列时,我们不能这样做。这是因为我们必须区分对应于不同队列的不同输出流。我认为我们用一个插座做不到。还是我错了?