帐户借记卡中的状态不一致-使用Kafka交易进行信用申请

时间:2019-03-13 10:02:16

标签: apache-kafka kafka-consumer-api apache-kafka-streams

用例: 帐户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),以避免在任何时间出现不一致的状态。

1 个答案:

答案 0 :(得分:1)

按事务记录逐条更新状态存储记录可能​​会导致一段时间的视图不一致,而更新状态存储应用程序应以原子方式写入整个事务(批量提交)。使用流应用程序或使用者,无法获取事务开始/结束标记来执行批量提交。 使用处于READ_COMMITTED模式的简单使用者,您可以在轮询之前询问结束偏移(LSO),将所有记录缓存在临时映射中,直到达到终止偏移(LSO),然后将临时映射原子地写入实际状态存储(批量提交/刷新) )。此过程将确保状态存储是一致的,并且在进行事务处理时不会进行部分更新。