让我们假设一个简化的情况,如下所示:
有两个 Kafka主题,用户和订单以及三个微服务 用户-服务,订购服务和运输服务。
通过订单服务下订单时,会在 orders主题中添加一个 OrderCreated 事件,并由送货服务监听强>。该服务需要获取用户信息才能发送订单。根据我的要求,我无法对用户服务进行REST调用,而是使用有状态方法。也就是说,运输服务是一种Kafka Streams应用程序,可监听用户主题,其中的 KTable由本地存储支持,其中包含完整的用户表信息。因此,在处理订单时,它已经具有本地可用的用户信息。
但是,这种方法的一个关注点是运输服务中本地用户信息的一致性,例如:
用户在用户服务中更新其收货地址,并更新其本地SQL数据库,并通过此更改在用户主题中发布事件。
用户下订单,因此订单服务将其发布在订单主题中。
无论出于何种原因,运输服务都可以在从用户主题读取UserUpdated信息之前处理订单主题中的OrderCreated事件,因此它将使用不再有效的地址。
在这种事件转移状态转移情形下,如何保证运输服务始终具有更新的用户信息?
答案 0 :(得分:2)
如果需要订购保证,则您需要将用户信息更新和订购都写入同一主题(尤其是写入同一分区),因为Kafka仅保证在单个分区内订购。
您可以使用唯一的用户ID作为键将此主题称为“ user_action”(用户信息更新和用户订单都是用户操作)。在您的情况下,所有这三个服务都将使用“ user_action”主题。虽然用户服务仅考虑用户更新,而订单服务仅考虑订单,但运输服务同时考虑两者。
此博客文章也可能会有所帮助:https://www.confluent.io/blog/put-several-event-types-kafka-topic/