• kafka中partition的概念,解决kafka消费瓶颈


    最近开发一个项目,需要迁移大数据量,所以用到kafka,但消费速度一直不快,部分java代码如下

    解释:服务端用kafkaTemplate去发送数据

    解释:客户端开15个接收端去消费数据

    但是消费端一直速度很慢,最后经过我们领导的指点,发现kafka有个参数partition需要调优。

    百度了下相关参数知识,总结如下:

    1个partition只能被同组的一个consumer消费,同组的consumer则起到均衡效果

    消费者多于partition

    topic: test 只有一个partition

    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test

    在g2组中启动两个consumer,

    1. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer_g2.properties
    2. bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning --consumer.config config/consumer_g2.properties

    消费者数量为2大于partition数量1,此时partition和消费者进程对应关系如下:

    bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --group g2
    TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
    test 0 9 9 0 consumer-1-4a2a4aa8-32f4-4904-9c16-1c0bdf7128a2 /127.0.0.1 consumer-1
    - - - - - consumer-1-fd7b120f-fd21-4e07-8c23-87b71c1ee8a5 /127.0.0.1 consumer-1

     备注:消费者consumer-1-fd7b120f-fd21-4e07-8c23-87b71c1ee8a5无对应的partition。


    用图表示为

    如上图,向test发送消息:1,2, 3,4,5,6,7,8,9
    只有C1能接收到消息,C2则不能接收到消息,即同一个partition内的消息只能被同一个组中的一个consumer消费。当消费者数量多于partition的数量时,多余的consumer消费者空闲。
    也就是说如果kafka配置里只配了一个partition,你在同一组topic里启动多少个consumer都没用,partition的数量决定了消费者consumer在此topic中被均衡的程度。例如partition=4,则在同一组中最多被4个consumer均衡消费。

    消费者少于和等于partition

    topic:test2包含3个partition

    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 3 --topic test2

    开始时,在g3组中启动2个consumer,

    1.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties
    2.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties

    则对应关系如下:

    TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
    test2 0 8 8 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
    test2 1 7 7 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
    test2 2 8 8 0 consumer-1-f362847d-1094-4895-ad8b-1e1f1c88936c /127.0.0.1 consumer-1

    其中,consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c对应了2个partition


    用图表示为:

    消费者数量2小于partition的数量3,此时,向test2发送消息1,2,3,4,5,6,7,8,9
    C1接收到1,3,4,6,7,9
    C2接收到2,5,8
    此时P1、P2对对应C1,即多个partition对应一个消费者,C1接收到消息量是C2的两倍

    然后,在g3组中再启动一个消费者,使得消费者数量为3等于topic2中partition的数量

    3.bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test2 --from-beginning --consumer.config config/consumer_g3.properties

    对应关系如下:

    TOPIC PARTITION CURRENT-OFFSET LOG-END-OFFSET LAG CONSUMER-ID HOST CLIENT-ID
    test2 0 8 8 0 consumer-1-8b872ef7-a2f0-4bd3-b2a8-7b26e4d8ab2c /127.0.0.1 consumer-1
    test2 1 7 7 0 consumer-1-ab472ed5-de11-4e56-863a-67bf3a3cc36a /127.0.0.1 consumer-1
    test2 2 8 8 0 consumer-1-f362847d-1094-4895-ad8b-1e1f1c88936c /127.0.0.1 consumer-1

    此时,partition和消费者是一对一关系,向test2发送消息1,2,3,4,5,6,7,8,9
    C1接收到了:2,5,8
    C2接收到了:3,6,9
    C3接收到了:1,4,7
    C1,C2,C3均分了test2的所有消息,即消息在同一个组之间的消费者之间均分了。

    参考网址:https://www.cnblogs.com/sa-dan/p/8080197.html

  • 相关阅读:
    仿造email后缀自动添加功能(1)
    仿造email后缀搜索功能(2)
    取出input内的空格
    小知识点
    关于闭包
    js清除浏览器缓存的几种方法
    动态生成模板(模板生成器)
    安卓端调用h5界面js方法和ios端调用h5界面js方法
    linux 命令
    如何做个好员工
  • 原文地址:https://www.cnblogs.com/supiaopiao/p/14507077.html
Copyright © 2020-2023  润新知