假设这样一个简化的场景:
有两个Kafka主题,用户和订单和三个微服务用户服务,订单服务和航运服务。
通过order服务下订单时,ordercreated事件将添加到orders主题,并由shipping服务侦听。此服务需要获取用户信息才能发送订单。根据我的要求,我不能对用户服务进行rest调用,而是使用有状态的方法。也就是说,shipping服务是一个kafka streams应用程序,它侦听用户主题,拥有一个由本地存储支持的ktable,其中包含完整的用户表信息。因此,在处理订单时,它已经具有本地可用的用户信息。
然而,这种方法的一个问题是运输服务中本地用户信息的一致性,例如:
用户在用户服务中更新其发送地址,更新其本地sql数据库,并在用户主题中发布具有此更改的事件。
用户下了订单,所以订单服务在订单主题中发布它。
无论出于何种原因,shipping服务都可以在从用户主题读取userupdated信息之前处理order主题中的ordercreated事件,以便使用不再有效的地址。
在这个事件状态转移场景中,我如何保证shipping服务始终具有更新的用户信息?
1条答案
按热度按时间wribegjk1#
如果您需要顺序保证,那么需要将用户信息更新和顺序写入同一主题(尤其是同一分区),因为kafka只保证单个分区内的顺序。
您可以使用唯一的用户id作为键(用户信息更新和用户订单都是用户操作)将此主题称为“用户\操作”。在您的例子中,这三个服务都将使用“user\u action”主题。虽然用户服务只考虑用户更新,订单服务只考虑订单,但配送服务同时考虑这两种情况。
这篇博文可能也会有所帮助:https://www.confluent.io/blog/put-several-event-types-kafka-topic/