如何在ZeroMQ中进行即发即弃的客户端服务器调用?

时间:2017-02-07 13:07:33

标签: zeromq

我想调用服务器而无需等待回复。在我的案例中,回复根本不重要。所以这是一种即发即弃的电话。文档似乎没有一个简单,直接的答案。它有一个复杂的拓扑结构,用于"完全异步" REQ-REP 以及其他地方暗示 DEALER-ROUTER 模式可能会有所帮助。我认为这很简单,ZeroMQ应该能够开箱即用而无需打开太多端口,在拓扑中创建超过2层并引入任何额外的延迟。我读到另一个关于超时的地方,并考虑设置为0,但我不知道在超时后到达的消息会发生什么。另一个示例代码here

//  Asynchronous client-to-server (DEALER to ROUTER)
    ...
//  This is our client task
//  It connects to the server, and then sends a request once per second
//  It collects responses as they arrive, and it prints them out. We will
//  run several client tasks in parallel, each with a different random ID.
    ...

接近,但仍然看起来客户端必须保持轮询响应或队列将超出绑定。我只是想做简单的纯粹和快速的火灾而忘记打电话。

实现这一目标的最简单方法是什么?

2 个答案:

答案 0 :(得分:3)

你可以试试这个。 一方创建消息通道(使用绑定操作)。它是接收器

另一方将消息发送到频道。这是发件人

我们有两个选择:

  1. Receiver 正在“内部”累积新消息并正在处理这些消息;
  2. 发件人可用。 Receiver 不是。 Sender 正在“内部”累积消息。当 Receiver 将启动时,ZeroMq将发送 Receiver 侧的所有消息。现在 Receiver 正在“内部”累积旧消息和新消息并正在处理这些消息。
  3. 发信人:

    void* senderSocket = zmq_socket(context, ZMQ_PUSH);
    zmq_connect(senderSocket, "...");
    ...
    zmq_msg_send(&zmqMessage, senderSocket, 0);
    

    接收器:

    void* pullSocket = zmq_socket(context, ZMQ_PULL);
    zmq_bind(pullSocket, "...");
    ...
    zmq_msg_recv(&message, pullSocket, 0);
    

答案 1 :(得分:1)

  

实现 最简单方式是什么?

缩放?
缩放规则!

对于低数量的客户和低密度的TPS:
- 可以使用(客户端) PUSH - archetype + PULL -archetype(服务器端)+检查循环服务逻辑+ RX缓冲区的正确HWM设置



- 可以使用(独家) PAIR-PAIR 正式通信模式,其中每个客户端可以使用它的独奏连接,在服务器端以非阻塞模式进行集中轮询,以实现快速recv()检测

对于更高的计数或未管理的客户群:
- 可以在服务器端享受客户端+ PUB -archetype SUB -archetype的单向形式通信模式,非限制性地订阅了这样的中心topic - 过滤器中的所有主题。