ZeroMQ非阻塞非排队推送

ado*_*out 2 c# zeromq

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

有没有办法在没有阻塞没有排队的情况下推送消息?如果服务器没有启动,我希望永久处理这些消息而不会阻塞.

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

1)

发送(阻止发送)

高水位线= 0

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

2)

发送(非阻止发送)

高水位= 1

这是竞争条件.如果我快速连续发送两条消息,有时会抛出一条消息,因为超过了高水位线.

3)

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

具有任何高水位标记的非阻塞发送是不合需要的,因为一旦服务器重新联机,它就会从客户端获得一堆旧消息.

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

JJ1*_*15k 6

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

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

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

  • 很多黑客?并非如此,您可以做的是绑定订阅者(服务器),并将所有发布者(工作人员)连接到同一个端点。确保你只在连接完成后发送消息(否则你可能会丢失一些) (2认同)