ZeroMQ非阻塞非排队推送

时间:2012-12-11 20:57:54

标签: c# zeromq

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

有没有办法推送邮件而不阻止而不排队?如果服务器没有启动,我希望永久处理这些消息而不会阻塞。

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

1)

发送(阻止发送)

高水位线= 0

这(stragely)不会阻塞,但它似乎在内存中排队,直到套接字连接(内存不断上升为进程)。

2)

发送(非阻止发送)

高水位线= 1

这是竞争条件。如果我快速连续发送两条消息,有时会因超出高水位标记而抛出一条消息。

3)

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

任何高水位线的非阻塞发送都是不可取的,因为一旦服务器重新联机,它就会从客户端收到一堆旧消息。

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

1 个答案:

答案 0 :(得分:6)

你似乎在寻找的只是一个PUB插座。此套接字类型永远不会阻止发送,并丢弃它无法发送给订阅者的任何消息。查看此页面:http://api.zeromq.org/3-2:zmq-socket

另外,您不需要将此套接字用于“真正的”pub / sub,您可以通过端点只有一个PUB和一个SUB套接字来将它用于两个节点之间的非阻塞通信。

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