【问题标题】:ZMQ PUSH/PULL model: Lost messages when a node PUSHes messages and exitsZMQ PUSH/PULL 模型:节点推送消息并退出时丢失消息
【发布时间】:2011-12-12 14:37:07
【问题描述】:

我有一个 PHP Web 应用程序将消息写入非阻塞队列和其他进程将它们出列的要求。我目前的设计是 PHP 应用程序创建一个 ZMQ.PUSH 套接字,对目标地址执行 connectsend 消息。在目的地,一个进程(Java)创建一个ZMQ.PULL 套接字,在同一地址上执行bindreceive 消息。但是,当 dequeuer 进程关闭(或未启动)时,PHP 应用程序在此期间发送的消息将丢失(当进程在同一地址再次启动时不会传递到 dequeuer)。这是 PHP 应用程序每次创建新的 ZMQ.Context 的问题吗?

例如,我创建了另一个 Java 进程来将消息写入队列。

public static void main(String[] args) {
    ZMQ.Context context = ZMQ.context(1);
    ZMQ.Socket socket = context.socket(ZMQ.PUSH);
    socket.connect("tcp://localhost:5557");

    for(int i = 0; i < 10; i++) {
        socket.send(("Sending : " + message).getBytes(), 0);
    }
}

如果出队过程在上述过程完成时还没有开始,则同样会出现丢失消息的问题。

但是在上述方法体的末尾添加while(true) {} 不会导致任何消息丢失——所有消息都在 dequeuer 启动时传递。那么我是否正确假设被垃圾收集的ZMQ.Context 对象会导致这里出现问题?如果是,那么如何在 PHP Web 应用程序中解决这个问题?因为我不能持久化 ZMQ.Context 对象。

【问题讨论】:

    标签: php message-queue zeromq


    【解决方案1】:

    您正在寻找所谓的 durable 消息。

    查看zmq_setsockopt,尤其是ZMQ_IDENTITY选项,作为解决方案的第一步。

    请务必阅读手册中有关High-Water Marks 的部分,以免在阅读器离线一段时间后落后太多。

    祝你好运

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多