У меня есть одно приложение-издатель (PUB), у которого есть N подписчиков (SUB)
Эти подписчики должны быть в состоянии наверстать упущенное, если они перезагрузятся или упадут и пропустят сообщения.
Мы реализовали простое хранилище событий, в которое пишет издатель. Мы реализовали CatchupService, который может запрашивать хранилище событий и отправлять пропущенные сообщения подписчику.
Мы реализовали в подписчике PUSH-сокет, который отправляет запрос о пропущенных сообщениях. Абонент также имеет сокет PULL, который прослушивает пропущенные сообщения на отдельном порту.
Абонент будет:
- Обнаружение пробела
- Отправьте запрос о пропущенных сообщениях в наш CatchupService, запрос также содержит адрес, на который следует отправить результаты.
- Служба перехвата имеет сокет PULL, на котором она прослушивает запросы.
- When the CatchupService receives a request it starts a worker thread which:
- Gets the missed messages
- Открывает сокет PUSH, подключающийся к сокету PULL абонента.
- Отправляет пропущенные сообщения подписчику.
Кажется, это работает довольно хорошо, однако мы не уверены, используем ли мы правильные типы сокетов для такого рода приложений. Являются ли они правильными или должны использовать другой шаблон.