Если у вас правильно смоделированы домены, это кажется простым исправлением с помощью событий интеграции.
Добавьте таблицу EmployeeIds
к вашей службе департаментов и таблицу DepartmentIds
к вашей службе сотрудников. Когда вы делаете, нарушаете или изменяете назначение между Employee
и Department
, публикуйте событие EmployeeDepartmentUpdated
, на которое подписываются обе службы. Затем каждая служба может обработать событие и обновить свои собственные данные для синхронизации.
Вы НЕ хотите начать помещать данные в свой API шлюза, это не то, для чего оно (иэто означает, что если у вас есть несколько шлюзов к одним и тем же внутренним службам, эту информацию будет знать только один).
Охватите Окончательная согласованность и ваш путь к микросервисам будет для вас лучше!
РЕДАКТИРОВАТЬ:
На ваш вопрос о влиянии событий на производительность и сложность, ответы «нет» и «да».
Во-первых, нет, я бы не ожидал, что использование событий будет иметь негативное влияние на производительность системы. Фактически, их асинхронный характер делает обработку событий отдельной задачей от отзывчивости API.
Я уверен, что есть способы построения сервис-ориентированной архитектуры (SOA, микросервисы которой по существу являются подмножеством) без плоскости обмена сообщениями. , но, по моему опыту, наличие одного из них - фантастический способ обеспечить слабосвязанную связь.
Любые прямые вызовы между службами - независимо от протокола (HTTP, gRPC и т. д.) означают тесную связь между этими службами. Имена конечных точек, аргументы и т. Д. - это все возможности для прерывания изменений. Когда вы используете обмен сообщениями, каждая служба отвечает за отправку обратно-совместимых событий, а каждая другая служба может выбирать, какие события она заботит, подписываться на них и никогда не знать, работает ли отправляющая служба, не работает ли она, изменена и т. Д.
На ваш второй вопрос ответ «да» - обработка событий - дополнительная сложность. Однако это часть сложности, на которую вы подписываетесь (и далеко не худшая), когда выбираете стиль архитектуры микросервисов. Распределенная авторизация, поддержание работоспособности пользовательского интерфейса с несколькими внутренними вызовами, организованными между несколькими службами, отказоустойчивость и мониторинг работоспособности / производительности - все (по крайней мере, по моему опыту) большие проблемы.
Для записи мы используем хостингэкземпляр RabbitMQ из CloudAMQP.com и он прекрасно работает. Производительность хорошая, у них есть множество масштабируемых пакетов на выбор, и у нас не было проблем с производительностью или простоем. Последний выпуск RabbitMQ 3.8 теперь также включает в себя OAuth, поэтому в настоящее время мы работаем над интеграцией наших потоков Authz с нашим брокером сообщений и будем иметь хорошее комплексное решение для обеспечения безопасности.