我在haskell中试验一个简单的演员模型,在那里 每个演员:
有些演员是#34;众所周知的",有无限期的生命 因此他们的插座绑定到一个众所周知的端口。其他演员 是短暂的和短暂的,因此需要一个随机的自由端口 分配给他们。
我以前没有意识到zmq3允许绑定的能力 到一个短暂的端口,如下所述: http://api.zeromq.org/3-2:zmq-tcp
因此,对于瞬态演员,我目前有代码尝试 绑定到给定范围内的空闲端口。这适用于 意图,但揭示了导致我的zmq行为 问题:如果一个瞬态演员关闭了它的端口和退出,并且a 新的瞬态演员开始,它可能绑定到同一个端口 旧的那个。在这种情况下任何优秀或 排队等待旧演员的后续消息将被收到 新的。
我该如何避免这种情况?
如果我使用通配符绑定我的瞬态actor套接字 一个系统分配短暂的端口,我还有可能看到 这个问题?
如何使用TCP生成新的唯一PULL套接字 保证与其他运输不同的运输?
答案 0 :(得分:0)
在一般用法中,您仅将bind()
用于稳定的“知名”演员,并将connect()
用于瞬态演员。如果您需要瞬态演员的端口号,这似乎有点奇怪。
另外,也许你应该在你的协议中添加一些东西,以便瞬间离开的演员让对方知道,这样另一方就不会继续向他们发送消息(然后由一个新的瞬态演员接收)绑定到旧端口。
我认为系统分配的临时端口通常不会立即重用端口,因此这也可能解决您的一些问题。