Давайте предположим упрощенный сценарий, подобный этому:
Есть две темы Кафки , пользователи и заказы и три микросервиса обслуживание пользователей , Служба заказа и Служба доставки .
Когда заказ размещается через службу заказов, событие OrderCreated добавляется в тему заказов и прослушивается службой доставки . Этот сервис должен получить информацию о пользователе для отправки заказа В соответствии с моими требованиями я не могу сделать REST-вызов пользовательскому сервису, но использую подход с учетом состояния. Другими словами, служба доставки - это приложение Kafka Streams, которое слушает тему пользователя, с таблицей KTable, поддерживаемой локальным хранилищем с полной информацией о таблице пользователя. Таким образом, при обработке заказа в нем уже есть локальная информация о пользователе.
Однако одной из проблем этого подхода является согласованность информации локального пользователя в службе доставки , например:
Пользователь обновляет свой адрес доставки в пользовательской службе, он обновляет свою локальную базу данных SQL и публикует событие в теме пользователя с этим изменением.
Пользователь размещает заказ, поэтому служба заказа публикует его в теме заказа.
По какой-либо причине служба доставки может обработать событие OrderCreated из темы заказа перед тем, как прочитать информацию UserUpdated из темы пользователя, чтобы использовать адрес, который больше не действителен.
Как я могу гарантировать, что служба доставки всегда будет иметь обновленную информацию о пользователе в этом сценарии передачи состояния, переносимого событиями?