Нужны указания по дизайну асинхронной связи между микросервисами
У меня есть вариант использования, когда клиентам необходимо взаимодействовать с разными сущностями, принадлежащими разным микросервисам. Но эти сущности фактически зависят от предыдущего в своем создании. например: 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.
Исходя из абстрактного описания проблемы, трудно быть более конкретным. Но это может быть один из способов сделать это.