如何使用 NetMQ 从服务器向客户端发送 ACK 消息

How to send ACK message to client from server using NetMQ

我正在使用 NetMQ 将来自许多客户端的消息发送到接收消息并处理它们的服务器。如果我使用 pub/sub 模式,我可以(ab)使用订户套接字并将其用于服务器和客户端出版商(相反的流程,不是吗?)。但是,我无法向客户发送确认消息。

如果我使用 REQ/RESP 模式,我可以使用服务器的响应套接字,甚至可以发送客户端可以接收的确认消息。但是,如果服务器错过了来自客户端的消息,我将无法重新发送消息(在等待 timespan 之后),因为我收到异常

Req.XSend - cannot send another request

-- 即使在断开客户端套接字并关闭它之后(服务器套接字会跟踪它)。

最后,根据文档,我不确定 Dealer/Router 是否是正确的模式。因为我很确定我陷入了一种非常普遍的情况,是否有任何模式可以使用 NetMQ 实现这种情况?

您遇到了一个非常常见的问题,在 0MQ 中通常称为 "Reliable Request-Reply"。

guide中描述了几种方法,第一种是"lazy pirate"。在其中,您使用描述的 REQ/RESP 套接字对(尽管 REQ/ROUTER 也可以工作,并且可能对多个客户端更好)。如果您的 ACK 超时并创建一个新的,解决方案是处理套接字。

该指南确实指出,将 DEALER 换成 REQ 可以解决问题,但增加了必须自己跟踪信封的内容。除非您出于其他原因需要在客户端异步 send/receive,否则我会听从他们的建议并坚持使用 REQ/ROUTER.

可以在 GitHub 上找到此模式的示例实现:https://github.com/NetMQ/Samples/tree/master/src/Pirate%20Pattern