2013-04-05 59 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

相关问题