ZMQ PUSH / PULL模型:当节点推送消息并退出时丢失消息

时间:2011-10-21 13:40:34

标签: php message-queue zeromq

我要求PHP Web应用程序将消息写入非阻塞队列,而其他进程将消息排队。我目前的设计是PHP应用程序创建一个ZMQ.PUSH套接字,对目标地址connectsend消息。在目标位置,进程(Java)创建ZMQ.PULL套接字,在同一地址上执行bind并在消息上receive。但是,当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对象。

1 个答案:

答案 0 :(得分:0)

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

首先查看zmq_setsockopt ZMQ_IDENTITY 选项,作为解决方案的第一步。

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

祝你好运