3

我正在使用 ZeroMQ 的 C# 包装器,但这似乎更像是 ZeroMQ 的一个潜在问题。

有什么方法可以在不阻塞不排队的情况下推送消息?如果服务器未启动,我希望将消息永久处理而不会阻塞。

以下是我到目前为止尝试过的设置:

1)

发送(阻止发送)

高水位线 = 0

这(奇怪地)并没有阻塞,但它似乎在内存中排队,直到套接字连接(内存不断增加进程)。

2)

发送(非阻塞发送)

高水位线 = 1

这是一个竞争条件。如果我快速连续发送两条消息,则有时会因为超过高水位线而丢弃一条消息。

3)

轮询套接字以确定它是否会阻塞。这并没有真正帮助,因为我仍然必须在队列开始阻塞之前将一条(旧)消息放入队列中(如果我设置 HWM = 1)。

具有任何高水位标记的非阻塞发送是不可取的,因为一旦服务器恢复联机,它就会从客户端收到一堆旧消息。

阻止发送不起作用,因为我不想阻止。

4

1 回答 1

7

您似乎正在寻找的只是一个 PUB 插座。此套接字类型在发送时从不阻塞,并丢弃它无法发送给订阅者的任何消息。请参阅此页面:http ://api.zeromq.org/3-2:zmq-socket 。

附带说明一下,您不需要将此套接字用于“真正的”发布/订阅,您可以通过端点只有一个 PUB 和一个 SUB 套接字,将其用于两个节点之间的非阻塞通信。

您的服务器在重新连接后不会收到“旧”消息,因为 PUB 套接字将丢弃在服务器断开连接时无法发送的消息。尽管如此,我相信虽然您无法避免一些内部 ZMQ“排队”,但它应该对您的用例影响不大。

于 2012-12-12T06:59:53.943 回答