@buranich

PHP + ZeroMQ, как не потерять сообщения, если PULL-воркер упал?

Здравствуйте!

Использую ZeroMQ с паттерном PUSH-PULL для того, чтобы принимать запрос от клиента и моментально отдавать в браузер страничку об успешности операции, а в это время всю "тяжелую" работу передавать воркеру.

Выглядит это так. Клиент:
$pusher = new ZMQSocket($context, ZMQ::SOCKET_PUSH);
$pusher->bind("tcp://*:5557");
$pusher->send("My message", ZMQ::MODE_DONTWAIT);


Воркер:
$receiver = new ZMQSocket($context, ZMQ::SOCKET_PULL);
$receiver->connect("tcp://localhost:5557");
while (true) {
    $string = $receiver->recv();
    // ...
}


Проблема возникает в случае, если воркер падает. При этом клиент отправляет сообщение непонятно куда, а при повторном запуске воркер не получает этих сообщений.

Как быть в этой ситуации? Как правильно "буферизовать" сообщения, даже если воркер упал?

Заранее спасибо!
  • Вопрос задан
  • 4401 просмотр
Пригласить эксперта
Ответы на вопрос 1
Sardar
@Sardar
Может стоит использовать persistent очередь, вроде RabbitMQ? Нет ограничений на размер сообщений и они сохраняются, пока не будут употреблены. При чем сообщение резервируется, пока worker выполняет задачу и либо удаляется из очереди при успешном завершении, либо возвращается в очередь, если worker по тихому умер.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы