Нужны указания по дизайну асинхронной связи между микросервисами

У меня есть вариант использования, когда клиентам необходимо взаимодействовать с разными сущностями, принадлежащими разным микросервисам. Но эти сущности фактически зависят от предыдущего в своем создании. например: MicroService1 владеет данными1 Microservice2 владеет данными2 (для создания данных2 требуются данные1) Microservice3 владеет данными3 (для создания данных3 требуются данные2)

Связь между MicroService1 -> Microservice2 -> Microservice3 является асинхронной.

Теперь клиенту необходимо взаимодействовать с data1 и data3. На самом деле это приводит к классическим проблемам в распределенной среде env, когда клиенту необходимо взаимодействовать с data3 сразу после приема data1, но data1 не достиг MicroService2, а затем, в конечном итоге, data2 не достиг Microservice, поэтому в системе еще нет data3.

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

для контекста, Data1 здесь - это заказ на покупку, data2 - это товары и их цены в заказе на покупку, а data3 - это счет (созданный с определенной периодичностью), содержащий все товары из нескольких таких заказов на покупку. Клиенты будут передавать заказы на покупку в потоковом режиме и ожидать счетов за них. Таким образом, может произойти несколько состояний гонки. Клиент ожидает, что счет будет выставлен на конкретный заказ на поставку, но он все еще находится в обработке. заказ на поставку, который необходимо включить в текущий счет, даже не дошел до микросервиса3. или, что еще хуже, заказ на поставку имеет более новую версию v2 с некоторыми дополнительными элементами, но Microservice2 обработал только элементы для v1, и теперь при создании счета будет использоваться v1 вместо v2. это потому, что мы обрабатываем на уровне события, но если бы вызов был синхронизирован,мы получили бы v2 до создания счета

1 ответ

Во-первых, описание проблемы немного абстрактно, поэтому сложно дать конкретное предложение.

Связь между MicroService1 -> Microservice2 -> Microservice3 является асинхронной.

"асинхронное общение" звучит так, как будто вы можете общаться, публикуя сообщение, например, в теме Kafka, и потребитель слушает эту тему.

Теперь клиенту необходимо взаимодействовать с data1 и data3.

Итак, если потребители прислушиваются к topic_for_data3, они могут "искать" данные1 или подписываться на topic_for_data1 поскольку data1 уже доступен на момент публикации data3.

Исходя из абстрактного описания проблемы, трудно быть более конкретным. Но это может быть один из способов сделать это.

Другие вопросы по тегам