Как организовать отправку сообщений в множество микросервисных нод?
Есть самонописанная сетевая нода (микросервис) на golang. Она принимает текстовые сообщения через REST и далее требуется отправить это сообщение другим таким же нодам (список нод заранее известен, их может быть 1, 30, 100 и т.д. любое количество). Но, ноды между сообой пересылают сообщения через grpc. Т.е. у каждой ноды две точки приема сообщений - rest и grpc. Как организовать передачу таких сообщений с точки зрения архитектуры? Складывать сообщения от rest и grpc в общую очередь и другим потоком делать отправку, наверное будет не очень эффективно. Разгребать общую очередь пулом потоков не очень понятно как, т.к. придется как-то делить сообщения по потокам в пуле и отправляемым другим адресам нод, но все ноды должны получить каждое сообщение. Отправлять без очереди, сразу при поступлении новых сообщений - накладные расходы на установку grpc-соединений. По сути каждое новое сообщение будет инициировать новое клиентское подключение к серверу и создавать новую горутину, что приведет к задержкам в сети, выделению лишней памяти и т.п.
Какие есть подходы для решения такой проблемы?
Когда сообщение приходит в сервис, его надо отправить на одну любую из 30-100 нод другого сервиса? Или же надо, чтобы каждая из этих 30-100 нод другого сервиса получила сообщение?
Берете какой-нибудь брокер сообщений.
Например, Rabbitmq.
Там создаёте exchange с типом fanout. Туда будете слать сообщения из сервиса-отправителя.
Каждый сервис-получатель будет подключаться к этому exchange и для каждого будет создаваться своя очередь, куда будут попадать все сообщения. И каждый сервис спокойно сам вычитает свою очередь. И даже если он упадёт, то дочитает их после того, как подымется. https://youtu.be/P_EtQ-s-hiU?si=tavSDSzTnGpqQrAY