Микросервисы, как отделить сервисы, если данные по одному сервису зависят от другого? - PullRequest
1 голос
/ 29 марта 2020

Допустим, у меня есть два микросервиса, которые выглядят так:

Services

У меня есть один сервис, в котором хранятся все вопросы и варианты их ответов. Второй сервис создает модули, которые будут использовать вопросы из первого сервиса.

Итак, у нас есть Question Service и Module Service.

Когда мы создаем модули:

  1. Клиент будет запрашивать вопросы
  2. Клиент отправит question_id с данными модуля

Когда пользователь попытается завершить этот модуль:

  1. Клиент будет запрашивать модуль
  2. По question_id он получит вопрос и его опции для показа в качестве теста.

Теперь есть главная проблема. Как служба Module узнает, что ответ пользователя правильный или нет?

Теперь я думаю, что два типа решения этой проблемы:

  1. Клиент спросит Question Service, если этот ответ правильный, а затем отправить результат на Module Service. Однако этот метод ненадежен, поскольку запросы от Клиента могут быть подделаны и Module Service будет хранить неверные результаты

  2. Клиент отправит запрос проверки ответа на Module Service, который затем отправит запрос на Question Service путем прямого HTTP-вызова. Это также плохое решение, потому что это делает Module Service тесно связанным с Question Service.

Существуют ли какие-либо решения для отделения Module Service от Question Service?

1 Ответ

1 голос
/ 30 марта 2020

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

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

...