Apache kafka 我如何能立即获得在卡夫卡和卡夫卡流中制作的事件的结果?

Apache kafka 我如何能立即获得在卡夫卡和卡夫卡流中制作的事件的结果?,apache-kafka,kafka-consumer-api,apache-kafka-streams,kafka-producer-api,Apache Kafka,Kafka Consumer Api,Apache Kafka Streams,Kafka Producer Api,我正在使用以下场景简化我的问题: 3个朋友共享一张忠诚卡。这张卡有两个限制 最多可使用10次(无论使用哪种卡,即 朋友a可以用10次 卡中的最大金额为200。因此,如果值为200的“事件”为1,则该卡为“已完成” 我使用的是卡夫卡制作者,它在卡夫卡集群中发送这样的事件 {“name”:“friend_1”,“value”:10} {“name”:“friend_3”,“value”:20} 这些事件被发布到一个主题上,该主题与卡夫卡流相关联,卡夫卡流按键分组并进行聚合以计算所花费的金额。这似乎可

我正在使用以下场景简化我的问题: 3个朋友共享一张忠诚卡。这张卡有两个限制

  • 最多可使用10次(无论使用哪种卡,即 朋友a可以用10次
  • 卡中的最大金额为200。因此,如果值为200的“事件”为1,则该卡为“已完成”
  • 我使用的是卡夫卡制作者,它在卡夫卡集群中发送这样的事件

    {“name”:“friend_1”,“value”:10}

    {“name”:“friend_3”,“value”:20}

    这些事件被发布到一个主题上,该主题与卡夫卡流相关联,卡夫卡流按键分组并进行聚合以计算所花费的金额。这似乎可行,但我面临一个“并发问题”

    让我们想象一下这张卡已经用了9次,所以只剩下1次了,总共花了190美元,这意味着还有10个单位要花

    因此,friend_2想要购买价格为11个单位(不允许)的东西,friend_3想要购买价格为9个单位(允许)的东西。friend_3将第10次使用该卡修改状态。以后所有其他尝试都不应该修改某些东西

    因此,对于卡用户来说,知道他发送的事件是否修改了最大使用次数和总计数似乎是合理的。我如何在卡夫卡中做到这一点?使用流聚合,我总是可以增加值,但我如何知道我的操作是否“修改了卡的状态”


    更新:如果交易验证了规则,卡用户应立即收到负面反馈。

    从我对您问题的理解来看,有几个选项

    一个选项是在聚合之后派生一个新流,您可以对修改卡的“状态”的数据进行
    filter()
    ,例如过滤所有花费了
    >200个
    单位或
    >10个
    单位的事件。然后可以使用该流通知卡用户该卡已被使用,例如通过发送电子邮件。这是一种仅可通过DSL实现的方法

    当需要更大的灵活性或更严格的控制时,另一种选择是使用处理器API(您可以将其与DSL集成,以便您的大多数代码可以继续使用DSL),您可以自己实现聚合步骤(使用连接到
    转换器
    处理器
    的状态存储)。在聚合期间,您可以实现检查传入事件是否有效的逻辑(在您的示例中:具有9个单位的friend_3有效,具有11个单位的friend_2无效)。如果有效,聚合将增加卡的计数器(单位和使用),就是这样。如果无效,事件将被丢弃,并且不会修改计数器,
    转换器
    /
    处理器
    可以向另一个流发出新事件,通知卡用户类似地,您可以实现通知用户某张卡已被完全使用、某张卡不再可用或该卡的任何其他“状态更改”的功能

    此外,根据您想做什么,请查看Kafka Streams的功能。有时,其他应用程序可能希望快速查找(查询)某事物的最新状态,如卡的状态,这可以通过REST API等交互查询完成


    希望这有帮助!

    从我对您问题的理解来看,有几个选择

    一个选项是在聚合之后派生一个新流,您可以对修改卡的“状态”的数据进行
    filter()
    ,例如过滤所有花费了
    >200个
    单位或
    >10个
    单位的事件。然后可以使用该流通知卡用户该卡已被使用,例如通过发送电子邮件。这是一种仅可通过DSL实现的方法

    当需要更大的灵活性或更严格的控制时,另一种选择是使用处理器API(您可以将其与DSL集成,以便您的大多数代码可以继续使用DSL),您可以自己实现聚合步骤(使用连接到
    转换器
    处理器
    的状态存储)。在聚合期间,您可以实现检查传入事件是否有效的逻辑(在您的示例中:具有9个单位的friend_3有效,具有11个单位的friend_2无效)。如果有效,聚合将增加卡的计数器(单位和使用),就是这样。如果无效,事件将被丢弃,并且不会修改计数器,
    转换器
    /
    处理器
    可以向另一个流发出新事件,通知卡用户类似地,您可以实现通知用户某张卡已被完全使用、某张卡不再可用或该卡的任何其他“状态更改”的功能

    此外,根据您想做什么,请查看Kafka Streams的功能。有时,其他应用程序可能希望快速查找(查询)某事物的最新状态,如卡的状态,这可以通过REST API等交互查询完成


    希望这能有所帮助!

    Hi Michael,我的案例要求在交易进行或“不进行”时立即响应卡用户。电子邮件通知,即使几秒钟后,在这里也不是这样。当您使用事件流设置时(如Kafka),您选择的体系结构主要是异步的,而不是同步的。因此,我建议您重新考虑“即时响应”要求。(是同步请求/响应吗?是否可以接受一些异步延迟,如果可以,需要多少?)嗨,Michael,我的案例要求卡用户在交易进行或停止时立即响应“禁止”。电子邮件通知,即使几秒钟后,在这里也不是这样。当您使用事件流设置(如Kafka)时,您会选择一种架构