多处理卡夫卡消息

时间:2019-01-28 08:56:52

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

我们有一个kafka使用者,它不断轮询kafka主题并处理消息。 我们面临的问题是我们应该为max.poll.records付出多少价值。 为了处理每个消息,我们有3个rest调用。 我正在做的是使用并行流将消息获取为列表和进程。 实例具有2GB的内存空间,max.poll.records为8。 因此,现在如果我增加max.poll.records,则消息处理时间会增加,并且当max.poll.records为4时,它的执行效果最佳。 您能否阐明一下我们如何使用1个分区(而不是获取)使用1个实例来增强消息的并行处理 8条消息,我还能设法使它处理5条消息左右。

更新:- 下面是内存配置,我正在pcf中部署独立应用程序。

JVM内存配置:

-Xmx1422566K -Xss1M -XX:ReservedCodeCacheSize=240M -XX:MaxDirectMemorySize=10M -XX:MaxMetaspaceSize=162585K

2 个答案:

答案 0 :(得分:0)

max.poll.records不会影响并行度。根据{{​​3}}

  

max.poll.records:单个记录中返回的最大记录数   调用poll()。

如果增加此配置的值,则可以在每次轮询中获取更多记录,但这并不意味着您将并行处理消息。

Kafka中的并行度由分区的数量和正在运行的使用者实例的数量控制。

Kafka主题分为多个分区,这些分区通过将数据拆分到多个代理中来实现并行性。多个分区使多个使用者可以并行读取主题。因此,为了实现并行处理,您需要将主题划分为多个分区。

为了增加现有主题的分区数量,您可以简单地运行

bin/kafka-topics.sh --zookeeper localhost:2181 --alter --topic topicName --partitions 10

这不会移动现有数据

有关消费者,消费者组和分区的说明
如果您有N个分区,则在同一使用者组中最多可以有N个使用者,每个使用者都从一个分区读取。当使用者少于分区时,某些使用者将从多个分区中读取数据。同样,如果您的使用者数量大于分区数量,则某些使用者将处于非活动状态,并且将不会从这些实例接收任何消息。

答案 1 :(得分:0)

作为 Giorgos 答案的补充,此说明来自Kafka the definitive guide

选择数量时要考虑几个因素 分区:

  
      
  • 您期望该主题的吞吐量是多少?例如,您希望每秒写入100 KB或每秒写入1 GB?
  •   
  • 从单个分区使用时,您期望达到的最大吞吐量是多少?您最多将只有一名消费者   从分区读取,所以如果您知道您的慢消费者   将数据写入数据库,而该数据库再也无法处理更多   每个线程每秒写入它的速度超过50 MB,那么您知道   从分区使用时,您的吞吐量限制为60MB。
  •   
  • 您可以进行相同的练习来估计单个分区的每个生产者的最大吞吐量,但是由于生产者   通常比消费者快得多,因此跳过通常是安全的   这个。
  •   
  • 如果您要根据密钥将消息发送到分区,则以后添加分区可能非常困难,因此请计算吞吐量   基于您的预期未来使用量,而不是当前使用量。
  •   
  • 考虑要在每个代理上放置的分区数以及每个代理的可用磁盘空间和网络带宽。
  •   
  • 避免高估,因为每个分区都使用代理上的内存和其他资源,并且会增加领导者的时间   选举。
  •   
     

考虑到所有这些,很明显,您需要许多分区,但是   不是很多。

     

如果您对目标有一些估计   主题的吞吐量和使用者的预期吞吐量,您可以划分   目标吞吐量(通过预期的使用者吞吐量)并以此方式得出分区数。所以如果我   希望能够从一个主题读写1 GB /秒,我知道   每个消费者只能处理50 MB / s,那么我至少需要20 MB   分区。这样,我可以让20位消费者从该主题中阅读   并达到1 GB /秒。如果您没有这些详细信息,我们的   经验表明,限制分区上的分区大小   每天少于6 GB的磁盘通常可以令人满意   结果。