Я разрабатываю приложение, использующее подход к разработке микросервисов со средним стеком. Я столкнулся с ситуацией, когда данные должны быть разделены между несколькими микросервисами. Например, предположим, что у меня есть пользовательские службы, службы видео, сообщений (отправка / получение, входящие и т. Д.). Теперь записи видео и сообщений принадлежат записи учетной записи. Когда пользователи создают видео и отправляют / получают сообщение, существует внешний ключ (userId), который должен быть связан с записями видео и сообщений, которые они создают. У меня есть сценарии, в которых мне нужно отображать имя, отчество и фамилию, связанные, например, с каждым видео. Предположим теперь, что во внешнем интерфейсе пользователь просматривает список видео, загруженных в систему, по 50 за раз. В худшем случае я мог бы увидеть ситуацию, когда возникает 50 запросов, когда каждое видео привязано к уникальному пользователю.
Кажется, есть два подхода к этому вопросу:
Во-первых, я вызываю API-интерфейс к пользовательской службе и привязываю каждого пользователя к каждому видео в списке. Это кажется неэффективным, поскольку если я буду делать по одному звонку для каждого видео, это может стать по-настоящему болтливым. Во втором сценарии вызова api я получал список видео и отправлял отдельный список внешних ключей пользователя для запроса, чтобы каждый пользователь был привязан к каждому видео. Это кажется более эффективным, но все же кажется, что я теряю производительность, собирая все вместе, чтобы отправить для отображения, или, как бы то ни было, этим нужно манипулировать.
Во-вторых, всякий раз, когда создается новый пользователь, служба учетной записи отправляет сообщение с информацией о пользователе, необходимой каждой другой службе, в очередь разветвления, а затем отдельные службы несут ответственность за добавление нового пользователя в таблицу в своей собственной базе данных, таким образом сохранение слабой связи. Крайним недостатком здесь будет дублирование данных и необходимость иметь очередь разветвления для обработки, когда необходимо выполнить обновления для обеспечения конечной согласованности. Хотя в конечном итоге этот подход кажется наиболее эффективным с точки зрения производительности.
Я разрываюсь между этими двумя подходами, поскольку оба имеют свою долю компромиссов. Какой подход наиболее целесообразно реализовать и почему?