Kafka消费者可以并行处理多条消息

时间:2016-02-24 04:06:44

标签: apache-kafka rx-java kafka-consumer-api

想知道是否可以并行地读取和处理Kafka使用者(Java客户端)的多条消息。我的意思是使用多个线程......我应该使用rxJava吗?

1)这样做是否很好? 2)而且根据我的理解,卡夫卡甚至将每个线程视为消费者......如果我错了,请纠正我......

3)并且还希望将Java客户端作为守护进程服务在Linux中运行,以便它连续运行并轮询Kafka以获取消息,读取和处理相同的...这是一个很好的方法..

2 个答案:

答案 0 :(得分:1)

Kafka支持按分区并行处理消息,您可以为一个kafka客户端启动多个消费者,一个或多个分区,而kafka也可以通过此模式支持同一分区中的序列处理。

当然,您可以启动多个线程来处理一个消费者中的多个消息,但无法确保一个分区中的序列处理。

答案 1 :(得分:0)

好的,这里有很多问题

<块引用>

想知道是否可以通过 Kafka 消费者(Java 客户端)并行读取和处理多条消息

用于 Java 的 kafka 客户端仅支持串行处理,您可以通过创建多个线程和每个线程一个使用者,将 kafka 使用者并行化到您的主题拥有的 partitions 数量,尽管线程很棘手,但我建议你使用一些库来实现这一点,例如rapids-kafka-client

public static void main(String[] args){
  ConsumerConfig.<String, String>builder()
      .prop(KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName())
      .prop(VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName())
      .prop(GROUP_ID_CONFIG, "stocks")
      .topics("stock_changed")
      .consumers(7)
      .callback((ctx, record) -> {
        System.out.printf("status=consumed, value=%s%n", record.value());
      })
      .build()
      .consume()
      .waitFor();
}
<块引用>
  1. 这样做是个好方法吗???

是的,没问题,创建分区是为了使并行成为可能

<块引用>
  1. 而且根据我的理解,Kafka 甚至将每个线程都视为消费者......如果我错了,请纠正我......

在 Kafka vanilla 客户端库上,消费者是一个能够从一个主题的一个或多个分区下载消息的类,该客户端本身不支持多个线程,您可以创建多个线程或使用一些库(例如 Rapids- kafka-client) 用于此目的,因此您可以为不同的主题分区创建多个使用者,然后并行使用。

<块引用>
  1. 并且还想让 Java 客户端作为守护进程在 Linux 中运行,以便它持续运行并轮询 Kafka 以获取消息、读取和处理相同的消息..这是一个好方法吗..

是的,使用库,编写代码,发布 jar,运行它并让它继续处理数据