Java 将Kafka Streams用作Kafka消费者应用程序中的状态存储

Java 将Kafka Streams用作Kafka消费者应用程序中的状态存储,java,spring,spring-boot,apache-kafka,apache-kafka-streams,Java,Spring,Spring Boot,Apache Kafka,Apache Kafka Streams,我目前正在使用SpringKafka消费API开发SpringBoot应用程序 我得到的每一条主题消息都需要转换成一种新的对象类型,并带有来自其他主题的附加属性。目前,这些其他主题尚未开发,我们正在使用内存中数据的模拟版本来处理请求 例如,新的“购物订单”消息到达,但我使用模拟的“客户”对象和模拟的“项目”对象来处理订单。计划是使用真实客户主题和真实项目主题 此外,目前,该应用程序仅用于获取新订单的SpringKafka侦听器。监听器调用一个Springbean方法,该方法处理订单并创建一个新对

我目前正在使用SpringKafka消费API开发SpringBoot应用程序

我得到的每一条主题消息都需要转换成一种新的对象类型,并带有来自其他主题的附加属性。目前,这些其他主题尚未开发,我们正在使用内存中数据的模拟版本来处理请求

例如,新的“购物订单”消息到达,但我使用模拟的“客户”对象和模拟的“项目”对象来处理订单。计划是使用真实客户主题和真实项目主题

此外,目前,该应用程序仅用于获取新订单的SpringKafka侦听器。监听器调用一个Springbean方法,该方法处理订单并创建一个新对象,该对象将通过使用我上面提到的相同模拟写入另一个名为customer order的输出主题

我们目前正在考虑改进此应用程序的体系结构。我一直在读卡夫卡流。我在网上阅读的有关streams的文档仅举了一些简单的例子,如单词计数、连接等。由于我对streams的知识有限,我不打算使用诸如计算总数等功能

我已经想到了一些架构的选择

  • 我计划保留消费者API,即使用Spring侦听器实现来接收新订单消息,同时使用streams依赖项来创建状态存储,最终替换模拟数据。这个想法是,模拟数据最终将来自其他主题。因此,在这种方法中,卡夫卡的“流”部分将仅用于创建状态存储,而不用于处理传入的记录
  • 使用纯Kafka consumers API并使用API调用获取主题外部的数据。这是一个不太受欢迎的选项,因为我不想为每个新订单进行外部API调用
  • 使用卡夫卡流既可以读取新的传入订单,也可以收集和存储状态。另外,利用连接和合并来处理数据

  • 你有什么建议?1,2,还是3?在这种解决方案中使用流是一个好主意吗?将此实现移动到使用Kafka流媒体有什么好处吗?还是我最好和2呆在一起?

    我觉得1号听起来很奇怪。您可以让KafkaStreams应用程序通过交互式查询公开状态存储,但这看起来更像是2。您还必须考虑如何部署实例,并确保Spring部分和KafkaStreams部分之间的协同分区

    我认为在Kafka Streams中完全实现它不会有任何问题,除非您有一些非常复杂的逻辑无法用当前API实现,我很惊讶地发现您不能。实际上,您所描述的内容听起来像是it的一个常见应用程序(需要注意的是,不知道其他需求,如时间、预期容量等)

    好处:

    • 它在消费和生产上创建了一个抽象层。例如,像Order Consumer enrichment这样的东西听起来很好地使用了它,正如您所提到的那样,它使用了join
    • 消除了部署应用程序的复杂性—它使用了与Kafka代理相同的分区分配和重新平衡方案。您可以无缝地添加/删除处理实例
    • 它比其他流处理器库更简单,但在大多数情况下,它已经足够了(如果您需要更多DIY内容,除了DSL之外,您还有处理器API)
    • 开发速度。一旦你掌握了基本的it知识(这并不难),你就可以很快开始编写应用程序,因为你专注于逻辑
    • 文档处理得很好
    缺点:

    • 这是一个JVM库,但您似乎已经在使用Java了
    • 必须学习一种新的范例——尽管它实际上非常简单。而且与其他流处理库非常相似,而且肯定更简单
    • 它与卡夫卡有关(实际上是卡夫卡的一部分)。如果您要将infra移开,可能需要使用不同的流处理器
    • 根据您的用例,尤其是其复杂性,您可能会发现其他流媒体平台更为有利(例如Spark或Flink,仅举两个例子)
    • 它相当成熟,但可能比Spark要少。它正在变得更好,不过你有人在做它

    这不是一个全面的列表,但它是我脑海中最重要的一点。

    第一点听起来很奇怪。你可以让KafkaStreams应用程序通过交互式查询公开状态存储,但这看起来更像是第二点。你还必须考虑如何部署实例并确保-Spring部分和KafkaStreams部分之间的分区

    我不认为完全在Kafka Streams中实现它有任何问题,除非您有一些非常复杂的逻辑无法用当前API实现,我很惊讶地发现您不能实现。实际上,您所描述的听起来像是一个普通的应用程序(需要注意的是,不知道其他需求,如时间、预期容量等)

    好处:

    • 它在消费和生产上创建了一个抽象层。例如,通过使用您提到的连接,Order Consumer enrichment听起来是一个很好的使用它的方法
    • 消除了部署应用程序的复杂性—它使用与Kafka代理相同的分区分配和重新平衡方案。您可以无缝地添加/删除处理实例
    • 它比其他流处理器库更简单,但在大多数情况下,它已经足够了(如果您需要更多DIY内容,除了DSL之外,您还有处理器API)
    • 开发速度。一旦你掌握了it的基本知识(这并不难),你就可以很快开始编写应用程序,因为你