Kafka消费者的负载均衡机制

问题引入:目前有一个消费者来消费broker中topic的数据,假设每分钟可以消费400条消息,生产者目前每分钟生产400条。随着发展,生产者生产的速度越来越快,从原来400变更为1200条了,但是消费者每分钟仅能消费400,请问会出现什么问题,如何解决呢?

答:导致在broker端出现数据堆积问题,此时可以增加消费者,并且需要保证多个消费者都在同一个组内。

随着发展,生产者从原来1200提升1600条了.消费者每分仲只能消费400条,此时发送什么问题,如何解决呢?

答:导致在broker端出现数据堆积的问题在添加一个消费者即可,但是测试后发现,总有一个消费者无法消费数据如何解决呢?

  • 1-增加每个消费者的消费速度
  • 2-增加topic的分片数量,从而实现增加消费者数量

示例代码:

from kafka import KafkaProducer


if __name__ == '__main__':
    print('演示python的kafka API:生产者的异步发送模式')

    # 1.创建kafkaProducer对象
    producer = KafkaProducer(
        bootstrap_servers=['node1:9092', 'node2:9093', 'node3:9094'],
        acks=-1
    )

    # 2.执行生产者异步方案
    # 2.1 异步无返回值方案
    # producer.send('test_kafka', '我爱python'.encode('utf-8'))  # 默认是异步
    # producer.flush()

    # 表示当底层每一批数据发送成功后,都会调用此函数:add_callback
    def on_send_success(record_metadata):
        print(record_metadata.topic)
        print(record_metadata.partition)
        print(record_metadata.offset)

    # 表示当底层发送一批数据失败时,就会调用此函数:add_errback
    def on_send_error(excp):
        print(excp)
    # 2.2 异步有返回值方案
    for i in range(10):
        # hash取模策略
        future = producer.send('kafka_test', f'num:{i+1},我爱python'.encode('utf-8'))  # 默认是异步
        future.add_callback(on_send_success).add_errback(on_send_error)

    # 为了演示效果,不使用flush,而是采用休眠的方式
    # 注意:2.2时,如果此时程序运行结束,数据是没法发送到Kafka的
    import time
    time.sleep(100)

运行结果:  【当执行时,此时执行结果中3个组消费的数据是一样的,重复消费】

Kafka消费者的负载均衡机制_第1张图片

Kafka消费者的负载均衡机制_第2张图片

Kafka消费者的负载均衡机制_第3张图片

        出现上面的原因是开启的3个消费者不是同一个用户组的,导致分别消费,将--group改为同一个用户组时,将不会再重复消费数据,运行结果如下图所示:

Kafka消费者的负载均衡机制_第4张图片

Kafka消费者的负载均衡机制_第5张图片

        当开启同用户组的4个消费者时,竟然发现只能其中的3个可以消费数据,另外一个是不能消费数据的,这就是kafka的负载均衡。

消费者的负载均衡的机制规定:

        1-在一个消费者组内,消费者的数量最多和所监听的topic的分片数量是相等的,一旦有多余的消费者,那么必然会出现某些消费者处于闲置的状态。

        2-在一个消费者组内, topic的一个分片的数据,只能被一个消费者所消费,不允许出现一个分片被多个消费者所消费的情况是一个消费者可以消费多个分片的数据。

思考:如何实现点对点的消息模型和发布订阅的消息模型?

  • 点对点:把监听这个topic的消费者全部都放置在同一个消费者组内容,这样一个消息必然只能被组内一个消费者所接收到
  • 发布订阅:将各个消费者放置到不同的组内即可

你可能感兴趣的:(Kafka,kafka,分布式)