управляемые событиями rabbitmq микросервисы - PullRequest
0 голосов
/ 24 февраля 2020

Микросервисная архитектура и совместное использование общих данных приложений.

Сценарий: сегодня существует 17 микросервисов для некоторых онлайн-сервисов социальных сетей, и 9 из них должны знать, кто с кем связан, чтобы их функции работали , Чтобы каждая служба не запрашивала в списке микросервис «проверка подлинности» или «подключения», все службы регистрируются для получения копии подключений на пользователя и сохранения в кеше.

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

Однако каждый микросервис представляет собой кластер из docker контейнеров, организованных k8s для масштабируемости.

Каждый контейнер регистрируется для прослушивания коллекции обменов, в которых они заинтересованы ... так что для службы "лента новостей", которая может быть, скажем, 5 соединений ...

Ниже приведена иллюстрация предлагаемой установки: data workflow

  • T1 - пользователь A принимает запрос на добавление в друзья
  • T2 - Служба соединений (MS1) устанавливает соединение в своей первичной базе данных
  • T3 - MS1, опубликованная для rabbitmq exchange указанное событие
  • T4 - rabbitmq exchange отправляет все Q (ie все другие зарегистрированные микросервисы)
  • T5 - All th Узлы в кластере MS2 получают событие и действуют ... их действие (в этом случае) будет заключаться в обновлении кэша друзей-друзей.
  • T6 - пользователь A запрашивает данные для своей ленты новостей, MS2 теперь запрашивает свою базу данных с использованием локального кэша

Это все хорошо:

  • Служба подключения не знала или не заботилась, кто получил данные, только что он должен выдавать 1 обмен через единственную точку входа rabbitmq
  • Разработчик MS2 должен был знать только о местонахождении экземпляра rabbitmq
  • Тот же разработчик всех других служб .. они обрабатывают данные по-своему блестяще.

Единственное исключение состоит в том, что ... было 3 экземпляра MS2, так что было бы 3 записи в базу данных ... если система масштабируется до 10, это будет 10 db пишет et c et c.

Вопрос Как обойти эту проблему ... как обеспечить работу только 1 экземпляра MS2?

Если новостная лента микро услуга будет предоставляться с собственной внутренней системой q для управления данными с биржи? Можно ли направить все сообщения через балансировщик нагрузки, чтобы только 1 экземпляр MS2 получал сообщение? Я не хочу начинать управлять множеством очередей вручную, так как это вызовет боль и лишит простоты дизайн обмена.

1 Ответ

0 голосов
/ 24 февраля 2020

Таким образом, все случаи, если M2 будет делить очередь и работать с использованием шаблона конкурирующего потребителя , все сообщения потребляются один раз, и если весь экземпляр M2 выходит из строя, очередь растет до они возвращаются снова.

M2, M3 и M4 будут создавать ОДНУ очередь для того, что публикует M1. Давайте назовем их M2_from_M1, M3_from_M1 и M4_from_M1. Все они также создадут привязку к использованию обмена M1 и ключу маршрутизации для этого сообщения.

Теперь все экземпляры M2 будут получать из M2_from_M1, все экземпляры M3 будут получать из M3_from_M1 и так далее.

Если все экземпляры какого-либо из них не работают, очередь начнет заполняться, но это нормально, так как будет использовано позже.

Относительно общей архитектуры. Сначала попробуйте выполнить вызов между M2 и M1, время доступа между модулями, вероятно, очень быстрое, и вы можете какое-то время кешировать и в M1, и в M2. Хуже всего то, что вы видите новости от людей, за которыми вы больше не подписываетесь, или что вы не получаете новостей от новых контактов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...