Apache kafka 卡夫卡消费者阅读信息平行

Apache kafka 卡夫卡消费者阅读信息平行,apache-kafka,Apache Kafka,在kafka中,我们可以从一个主题中使用多个消费者来实现并行处理吗。 我的用例是并行地从单个分区读取消息 简单地说,默认情况下,我们无法为使用者实现分区级并行 但是你可以试试。一旦浏览了这些文档。简单地说,默认情况下,我们无法为使用者实现分区级并行 但是你可以试试。浏览这些文档后。分区的数量定义了从卡夫卡主题读取的并行级别。但阅读(或多或少)只受到你的网络容量的限制 一个好的模式是将消息的读取和处理分开(每个主题分区一个线程用于读取,多个线程用于处理这些消息) 分区的数量定义了从卡夫卡主题读取的

在kafka中,我们可以从一个主题中使用多个消费者来实现并行处理吗。
我的用例是并行地从单个分区读取消息

简单地说,默认情况下,我们无法为使用者实现分区级并行


但是你可以试试。一旦浏览了这些文档。

简单地说,默认情况下,我们无法为使用者实现分区级并行


但是你可以试试。浏览这些文档后。

分区的数量定义了从卡夫卡主题读取的并行级别。但阅读(或多或少)只受到你的网络容量的限制


一个好的模式是将消息的读取和处理分开(每个主题分区一个线程用于读取,多个线程用于处理这些消息)

分区的数量定义了从卡夫卡主题读取的并行级别。但阅读(或多或少)只受到你的网络容量的限制


一个好的模式是将消息的读取和处理分开(每个主题分区一个线程用于读取,多个线程用于处理这些消息)

是的,您可以使用许多Kafka使用者并行处理消息,但如果您只有一个分区,则不可能

Kafka中的并行性是由分区的数量定义的,您可以随时轻松地对主题重新分区以创建更多分区

下面是一个如何并行处理消息的示例,它使用了一个库来简化Kafka并行消费

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();
}
publicstaticvoidmain(字符串[]args){
ConsumerConfig.builder()
.prop(键\反序列化器\类\配置,StringDeserializer.CLASS.getName())
.prop(值\反序列化器\类\配置,StringDeserializer.CLASS.getName())
.prop(组ID配置,“股票”)
.主题(“库存变化”)
.消费者(7)
.回调((ctx,记录)->{
System.out.printf(“状态=已消耗,值=%s%n”,record.value());
})
.build()
.消费()
.waitFor();
}

是的,您可以使用多个Kafka使用者并行处理消息,但如果只有一个分区,则不可能

Kafka中的并行性是由分区的数量定义的,您可以随时轻松地对主题重新分区以创建更多分区

下面是一个如何并行处理消息的示例,它使用了一个库来简化Kafka并行消费

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();
}
publicstaticvoidmain(字符串[]args){
ConsumerConfig.builder()
.prop(键\反序列化器\类\配置,StringDeserializer.CLASS.getName())
.prop(值\反序列化器\类\配置,StringDeserializer.CLASS.getName())
.prop(组ID配置,“股票”)
.主题(“库存变化”)
.消费者(7)
.回调((ctx,记录)->{
System.out.printf(“状态=已消耗,值=%s%n”,record.value());
})
.build()
.消费()
.waitFor();
}

是的。这是我们目前计划做的事情。但这里的问题是,我们不能在处理时再次重新处理失败的消息。“我们不能再次重新处理消息”是什么意思?您的意思是消息处理可能由于某种原因而失败,您需要稍后再试吗?我可以看到两种可能的操作:关闭自动偏移提交,并在处理某个批时手动执行此操作。选项二:将此事件发送到您也使用的死信主题。第二个选项似乎不错。我会尝试。谢谢您请小心使用此选项-我建议为发送到死信主题的消息添加一些计数器或最后处理时间戳(只是为了避免一次又一次地处理同一消息)是的。这是我们目前计划做的。但是这里的问题是,我们不能在处理时再次重新处理失败的消息。你说的“我们不能再次重新处理消息”是什么意思?您的意思是消息处理可能由于某种原因而失败,您需要稍后再试吗?我可以看到两种可能的操作:关闭自动偏移提交,并在处理某个批时手动执行此操作。选项二:将此事件发送到您也使用的死信主题。第二个选项似乎不错。我会尝试。谢谢您请小心使用此选项-我建议为发送到死信主题的消息添加一些计数器或最后处理时间戳(只是为了避免一次又一次地处理同一消息)请编辑问题,将其限制为特定问题,并提供足够详细的信息,以确定适当的答案。避免同时问多个不同的问题。请参阅“如何询问”页面,以获得澄清此问题的帮助。此外,请说明您已经做了哪些研究,例如阅读卡夫卡文献。请编辑问题,将其限制在特定问题,并提供足够详细的信息,以确定适当的答案。避免同时问多个不同的问题。请参阅“如何询问”页面,以获得澄清此问题的帮助。此外,请说明您已经做了哪些研究,例如阅读卡夫卡文献。