在Kafka Consumer App中像在状态存储中一样使用Kafka Streams

时间:2019-02-20 22:35:40

标签: java spring spring-boot apache-kafka apache-kafka-streams

我目前正在使用Spring Kafka Consumer API开发Spring Boot应用程序。

我进入某个主题的每条消息都需要转换为具有其他主题其他属性的新对象类型。目前,这些其他主题尚未开发,我们正在使用内存数据的模拟版本来处理请求。

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

此外,当前,该应用程序仅是用于获取新订单的Spring Kafka侦听器。侦听器调用一个spring bean方法,该方法处理订单并创建一个新对象,该对象使用与我上面提到的相同的模拟方法写入另一个名为customer-order的输出主题。

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

我已经想到了该体系结构的一些选择...

  1. 我打算保留使用者API,即使用Spring侦听器实现接收新的订单消息,同时使用流依赖性仅创建状态存储,该状态存储最终将替换模拟的数据。想法是,模拟数据最终将来自其他主题。因此,在这种方法中,Kafka的“流”部分将仅用于创建状态存储,而不用于处理传入的记录。
  2. 使用纯粹的Kafka使用者API并使用API​​调用来获取我主题外部的数据。由于我不想为每个新订单都进行外部API调用,因此这是次优选的选择。
  3. 使用Kafka Streams读取新的传入订单以及收集和存储状态。另外,利用联接和合并来处理数据。

您有什么建议? 1,2或3?将Streams用于这种解决方案是一个好主意吗?将这种实现方式转换为使用Kafka流媒体有什么好处?还是我最好还是和2呆在一起??

1 个答案:

答案 0 :(得分:0)

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

在Kafka Streams中完全执行此操作不会出现任何问题,除非您有一些非常复杂的逻辑无法使用当前的API来实现,但我惊讶地发现您无法做到这一点。实际上,您所描述的内容听起来像是它的常规应用程序(警告是不了解其他需求,例如时间,预期数量等)。

好处:

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

缺点:

  • 这是一个JVM库,但似乎您已经在使用Java。
  • 必须学习新的范例-尽管实际上很简单。而且与其他流处理库非常相似,而且绝对简单。
  • 它与卡夫卡(实际上是其中的一部分)捆绑在一起。如果要移开红外线,则可能必须使用其他流处理器。
  • 根据您的用例,尤其是其复杂性,您可能会发现其他流媒体平台更有利(例如,Spark或Flink仅举两个例子)。
  • 它已经相当成熟,但可能比火花。情况越来越好,不过您有Confluent的人在努力。

这不是一个完整的列表,但这是我脑海中最重要的一点。