У меня интересная головоломка; Я использую шаблон Redis PubSub для генерации событий в моей сети из NodeJS микросервисов. Я отказался от RabbitMQ, потому что мне нужно, чтобы сообщения были многоадресными, чтобы несколько микросервисов могли получать и обрабатывать одно и то же событие. Поэтому, если я испущу событие LOGOUT, его должны услышать и UserService, и WebSocketService.
Это работало нормально до тех пор, пока мой клиент не развернулся в среде, в которой работает несколько экземпляров каждого микросервиса. Теперь, учитывая 3 экземпляра UserService, все экземпляры подключаются к Redis, и все они получают и обрабатывают событие LOGOUT, что плохо.
Итак, с одной стороны, мне нужны отдельные микросервисы, чтобы слышать событие, но на другой - мне нужно, чтобы дубликаты одного и того же микросервиса не обрабатывали событие. Рок, встречайте наковальню.
На данный момент я думаю, что это немного взломано, но что-то вроде:
- Вместо того, чтобы вызывать события, напишите в кэш Redis список событий
- UserService и WebSocketService могут читать этот список каждые 3 секунды и проверять наличие новых событий, требующих обработки.
- При обнаружении соответствующего события UserService добавит его «имя» в список служб. который обрабатывает событие
- Когда WebSocketService видит событие, он все равно сможет обработать его и добавить свое «имя» в список обработчиков.
- Когда дублирующийся экземпляр UserService видит событие , он увидит свое «имя» уже в списке обработчиков и проигнорирует это событие
Мне не нравится это решение, потому что список будет постоянно увеличиваться в памяти, а не во временном сообщении . Также мне придется начать добавлять код для управления тем, какие события уже были проверены; в противном случае в каждом цикле весь список должен был бы анализироваться заново всеми экземплярами всех сервисов.
Идеи приветствуются.