【发布时间】:2020-02-23 21:02:07
【问题描述】:
我正在通过以下场景简化我的问题: 3 个朋友共享一张会员卡。该卡有两个限制
- 最多可以使用10次(不管哪个用卡,即 friend_a 可以使用 10 次。
- 卡中的最大金额为 200。因此,如果 1 个“事件”的价值 = 200,则卡已“完成”。
我正在使用一个 kafka 生产者,它像这样在 kafka 集群中发送事件
{ "name": "friend_1", "value": 10 }
{ "name": "friend_3", "value": 20 }
这些事件被发布到一个与 kafka 流连接的主题,该流按键分组并进行聚合以汇总所花费的钱。这似乎可行,但是我面临“并发问题”
让我们想象一下这张卡使用了 9 次,所以只剩下 1 次可以使用,总共花费了 190,也就是说还有 10 个单位可以花费。
因此,朋友_2 想购买价格为 11 单位的东西(不应该被允许),而朋友_3 想购买价格为 9 单位的东西,而这应该是允许的。 Friend_3 将第 10 次修改使用卡片的状态。所有其他未来的尝试都不应修改任何内容。
因此卡用户知道他发送的事件是否修改了最大使用数和总计数似乎是合理的。我怎么能在卡夫卡做到这一点?使用流聚合我总是可以增加值,但我怎么知道我的操作是否“修改了卡片的状态”?
更新:如果交易验证了规则,卡用户应该立即得到负面反馈。
【问题讨论】:
-
如果以下答案之一解决了您的问题,请将其标记为已接受。
标签: apache-kafka kafka-consumer-api apache-kafka-streams kafka-producer-api