【发布时间】:2011-12-12 14:37:07
【问题描述】:
我有一个 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 对象。
【问题讨论】:
标签: php message-queue zeromq