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
    )是实现该模式的推荐方法吗

  • 当客户数量非常大时,在每个shipping service实例中复制整个客户数据集是否存在问题

  • 是否可以/应该以某种方式使用
    KTable
    实现这种情况


  • 您可以使用
    GKTable
    KTable
    解决此问题。前一个数据结构被复制,因此整个表在每个节点上都可用(并占用更多存储)。后者是分区的,因此数据分布在各个节点上。这样做的副作用是,正如您所说,处理用户ID的分区可能不会同时处理相应的客户。您可以通过重新划分其中一个流来解决此问题,从而使它们共同分区

    因此,在您的示例中,您需要使用Shipping Service中的客户信息丰富订单事件。您可以: a) 使用客户信息的
    GlobalKTable
    ,并连接到每个节点上的表 b) 使用客户信息的
    k表
    ,并执行相同的操作,但在进行充实之前,必须使用
    selectKey()
    操作符重新键入,以确保数据是共分区的(即,相同的键将位于同一节点上)。在Customer和Orders主题中还必须有相同数量的分区

    汇流微服务示例中的示例也做了类似的事情。它重新设置订单流的键,以便按productId对其进行分区,然后连接到库存的
    KTable
    (也按productId键控)

    关于您的个人问题:

  • GlobalKTable
    是实现该模式的推荐方法吗? 两者都有效。如果您的服务因任何原因丢失存储,则
    GKTable
    在最坏情况下的重新加载时间较长。
    KTable
    将有稍大的延迟,因为数据必须重新分区,这意味着将数据写入Kafka并再次读取

  • 当客户数量非常大时,在每个shipping service实例中复制整个客户数据集是否存在问题? 主要区别在于上述最坏情况下的重新加载时间。虽然从技术上讲,
    GKTable
    KTable
    的语义稍有不同(
    GKTable
    在启动时完全加载,
    KTable
    根据事件时间增量加载,但这与此问题并不严格相关)

  • 是否可以/应该以某种方式使用
    KTable
    实现这种情况? 见上文


  • 另请参见:,。

    嗨,本,感谢您的清晰解释和所有有用的参考资料!