Apache kafka Kafka事件承载状态传输系统是否应该使用本地查询的GlobalKTable实现?
让我们假设一个实际案例:Apache kafka Kafka事件承载状态传输系统是否应该使用本地查询的GlobalKTable实现?,apache-kafka,apache-kafka-streams,event-driven,event-driven-design,Apache Kafka,Apache Kafka Streams,Event Driven,Event Driven Design,让我们假设一个实际案例: 我们的客户服务将客户创建/客户更新的事件发布到客户卡夫卡主题 配送服务侦听订单主题 当配送服务读取创建的OrderCreated事件时,它将需要访问客户地址。shipping service将不再向客户服务打REST电话,而是在本地提供用户信息。它保存在具有持久存储的KTable/GlobalKTable中 我的问题是关于我们应该如何实现这一点:我们希望这个系统具有弹性和可扩展性,因此将有多个客户和运输服务实例,这意味着客户和订单主题也将有多个分区 我们可以找到这样的场
客户创建/客户更新的事件发布到客户卡夫卡主题
OrderCreated
事件时,它将需要访问客户地址。shipping service将不再向客户服务打REST电话,而是在本地提供用户信息。它保存在具有持久存储的KTable
/GlobalKTable
中OrderCreated(orderId=1,userId=7,…)
事件由配送服务读取,但如果它使用KTable
来保存和访问本地用户信息,userId=7
可能不存在,因为处理该userId的分区可能已分配给其他shipping service实例
可以使用GlobalKTable
立即解决此问题,以便所有shipping service实例都可以访问整个范围的客户
GlobalKTable
)是实现该模式的推荐方法吗KTable
实现这种情况您可以使用
GKTable
和KTable
解决此问题。前一个数据结构被复制,因此整个表在每个节点上都可用(并占用更多存储)。后者是分区的,因此数据分布在各个节点上。这样做的副作用是,正如您所说,处理用户ID的分区可能不会同时处理相应的客户。您可以通过重新划分其中一个流来解决此问题,从而使它们共同分区
因此,在您的示例中,您需要使用Shipping Service中的客户信息丰富订单事件。您可以:
a) 使用客户信息的GlobalKTable
,并连接到每个节点上的表
b) 使用客户信息的k表
,并执行相同的操作,但在进行充实之前,必须使用selectKey()
操作符重新键入,以确保数据是共分区的(即,相同的键将位于同一节点上)。在Customer和Orders主题中还必须有相同数量的分区
汇流微服务示例中的示例也做了类似的事情。它重新设置订单流的键,以便按productId对其进行分区,然后连接到库存的KTable
(也按productId键控)
关于您的个人问题:
GlobalKTable
是实现该模式的推荐方法吗?
两者都有效。如果您的服务因任何原因丢失存储,则GKTable
在最坏情况下的重新加载时间较长。KTable
将有稍大的延迟,因为数据必须重新分区,这意味着将数据写入Kafka并再次读取GKTable
和KTable
的语义稍有不同(GKTable
在启动时完全加载,KTable
根据事件时间增量加载,但这与此问题并不严格相关)KTable
实现这种情况?
见上文另请参见:,。嗨,本,感谢您的清晰解释和所有有用的参考资料!