Java中的几种Kafka客户端比较介绍

在这篇博客中,我介绍了在Java中定义Kafka消费者的各种方法。Spring、Micronaut、Vert.x和Akka Streams在引擎盖下使用kafka-clients库,并提供完整的功能集来消费Kafka消息。

Kafka 是一个著名的事件流平台。我们在很多项目中使用它。没什么不寻常的——工具很棒。各种框架和库提供与 Kafka 的集成。在这篇文章中,我想介绍其中一些 Java 语言,看看我们如何创建一个客户实例,用来读取Kafka消息:

连接到 Kafka 的第一种方法是使用 kafka-clients 库 中的KafkaConsumer类。其他库或框架集成通常使用该库。在本节中,我将重点介绍直接使用它。虽然它非常简单,但我们需要付出一些努力来提高效率。

首先,我们希望我们的消费者持续工作。因此,我们将在单独的线程中运行它,我们需要自己管理它。此外,我们需要将轮询放入不定式循环中。

另一件事是关闭消费者,这可能很棘手。我们可以关闭线程并使用超时来关闭套接字和网络连接。然而,采用这种方法,我们错过了两个要点:

  1. 显式关闭消费者会立即触发重新平衡,因为组协调员没有发现消费者因丢失心跳而离开。
  2. 该操作也会完成待处理的偏移量提交。因此,在再次运行消费者之后,我们不会两次消费某些消息。

接下来,如果我们想并行消费消息,我们需要提供一个自定义的解决方案来在同一个消费者组中运行特定数量的消费者。然而,每个消费者都需要两个线程——一个用于轮询,另一个用于心跳。

在消息的批量消费方面,我们在轮询一个队列后得到一个记录集合(可能为空)。因此,我们不必提供任何特定的配置或机制。

当我们想流式传输接收到的数据时,我们可以使用 JDK 的 Stream API。但是如果我们想 并行使用它们, 情况就会变得复杂。更复杂的代码变得更容易出错。

默认情况下,消费者会自动提交偏移量。但是,我们可以更改这一点并手动完成工作。API 为我们提供了几种同步或 异步 调用操作的方法。此外,我们可以提交从队列上最后一次轮询收到的所有消息的所有偏移量,或者提供特定的主题分区值。

使用普通的 Kafka 消费者,我们处理ConsumerRecord包含消息本身及其元数据的实例。它本身并不是一个缺点。但是,如果我们想解析它,我们需要提供我们的机制。

所以,总的来说,我会谨慎使用这种方法,而是考虑其他可用的可能性。那么,让我们看看如何在一些框架或工具包中使用 Kafka。

Spring Boot 

当您在项目中使用 Spring Boot 时,您可以 使用 Spring for Kafka 集成。它提供了一种方便的监听器机制来实现对 Kafka 消息的消费。

我们可以通过两种方式消费消息:

  • 使用消息侦听器的容器,
  • 或通过提供带有@KafkaListener注释的类。

当我们想使用消息侦听器方法时,我们需要提供两种类型的容器之一来运行我们的侦听器:

  • KafkaMessageListenerContainer— 在单个线程上为容器配置中提供的所有主题提供消息消费,
  • ConcurrentMessageListenerContainerKafkaMessageeListenerContainer— 允许在多线程环境中使用消息,为每个线程提供一个消息。

容器具有丰富的 API,允许我们设置各种配置参数(如线程、批处理、确认、错误处理程序等)。重要的是要设置一个监听器类——一个消息驱动的 POJO。MessageListener它是orBatchMessageListener接口的一个实例。两者都是基本的,允许我们使用类型化的 ConsumerRecord 实例。Spring 还提供了 其他更复杂的接口 。

然而,在 Spring 中使用 Kafka 消息最直接的方法是使用@KafkaListener注解实现一个 bean。处理接收到的消息的方法的签名可能会有所不同。您将使用的输入参数取决于您的需要,并且有很多可能性(有关详细信息,请查看注释 javadocs)。在启动时,Spring 会查找注解使用情况(带有注解的类必须是 Spring 组件)并创建运行在侦听器中定义的逻辑的 Kafka 消费者。

@Component
<b>public</b> <b>class</b> KafkaListenerConsumer {
    @KafkaListener(topics = <font>"${spring.kafka.consumer.topic}"</font><font>, groupId = </font><font>"${spring.kafka.consumer.group-id}"</font><font>)
    <b>public</b> <b>void</b> processMessage(List<Message<String>> content) {
        </font><font><i>// processing logic comes here</i></font><font>
    }
}
</font>

默认情况下,@KafkaListener在单个线程中运行——我们不会并行使用来自主题分区的消息。但是,我们可以通过两种方式改变这种行为。

第一个是定义concurrency注解的参数,我们可以在其中设置给定侦听器正在使用的线程数。

@Component
<b>public</b> <b>class</b> KafkaListenerConsumer {
    @KafkaListener(
            concurrency = <font>"2"</font><font>,
            topics = </font><font>"${spring.kafka.consumer.topic}"</font><font>, groupId = </font><font>"${spring.kafka.con
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值