C# ZeroMQ非阻塞非排队推送

C# ZeroMQ非阻塞非排队推送,c#,zeromq,C#,Zeromq,我正在为ZeroMQ使用C#包装器,但这似乎更像是ZeroMQ的一个潜在问题 有没有办法在不阻塞和不排队的情况下推送消息?如果服务器未启动,我希望消息能够永久地处理而不被阻塞 以下是我迄今为止尝试过的设置: (一) 发送(阻止发送) 高水位线=0 这(stragely)不会阻塞,但它似乎会在内存中排队,直到连接套接字为止(进程的内存不断增加) (二) 发送(非阻塞发送) 高水位线=1 这是一个比赛条件。如果我连续快速发送两条消息,其中一条消息有时会因为超过上限而被抛出 (三) 轮询套接字以确定它

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

有没有办法在不阻塞和不排队的情况下推送消息?如果服务器未启动,我希望消息能够永久地处理而不被阻塞

以下是我迄今为止尝试过的设置:

(一)

发送(阻止发送)

高水位线=0

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

(二)

发送(非阻塞发送)

高水位线=1

这是一个比赛条件。如果我连续快速发送两条消息,其中一条消息有时会因为超过上限而被抛出

(三)

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

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


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

你似乎只是在找一个酒吧插座。此套接字类型在发送时从不阻塞,并丢弃它无法发送给订阅者的任何消息。请参阅此页:

另一方面,您不需要将此套接字用于“真正的”发布/订阅,您可以通过端点仅具有一个发布和一个子套接字,将其用于两个节点之间的非阻塞通信


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

这显然是消息持久性方面的一个改进。不幸的是,我的系统是这样的,我有多个发送者和一个接收者,这似乎是不兼容的发布/订阅没有很多。很多黑客?实际上,您可以做的是绑定订阅服务器(server),并将所有发布服务器(worker)连接到同一个端点。确保你只在连接完成后才发送消息(否则你可能会丢失一些消息)啊,直到我仔细阅读后才清楚任何一方都可以绑定/连接。这和我上面的2有什么不同?这也没有阻碍。问题是,当我将高水位线设置为低水位线时(我不想建立旧的消息),即使连接了套接字,它也会抛出消息。我目前的解决方案是为每条消息发送一个时间戳,并抛出旧消息(可能是卡在消息队列中的消息)。但我真的不想对每条消息都序列化/反序列化时间戳。在这种情况下,为什么要设置低HWM?(下面我假设类似于您的示例,即如果我理解消息如果不立即接收就会过时,但ZMQ体系结构正在尽可能快地推送它们,即使有一些“排队”在进行(这实际上对您有好处,因为它会批处理消息)。即使使用原始套接字,您可能仍需要检查一些时间戳,以查看消息是否太旧(我在这里假设延迟为毫秒/微秒),因为您无法真正“控制”网络延迟。