美文网首页
【2】Kafka Topic分区负载均衡策略

【2】Kafka Topic分区负载均衡策略

作者: 都是浮云啊 | 来源:发表于2019-10-27 11:14 被阅读0次

    [TOC]

    前言

    第一部分初识Kafka 简单了解了Kafka的基本结构和术语,其中提到过Kafka的分区模型。,在Kafka中,消息是以Topic为单位进行业务处理的,一个Topic会被分成若干个区,每个分区又有自己的主从体系。主题下的一条消息只会存在一个区里面,而不会在多个区中保存多份。那么为什么要分区呢,首先考虑下,如果没有分区的话,一个机器上只有一个Topic去处理海量的消息,这样系统的吞吐量会大大降低,没有办法去进行水平扩展。分区的作用就是为了在水平层面上进行kafka对消息处理能力的扩展。既然一个topic分成若干区分布在不同的机器上,就有一种期望,期望的是海量的消息要么均匀的分配到不同的机器上上,要么呢就按照自己指定的策略将消息分配到不同的机器上。这就是本文所要学习的负载均衡策略。关于负载均衡的前置知识可以参考 Dubbo的负载均衡

    1. 轮询策略

    这种策略最简单,就是顺序分配的一种策略。假设 Topic-A下面有3个分区,那么第一条消息存放到 Topic-A[0] 分区,第二个消息存放到 Topic-A[1] 分区,第三个消息存放到 Topic-A[2] 分区,第四个消息又从 Topic-A[0] 开始存放,依次下去。这个策略也是Kafka当前默认的负载均衡策略,如果没显式指定的话就会默认使用这个。适合场景的话就是比较适合我们所有的机器配置都一样的情况,这样消息会被均匀的存放到Topic的不同分区上,如下图所示:


    轮询负载均衡
    2. 随机策略

    这种听名字基本就可以猜出来意思了,就是消息将会随机存放到Topic下的某个分区中,它是Kafka老的版本的默认的分区负载均衡策略,也是为了尽量将消息均匀分配到不同的分区中,如下图所示。但是均匀这方面来看不如轮询策略,所以现在新版本的默认是轮询负载均衡策略。


    随机策略负载均衡
    3. 按照消息键策略

    这种策略依靠一定的策略生成的一个key,然后按照key的哈希值选择分区。比如按照业务、机器ip等方式去生成的,一旦key被定义了,那么所有该类key的消息都会被存放到相同的分区里。其实在现在的kafka版本中,如果指定了消息的key 的话,就会使用这种策略,如果没指定的话就会使用轮询策略。这个负载均衡有一个很大的用处,就是实现局部业务的顺序消息,比如我们有3个业务的消息需要顺序推送,如果只设置单分区,靠单分区来满足顺序性的话,kafka 的优势就被限制住了,在这里就可以针对这3个业务线设置产生key策略,不同业务的key放到不同的分区上,相同的key在一个分区内是绝对顺序的。这样的话既保证了消息的顺序性,也利用了Kafka的高吞吐量的特性。(注意:之前提到过Kafka不保证topic下的消息顺序,会保证分区的消息顺序,是用追加文件的日志方式记录的消息)


    指定key负载均衡策略
    4. 小结

    如果Kafka消息生产者指定的分区,那么没啥说的,消息直接分配到固定的分区。如果没指定分区,指定了key,就用key的哈希值计算到对应的分区将消息分配过去,如果都没指定,就使用轮询策略负载均衡将消息均匀的分配到不同的分区中

    相关文章

      网友评论

          本文标题:【2】Kafka Topic分区负载均衡策略

          本文链接:https://www.haomeiwen.com/subject/zdppvctx.html