我要求PHP Web应用程序将消息写入非阻塞队列,而其他进程将消息排队。我目前的设计是PHP应用程序创建一个ZMQ.PUSH
套接字,对目标地址connect
和send
消息。在目标位置,进程(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
对象。
答案 0 :(得分:0)
您正在寻找所谓的 durable 消息。
首先查看zmq_setsockopt ZMQ_IDENTITY 选项,作为解决方案的第一步。
请务必阅读手册中有关High-Water Marks的部分,以便在读者离线一段时间后不会太落后。
祝你好运