Межсервисная связь в микросервисах - PullRequest
0 голосов
/ 19 апреля 2020

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

  • пользователь должен быть активным (поэтому нам нужно позвонить в микросервис пользователя и проверить его)
  • его магазин должен быть проверен и включен (поэтому нам нужно позвонить в его магазин и проверить его)
  • срок его подписки не истек (поэтому нам нужно проверить его подписку).

После проверки этих правил мы можем создать продукт в нашем микросервисе product для его магазина.

У меня есть два варианта:

  1. syn c вызов (из product microservice) для каждого микросервиса и проверка правил (но при этом все микросервисы имеют тесную связь).
  2. с использованием SAGA для проверки этих правил, а затем создать продукт (но, возможно, пользователь должен увидеть созданный продукт в ответ)

Какое лучшее решение, есть лучший вариант?

Ответы [ 2 ]

1 голос
/ 19 апреля 2020

Какое лучшее решение, есть ли лучший вариант?

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

Если ваши службы будут по-настоящему автономными, то нам нужен дизайн, в котором все будет работать , даже если никакие две службы не работают одновременно . С таким ограничением мы никогда не собираемся делать синхронные вызовы между двумя сервисами. Вместо этого мы будем передавать сообщения туда и обратно через некоторый транспорт, который не теряет сообщения, когда службы закрываются (база данных, или хранилище сообщений, или очередь сообщений, или что-то, что отделено от вопроса о том, домен logi c процесс запущен).

По сути, мы договариваемся, что служба, которая должна выполнять вычисления, будет собирать сообщения с (потенциально устаревшими) копиями необходимых данных. Другой способ сказать то же самое: выборка данных из других служб - это данные извне .

Одна из важных идей данных извне? данные не заблокированы. Вы действительно не хотите пытаться удерживать одновременную блокировку данных, принадлежащих различным службам.

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

0 голосов
/ 19 апреля 2020

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

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

Кроме этого - это звучит как вопрос - где организован процесс? В клиенте (ваш вариант 1)? Или в другой «центральной» службе, вызывающей микросервисы от имени клиента (ваш вариант 2)?

https://dzone.com/articles/microservices-using-saga-pattern предполагает, что обмен сообщениями о событиях также можно использовать, чтобы избежать организации центральной службы процесс - но каждое из микросервисов должно быть подписано на другие события и знать, когда выполнять свои собственные процессы.

Для меня - Если ваши сервисы действительно независимы (например, управляются разными поставщиками, разными базами кода) et c) тогда я бы организовал на клиенте.

Если пользовательский интерфейс этого пользователя является лишь одним из многих (несколько приложений, которые могут создавать продукты) - тогда я бы создал «центральный» сервис оркестровки в чем-то вроде Enterprise Service Bus. Это делает оркестрированный процесс многократно используемым.

Если у вас есть полный контроль над этими всеми этими микросервисами, и они являются частью одного и того же стека решений, то я бы встроил необходимые проверки правил в службу micros продукта и сделал это одна транзакция. Вы все еще можете сделать это RESTfuly, используя команду POST / PUT.

Это даст хорошую диаграмму - будет рад рисовать, если вы считаете, что это поможет.

Открыто для ваших (и других) мысли.

Крис

...