Если могут быть отправлены только ссылочные идентификаторы,
Почему разрешено только это? Я работал с системой, которая использовала микросервисы, CQRS и DDD (похожие на вашу), и у нас не было таких ограничений. Как и в большинстве случаев это: «Что лучше всего подходит для вашего приложения / бизнес-домена». Не следуйте никаким правилам вслепую. Это прекрасно для того, чтобы поместить другую информацию в полезную нагрузку событий.
единственное жизнеспособное решение состоит в том, чтобы довести остальную информацию с
некоторый тип вызова, но источник должен был бы реализовать конечную точку
и услуги в конечном итоге станут более связанными.
Это также хорошо в некоторых случаях, но это приводит вас к ситуации, когда после обработки события вы получаете дополнительный вызов. Я бы не стал этого делать, если у вас нет действительно тяжелой модели / моделей, и это повлияет на вашу производительность. Например, если у вас есть событие, выполненное и основанное на userId, вам по какой-то причине необходимо загрузить коллекцию связанных объектов / моделей. У меня был один подобный случай, когда мне приходилось загружать коллекцию других объектов на основе какого-либо действия над пользователем, например, события UserCreated. Конечно, в этом случае вы не хотите отправлять все эти данные в одном информационном наполнении события. Вместо этого вы отправляете только идентификатор пользователя, а затем вызываете Get API из другого сервиса, чтобы получить и сохранить эти данные в своем микросервисе.
UserCreated
{
* идентификатор пользователя 1015 *
Имя
фамилия
документ
...}
Это правильно?
Да, это нормально :) 1024 *
Что вы могли бы сделать вместо:
В зависимости от вашего бизнес-сценария вы можете опубликовать информацию с несколькими событиями на этапах и в разных штатах.
Допустим, из пользовательского интерфейса у вас есть экран в виде мастера с несколькими этапами создания. Вы можете опубликовать
- событие: UserCreatedDraft с некоторыми начальными данными со страницы 1-го мастера
-
- событие: UserPersonalDataCreated только с частью объекта, связанной с личными данными
-
- событие: UserPaymentDataСоздано только с созданными данными платежа
-
- UserCreatedFinal с последним шагом
Это всего лишь пример для определенного сценария, который зависит от вашего варианта использования и ваших бизнес-требований. Это просто чтобы дать вам представление о том, что вы могли бы сделать в некоторых случаях.
Резюме:
Как вы можете видеть, есть несколько способов работы с такими системами. Помните, что следовать правилам - это хорошо, но в некоторых случаях вам нужно делать то, что лучше всего, исходя из вашего бизнес-сценария, а то, что работает для некоторых приложений, может оказаться не лучшим решением для вас. Делайте то, что наиболее эффективно для вашей системы. Работая с микросервисами, мы все равно должны иметь дело с задержками и асинхронными операциями, поэтому всегда полезно сохранять некоторую производительность в других частях системы.