2013-04-05 77 views
0

我在哈斯克爾簡單的角色模型,其中 每個演員試驗:如何在zeromq中創建一個「唯一」套接字?

  • 是一個Haskell線程
  • 具有其所接收消息

有些演員一zeroMQ PULL插座是「衆所周知的」,具有無限的生存期,因此它們的套接字綁定到一個衆所周知的端口。其他演員 是短暫的和短暫的,因此需要分配給他們的隨機自由端口 。

我以前不知道的zmq3的,允許結合 到一個臨時端口的能力,如下所述: http://api.zeromq.org/3-2:zmq-tcp

因此,對於短暫的演員我現在有試圖 代碼綁定到一個自由港在給定的範圍內。這適用於 ,但是會帶來一個zmq行爲,這會導致我產生以下問題:如果瞬間演員關閉它的端口並退出,並且新的瞬態演員啓動,那麼它可能會綁定到與舊演員相同的端口 。在這種情況下,任何未完成或後續排隊等待舊演員的消息將被 接收到新消息。

我怎樣才能避免這種情況?

如果我使用通配符綁定我的瞬態演員套接字以獲得 系統分配的臨時端口,我是否仍然可能會看到 這個問題?

如何使用TCP 傳輸方式生成一個新的唯一PULL套接字,並保證與其他傳輸方式不同?

回答

0

在一般用法中,僅對穩定的「知名」演員使用bind(),而對瞬態演員使用connect()。如果你需要瞬態演員的端口號,這似乎有點奇怪。

另外,也許你應該在你的協議中添加一些東西,這樣暫時離開的演員會讓對方知道,這樣對方就不會繼續向他們發送消息(然後由一個新的瞬態接收消息演員綁定到與舊的端口相同的端口)。

我認爲系統分配的臨時端口通常不會立即重用端口,這樣可能也會解決一些問題。

+0

_IN一般用法,你只能使用穩定的bind(),「衆所周知」的演員,而你使用connect()瞬態actors_ 瞬態演員仍然需要提供一個地址到其他 參與者可以發送郵件。它不知道這些將是誰,所以 沒有任何「連接」。 我想我所說的是,我期望連接()到我發送消息的 。這可能來自「知名」演員 到瞬態,反之亦然。 – timbod 2013-04-05 10:26:52

+0

你的建築對我來說聽起來很奇怪。如果其他演員需要知道暫時演員的地址,則必須將該地址傳遞給其他演員。無論是與其他演員有一些穩定的地址,以便您可以通過ZeroMQ給他們新的地址(在這種情況下,你不需要向他們發送地址,因爲你可以建立從瞬態演員側面的連接),或者你有一個帶外連接(在這種情況下,爲什麼使用ZeroMQ?)。請記住,在ZeroMQ中,PUSH與PULL和connect vs bind是正交的。 – djc 2013-04-05 11:08:16

+0

它似乎並不怪我:-)你不需要帶外 連接。考慮這種情況:在短暫的演員將在用戶的PC上運行,啓動和停止要求 - 如果他們綁定到一個 地址,他們需要臨時端口。他們會通過知名的位置服務發現對方,但直接連接。因此,對於每對需要通信的瞬態過程,一方必須綁定到一個地址。 – timbod 2013-04-06 05:28:17

相關問題