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