zoukankan      html  css  js  c++  java
  • kafka分区及消费组概念

    分区和消费组是kafka提高性能的主要方式,其理念为多组件协作,共同完成数据读写任务,两者的相关原理及关系如下:

    一:分区

    kafka的数据层级为:主题->分区->消息。即:kafka可有多个主题,每个主题可以有多个分区,每个分区可以有多条消息。

    这里是分区概念类似于数据库sql server分区概念。例如,我有9条数据1-9,我可以把数据1,2,3分到分区1,把4,5,6分到分区2,把7,8,9分到分区3。分区就是把数据分别存储到不同区的意思,把所有分区的数据汇集到一起,就是一个主题的全部数据。

    当然,kafka有多种数据分配策略:

    轮询策略

    所谓轮询策略,即按顺序轮流将每条数据分配到每个分区中。

    举个例子,假设主题test有三个分区,分别是分区A,分区B和分区C。那么主题对接收到的第一条消息写入A分区,第二条消息写入B分区,第三条消息写入C分区,第四条消息则又写入A分区,依此类推。

    轮询策略是默认的策略,故而也是使用最频繁的策略,它能最大限度保证所有消息都平均分配到每一个分区。除非有特殊的业务需求,否则使用这种方式即可。

    随机策略

    随机策略,也就是每次都随机地将消息分配到每个分区。其实大概就是先得出分区的数量,然后每次获取一个随机数,用该随机数确定消息发送到哪个分区。

    在比较早的版本,默认的分区策略就是随机策略,但其实使用随机策略也是为了更好得将消息均衡写入每个分区。但后来发现对这一需求而言,轮询策略的表现更优,所以社区后来的默认策略就是轮询策略了。

    按键保存策略

    按键保存策略,就是当生产者发送数据的时候,可以指定一个key,计算这个key的hashCode值,按照hashCode的值对不同消息进行存储。

    至于要如何实现,那也简单,只要让生产者发送的时候指定key就行。欸刚刚不是说默认的是轮询策略吗?其实啊,kafka默认是实现了两个策略,没指定key的时候就是轮询策略,有的话那激素按键保存策略了。

    上面有说到一个场景,那就是要顺序发送消息到kafka。前面提到的方案是让所有数据存储到一个分区中,但其实更好的做法,就是使用这种按键保存策略。

    让需要顺序存储的数据都指定相同的键,而不需要顺序存储的数据指定不同的键,这样一来,即实现了顺序存储的需求,又能够享受到kafka多分区的优势,岂不美哉。

    以上三种策略内容引自:https://www.cnblogs.com/listenfwind/p/12465409.html

    二:消费组

    消费组以gourpid进行区分,一个主题可以被一个或者多个消费组消费。原则为:每个消费组都会完整消费到这个主题的所有数据,但是,消费组内的消费者之间为差别合作关系,而非独立获取关系,即:假设一个消费组有2个(最简单情况)消费者,消费者A消费了一部分数据,那么另一个消费者B只能消费到其余数据,两个消费者消费的数据不存在重复。特点总结如下:

    1)每个消费者组下面可以有一个或多个消费者实例,而消费者实例可以是一个进程,也可以是一个线程

    2)每个消费者组都具有一个用来唯一标识的字符串形式的ID,即group.id 

    3)每个消费者组订阅的topic下的每个partition分区只能分配给该消费者组下的一个消费者实例(当然该分区也还可以被分配给其它的消费者组)

    ————————————————
    以上三种特点引自:https://blog.csdn.net/weixin_43230682/article/details/107323004

    三:分区和消费组关系

    1.分区多,消费组内的消费者少

    假设一个主题的分区有3个,消费者只有2个,那么最终的结果是,其中一个消费者获得2个分区的数据,另一个消费者获得剩余的一个分区数据。

    2.分区少,消费组内消费者多

    如果存在这种情况,说明僧多肉少,那么最终的结果为:多余的消费者没法对应到分区,也没法获取到分区的数据。而对应到分区的消费者可以正常获取到数据。

    3.分区和消费组内的消费者一样多

    如果分区数量和消费组内的消费者一样多,则每个消费者都会对应到一个分区,并获取到分区内的数据,这些数据组合起来就是一个完整的主题数据。

    4.一个分区对应多个消费者组

    每个消费者组都会获取到完整的主题数据,但每个消费者组内的消费者获取情况,需参照以上三种情况。

    参考链接:

    https://www.cnblogs.com/listenfwind/p/12465409.html

    https://blog.csdn.net/weixin_43230682/article/details/107323004

    文章出处:www.cnblogs.com/jizhong

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。否则保留追究法律责任的权利。

  • 相关阅读:
    AngularJS数据建模(转载)
    Entity Framework Code First ---EF Power Tool 和MySql一起使用遇到的问题
    EF开发程序经常用的几个东西
    jQuery插件---轻量级的弹出窗口wBox
    SQL Server 索引维护sql语句
    windows server2008 r2 下启用 sqlserver 2008的远程连接
    windows2012 r2 提高网速方法
    jQuery validation
    Bootstrap Modal 垂直居中
    shell 循环读取文件及字符串转为数组
  • 原文地址:https://www.cnblogs.com/jizhong/p/15407706.html
Copyright © 2011-2022 走看看