如果流->表联接在重新生成密钥的KTable上,则应使用最新的ktable值

时间:2019-09-03 02:38:28

标签: join apache-kafka apache-kafka-streams latency

我有一个简单的客户->订购RDBMS模式,并且正在使用debezium将消息推送到Kafka。 Kafka配置有一个代理,而我的主题有一个分区。

我正在使用Kafka Streams API,因此我可以将Orders流加入到从Customer表实现的KTable中。我想生成包含订单和客户信息的丰富消息。

要设置方案,请执行以下操作:

  • 更新客户记录
  • 等待0.2秒
  • 更新订单记录

我期望我的流代码输出一条包含最新客户信息的消息,但这是不确定的。有时候会,有时候不会。

我对Streams API还是很陌生,感觉好像我不明白它如何同步输入流,尤其是在生成重新生成密钥的表时。


final KTable<String, Customer> customerTable = builder
    .stream("dbserver1.inventory.customers", Consumed.with(keySerdes, customerSerdes))
    .mapValues(val -> val.payload.after)
    .groupBy((key, val) -> key.getPayload().getId(), Grouped.with(Serdes.String(), rawCustomerSerdes))
    .reduce((aggregate, newCustomer) -> newCustomer, Materialized.as("customer-table"));

builder
    .stream("dbserver1.inventory.orders", Consumed.with(keySerdes, orderSerdes))
    .selectKey((k,v) -> v.payload.after.purchaser)
    .join(
        customerTable,
        (order, customer) -> "#### order:" + order.payload.after.id + " for " + order.payload.after.quantity + " items, purchased by " + customer.firstName)
    .foreach((s1,s2) -> System.out.println("############# JOIN: " + s1 + " - " + s2));

显示问题的示例输出。第一个“ JOIN”输出显示一个名为funky86的名称,该名称是更新之前的名称。第二个具有预期的名称。

在两种情况下,客户更新的时间戳都在订单一之前。

##### - Customer update: TIMESTAMP:1567476573306. PARTITION:0 - key: 1015 - funky87
##### - Order update:    TIMESTAMP:1567476573307. PARTITION:0 - key: 10006 - 88

############# JOIN: 1015 - #### order:10006 for 88 items, purchased by funky86

##### - Customer update: TIMESTAMP:1567476577806. PARTITION:0 - key: 1015 - funky88
##### - Order update:    TIMESTAMP:1567476578307. PARTITION:0 - key: 10006 - 89

############# JOIN: 1015 - #### order:10006 for 89 items, purchased by funky88

谁能指出我有关流拓扑的排序/排序的文档资料?

0 个答案:

没有答案