Модель ZMQ PUSH / PULL: Потерянные сообщения, когда узел PUSHes сообщения и выход - PullRequest
0 голосов
/ 21 октября 2011

У меня есть требование, чтобы веб-приложение PHP записывало сообщения в неблокирующую очередь, а другие процессы снимали их с очереди.Мой текущий дизайн - приложение 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?Поскольку я не могу сохранить объект ZMQ.Context.

1 Ответ

0 голосов
/ 31 октября 2011

Вы ищете так называемые длительные сообщения.

Посмотрите zmq_setsockopt , в частности ZMQ_IDENTITY вариант в качестве первого шага в вашем решении.

Убедитесь, что вы прочитали разделы руководства о High-Water Marks , чтобы не отставать слишком далеко, если читатель отключен длякакое-то время.

Удачи

...