ZeroMQ XREP - исчезновение конечной точки - PullRequest
2 голосов
/ 01 декабря 2010

Я использую стандартную очередь LRU, как определено в руководстве ZeroMQ , рисунок 41 , и мне интересно, как добавить защиту, чтобы я не отправлял сообщения в исчезнувшие конечные точки (серверкрах, OOM killer, что-нибудь в этом духе).

Из документации, которую я прочитал, XREP просто отбросит сообщение, если оно отправляется на несуществующую конечную точку, и нет способа получить уведомлениеоб этом.Есть ли способ получить такое уведомление?Должен ли я сначала отправить «пинг», и если я не получу ответ, то этот «работник» для меня - мертвое мясо?Как я узнаю, что это тот же клиент, которому я только что отправил пинг, от которого я получаю сообщение?

Или мой вариант использования не подходит для ZeroMQ?Я просто хочу убедиться, что сообщение получено, я не хочу, чтобы его бросили на пол без моего ведома ...

1 Ответ

3 голосов
/ 07 декабря 2010

Пинг работника, чтобы узнать, жив ли он, вызовет состояние гонки: рабочий вполне может ответить на пинг перед тем, как он умрет.

Однако, если вы предполагаете, что работник не умрет во время обработки запроса (в этом случае вы мало что можете сделать), вы можете обратить вспять поток связи между работниками и центральной очередью. Позвольте работнику получить запрос из очереди (используя соединение REQ / REP) и попросить его отправить ответ вместе с исходным конвертом, когда будет выполнена обработка (используя тот же сокет, что и выше, или даже лучше через отдельное PUSH / PULL соединение).

В этом сценарии вы знаете, что мертвому работнику не будут отправляться запросы, поскольку он не сможет их получить (будучи мертвым ...). Более того, ваша центральная очередь может даже обеспечить получение ответа на каждый запрос в данный момент времени. Если этого не произойдет, он может поместить запрос обратно в очередь, чтобы вскоре после этого новый работник получил его. Таким образом, даже если работник умирает во время обработки запроса, запрос в конечном итоге будет обработан.

(в качестве примечания: будьте осторожны, если работник падает из-за определенного запроса - вы не хотите убивать своих работников по одному и, возможно, захотите сделать максимальное количество попыток для запроса)

Редактировать: Я написал некоторый код , реализующий другое направление , чтобы объяснить, что я имею в виду.

...