我有一个简单的客户->订购RDBMS模式,并且正在使用debezium将消息推送到Kafka。 Kafka配置有一个代理,而我的主题有一个分区。
我正在使用Kafka Streams API,因此我可以将Orders流加入到从Customer表实现的KTable中。我想生成包含订单和客户信息的丰富消息。
要设置方案,请执行以下操作:
我期望我的流代码输出一条包含最新客户信息的消息,但这是不确定的。有时候会,有时候不会。
我对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
谁能指出我有关流拓扑的排序/排序的文档资料?