2013-12-16 54 views
2

我有一個大型Python庫,各種進程通過使用ZeroMQ的隊列交換信息。我正在AWS EC2 Ubuntu實例上運行這些進程。只能部分訪問發佈到ZeroMQ隊列的消息

具體而言,我有一個過程ProcessPub即不斷運行在InstanceA和每天一次它產生的3個消息集是那些獲得發佈到3個不同的隊列Q1Q2,和Q3突發。我還有另一個ProcessSubProcessSub兩個副本,它們在InstanceA上運行,另一個InstanceB訂閱這3個隊列,處理傳入的消息並將結果(包括所攝入的消息)轉儲到磁盤上的本地文件中。下面是我觀察:

  1. ProcessSub的兩個InstanceAInstanceB運行得到每一個突發發佈到Q1Q2
  2. ProcessSubInstanceA運行會從每一個所有消息突發發佈到Q3除了所有消息第一個和最後一個消息
  3. ProcessSubInstanceB上運行獲取NONE消息發佈到Q3

換言之,Q1Q2似乎是在兩個InstanceAInstanceB完美可見的,而Q3似乎是在消息獲取所產生的實例(InstanceA)和InstanceB完全看不見部分可見。

我訂閱ProcessSub的3個隊列的方式是一樣的。

我如何知道爲什麼我無法訪問Q3消息?

更新:在ProcessPub,我的,對於Q3準備消息的代碼的塊,然後將它們發佈到Q3,然後用不與Q2Q1相同。作爲實驗,我通過將發佈到Q3的塊放在發佈到Q2Q1塊之前的塊之後進行了修改。在此更改之後,所有3個隊列在InstanceB上可見。因此,在每一次活動中,我都會將所有消息發佈到所有3個隊列中。但是,我發現了另一個問題。在InstanceA上運行的ProcessSub將所有從Q中捕獲的消息重定向到磁盤上的本地文件。所以每當出現爆發時,數據就會以大塊的形式添加到這些文件中。我注意到來自每個隊列的每個突發的第一條消息在本地文件中丟失。我懷疑這與緩衝磁盤上的文件有什麼關係,因爲它是每個爆發的第一個消息,而不是最後一個。順便說一句,在InstanceB第一條消息被捕獲罰款。所以還是有一些問題(或問題)。

+0

聞起來像某些東西沒有足夠快地連接到Q3。所有三個隊列是否在同一個ømq套接字上發佈? –

+0

我覺得單獨的套接字。順便說一下,我在'InstanceB'上運行了'netstat'。對於'Q1'和'Q2',我得到了'tcp ... ESTABLISHED',對於'Q3'我得到了'tcp ... CLOSE_WAIT'。這是否能夠照亮問題? –

+0

我可以在任一實例上使用'netstat'來獲得一些額外的信息嗎?我應該使用哪些選項? –

回答

0

在評論中你說「我覺得單獨的套接字」。我認爲這可能是你的問題的原因。根據ZeroMQ documentation,你應該只能爲每個ZMQ實例打開1個套接字,而不是每個PUB/SUB隊列1個套接字。

+0

這是否意味着如果我有多個進程在給定的實例上運行,哪個子/ pub到不同的隊列,我必須爲它們全部擁有一個套接字? –

+0

每個ZMQ實例不需要一個套接字。這意味着您的情況下每個進程只有一個套接字。 –

+0

不確定我們可以爲多個PUB隊列執行此操作。我們可以將SUB隊列作爲基本上一個輸入流,但是當單個進程發佈到多個隊列時,我們不能這樣做。這是因爲我們必須區分對應於不同隊列的不同輸出流。我不認爲我們可以用一個插座來完成。或者我錯了? –

相關問題