MQ: 一张图读懂kafka工作原理

1.关于kafka

Kafka是由Apache软件基金会开发的一个开源消息队列,由Scala和Java编写。

相关文章参考:

  • MQ: 消息队列常见应用场景及主流消息队列ActiveMQ、RabbitMQ、RocketMQ和Kafka的简单对比
  • MQ: kafka的Java接入与入门示例(topic增删改查,Producer多参发送,Consumer多分区接受)

2.工作原理

首先,我们来kafka的整体数据流架构图:

MQ: 一张图读懂kafka工作原理

为了便于理解,我们直接:

Broker与Topic

  • 图中的Broker集群实际是由3个Broker构成的,其实每个Broker就是一个Kafka服务节点。
  • 图中共有3个Topic:橙色为,提夫尼蓝为,深蓝色为。

Topic与Partition

  • 单看:Broker中消息容器的最小单元为Partition,Partition存储了一条条的消息。
  • 单看Broker-1:
    • Topic可有多个Partition,如有2个分区;若共计9条消息,则可能2个分区分别存储了4、5条消息。
    • Topic可只有1个Partition,如;若共计9条消息,则这个单独的分区存储了9条消息。
    • 分区存储哪条消息取决于Producer发送消息时的选择,相关内容后续章节介绍。

多副本冗余机制

  • 单看Topic-2:
    • 粗框Partition表示Leader(主)分区,负责读写消息;
    • 细框Partition表示Replicas(从)分区,被动复制Leader,复制冗余容灾。
    • 如果Broker-1挂掉,则的Leader挂掉,从其余两个Replicas中选举出新的Leader继续提供服务。
    • Replicas的数量不能超过Broker的数量,因为一个Broker上存在多个Replicas与存在一个Replicas的效果是一样的。
    • Replicas的数量可以小于Broker的数量。
  • 再看Topic-0:
    • 每个Partition都会有Leader和Replicas。
    • kafka会同一Topic的分区Leader,如图,3个Leader分布于3个Broker中。
    • 分区Leader的分散分布不是绝对的,比方说此时只有一个Broker,则3个分区都是Leader,都分布在同一个Broker上。
    • 分区的数量可以大于Broker的数量,因为分区存在的目的是加快消息消费速度,与冗余容灾无关。

相对有序性

  • Topic-0的3个分区的消息分别是:,,。
  • Topic-1的2个分区的消息分别是:,。
  • Topic-2的1个分区的消息是:。
  • 相对有序性:单个partition内消息有序,多个partition间消息无序。
  • kafka通过在Partition中标记offset,来记录消息的顺序。
  • 如果业务场景追求全局有序性,则每个Topic只配置一个Partition即可。

Producer消息生产语义

  • 消息最多发送一次:第一种方式:异步发送消息。第二种方式:同步发送消息并且重试次数为0。
  • 消息最少发送一次:同步发送消息,失败与超时重试,直到消息发送成功。

Partition、Replicas和Broker的计算方式

  • 假定Broker数量为n。
  • 将第i个Partition分配至第个Broker上。
  • 将第i个Partition的第j个Replica分片值第个Broker上。

2.3.消息生产相关

搞清楚消息的存储之后,我们再来看消息的生产:

MQ: 一张图读懂kafka工作原理

为了便于理解,我们直接:

消息消费方式

  • 消息消费的箭头方向:kafka消费消息的方式只有pull,没有push。
    • push的优势在于实时性高,但是容易因Producer生产消息过快压垮Consumer。
    • pull的优势在于可以控制消费速度,但是容易出现空轮训。
    • kafka对pull的优化:通过配置使得只有当数据存在且到达一定量级,才进行pull。

Consumer Group与Consumer

  • ⑥⑦:一个Consumer-Group可以有多个Consumer,也可以只有1个Consumer。
  • ⑤:一个Topic-Partition的消息可以被多个Consumer-Group消费,注意:是Consumer-Group,而不是Consumer。
  • ⑦:若Consumer-Group只有1个Consumer,则这个Partition中的所有消息都被这个Consumer消费。
  • ⑥:若Consumer-Group有多个Consumer,且在正常连接期间:
    • 单个Partition的消息只能被其中一个Consumer消费,不能被Consumer-Group内的多个Consumer消费。
    • 多个Partition的消息可以被一个Consumer消费。
    • 若单个Topic的分区数量小于Consumer-Group内的Consumer个数,则会存在Consumer接受不到这个Topic的消息。

Consumer消息消费语义

  • 消息最多消费一次:1.读取消息,2,确认offset,3.处理消息。
  • 消息最少消费一次:1.读取消息,2.处理消息,3.确认offset。

3.参考文献

  • https://blog.csdn.net/lavorange/article/details/78970977
  • https://blog.csdn.net/qq_29186199/article/details/80827085
  • https://www.jianshu.com/p/d3e963ff8b70
  • Kafka源码解读—-key为nulll时Kafka如何选择分区(Partition)
  • https://blog.csdn.net/caijiapeng0102/article/details/80765923

文章知识点与官方知识档案匹配,可进一步学习相关知识云原生入门技能树首页概览8829 人正在系统学习中

来源:hanchao5272

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年7月21日
下一篇 2019年7月21日

相关推荐