用例: 帐户A向帐户B发送500美元,我们使用一个主题:“帐户” ,其中有多个分区来记录这些事件
制作人->
1.交易开始
2.Account A BalanceA(-)500到主题Account,分区p0
3.帐户B余额B(+)500到主题帐户,分区p1
4.交易结束
在消费者方,我们有单个流线程来处理这些分区,并相应地更新其全局状态存储区(全局K表),使用这些分区的消费者将以不同的轮询方式消费这些消息,并产生不一致的状态
1。在某些调查中从全局状态存储中的帐户A减去500 2.使用来自其他分区的一些非跨国数据 3.将500添加到全局状态存储中的帐户B中-在另一次调查中
在第1步和第3步之间,我们的状态不一致,其中帐户A记入借方,但帐户B不记入贷方
我们如何在应用程序中使用低级Kafka Stream API原子地使用跨国数据来更新其全局状态存储(Global K Table),以避免在任何时间出现不一致的状态。
答案 0 :(得分:1)
按事务记录逐条更新状态存储记录可能会导致一段时间的视图不一致,而更新状态存储应用程序应以原子方式写入整个事务(批量提交)。使用流应用程序或使用者,无法获取事务开始/结束标记来执行批量提交。 使用处于READ_COMMITTED模式的简单使用者,您可以在轮询之前询问结束偏移(LSO),将所有记录缓存在临时映射中,直到达到终止偏移(LSO),然后将临时映射原子地写入实际状态存储(批量提交/刷新) )。此过程将确保状态存储是一致的,并且在进行事务处理时不会进行部分更新。