cod*_*ent 5 event-driven-design event-driven apache-kafka apache-kafka-streams
让我们假设一个简化的场景是这样的:
Kafka有两个主题,用户和订单,三个微服务 user-service,order-service和shipping-service。
通过订单服务下订单时,会将OrderCreated事件添加到订单主题,并由货运服务监听。该服务需要获取用户信息才能发送订单。根据我的要求,我无法对用户服务进行REST调用,而是使用有状态方法。也就是说,运输服务是一个Kafka Streams应用程序,该应用程序侦听用户主题,并具有由本地商店支持的KTable以及完整的用户表信息。因此,在处理订单时,它已经具有本地可用的用户信息。
但是,此方法的一个问题是运输服务中本地用户信息的一致性,例如:
用户在用户服务中更新其收货地址,它更新其本地SQL数据库,并通过此更改在用户主题中发布事件。
用户下订单,因此订单服务将其发布在订单主题中。
无论出于何种原因,运输服务都可以在从用户主题读取UserUpdated信息之前处理订单主题中的OrderCreated事件,因此它将使用不再有效的地址。
在这种事件承载状态转移方案中,我如何保证运输服务始终具有更新的用户信息?
如果需要顺序保证,则需要将用户信息更新和顺序写入同一主题(特别是同一分区),因为 Kafka 仅保证单个分区内的顺序。
您可以将此主题称为“user_action”,并以唯一的用户 ID 作为键(用户信息更新和用户订单都是用户操作)。在您的情况下,所有三个服务都将使用“user_action”主题。用户服务仅考虑用户更新,订单服务仅考虑订单,而运输服务则同时考虑两者。
这篇博文也可能有帮助:https ://www.confluence.io/blog/put-several-event-types-kafka-topic/
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |