Kafka是什么?为什么拥有异步、削峰、解耦?有哪些角色?

  • Post author:
  • Post category:其他


一、Kafka是什么?



Kafka是一个分布式消息中间件,支持分区的、多副本的、多订阅者的、基于zookeeper协调的分布式消息系统。

通俗来说: kafka就是一个存储系统,存储的数据形式为“消息”;

它的主要作用类似于蓄水池,起到一个缓冲作用;

二、为什么拥有解耦、异步、削峰?

(1)解耦

传统模式:

传统模式的缺点:

  • 系统间耦合性太强,如上图所示,系统A在代码中直接调用系统B和系统C的代码,如果将来D系统接入,系统A还需要修改代码,过于麻烦!

中间件模式:

中间件模式的的优点:

  • 将消息写入消息队列,需要消息的系统自己从消息队列中订阅,从而系统A不需要做任何修改。

(2)异步

传统模式:

传统模式的缺点:

  • 一些非必要的业务逻辑以同步的方式运行,太耗费时间。

中间件模式:

中间件模式的的优点:

  • 将消息写入消息队列,非必要的业务逻辑以异步的方式运行,加快响应速度

(3)削峰

传统模式

传统模式的缺点:

  • 并发量大的时候,所有的请求直接怼到数据库,造成数据库连接异常

中间件模式:

中间件模式的的优点:

  • 系统A慢慢的按照数据库能处理的并发量,从消息队列中慢慢拉取消息。在生产中,这个短暂的高峰期积压是允许的。

三、Kafka中有哪些角色?

1、



p




roducer



消息生产者,就是向kafka broker 发消息的客户端。

2、



consumer



consumer :消息消费者,从kafka broker 取消息的客户端。

consumer group:单个或多个consumer可以组成一个consumer group;这是 kafka 用来实现消息的广播(发给所有的 consumer)和单播(发给任意一个 consumer)的手段。一个 topic 可以有多个Consumer Group。




3、t




opic



数据的逻辑分类;可以理解为数据库中“表”的概念;

(1)partition:topic中数据的具体管理单元;(可以理解为hbase中表的“region”概念)

一个topic 可以划分为多个partition,分布到多个 broker上管理;

每个partition由一个kafka broker服务器管理;

partition 中的每条消息都会被分配一个递增的id(offset);

每个 partition 是一个有序的队列,kafka 只保证按一个 partition 中的消息的顺序,不保证一个 topic 的整体(多个 partition 间)的顺序。

每个partition都可以有多个副本;

分区对于 kafka 集群的好处是:实现topic数据的负载均衡。分区对于消费者来说,可以提高并发度,提高效率。

(2)broker

一台 kafka 服务器就是一个 broker。

一个kafka集群由多个 broker 组成。

一个 broker 可以容纳多个 topic的多个partition。

(3)offset

消息在底层存储中的索引位置,kafka底层的存储文件就是以文件中第一条消息的offset来命名的,通过offset可以快速定位到消息的具体存储位置;

4、



Leader



partition replica中的一个角色,producer和consumer只跟leader交互(



负责读写



)。

5、



副本Replica



partition的副本,保障partition的高可用(replica副本数目不能大于kafka broker节点的数目,否则报错。)

每个partition的所有副本中,必包括一个leader副本,其他的就是follower副本

6、



Follower



partition replica中的一个角色,从leader中拉取复制数据(



只负责备份



)。

如果leader所在节点宕机,follower中会选举出新的leader;

7、



偏移量Offset



每一条数据都有一个offset,是数据在该partition中的唯一标识(其实就是消息的索引号)。

各个consumer会保存其消费到的offset位置,这样下次可以从该offset位置开始继续消费;

consumer的消费offset保存在一个专门的topic(__consumer_offsets)中;(0.10.x版本以前是保存在zk中)

​​​​​​​8、



消息Message



在客户端编程代码中,消息的类叫做 ProducerRecord; ConsumerRecord;

简单来说,kafka中的每个massage由一对key-value构成

各个字段的含义介绍如下:

  1. crc:占用4个字节,主要用于校验消息的内容;
  2. magic:这个占用1个字节,主要用于标识 Kafka 版本。Kafka 0.10.x magic默认值为1
  3. attributes:占用1个字节,这里面存储了消息压缩使用的编码以及Timestamp类型。目前Kafka 支持 gzip、snappy 以及 lz4(0.8.2引入) 三种压缩格式;后四位如果是 0001 则表示 gzip 压缩,如果是 0010 则是 snappy 压缩,如果是 0011 则是 lz4 压缩,如果是0000则表示没有使用压缩。第4个bit位如果为0,代表使用create time;如果为1代表append time;其余位(第5~8位)保留;
  4. key length:占用4个字节。主要标识 Key的内容的长度;
  5. key:占用 N个字节,存储的是 key 的具体内容;
  6. value length:占用4个字节。主要标识 value 的内容的长度;
  7. value:

    value即是消息的真实内容

    ,在 Kafka 中这个也叫做payload。



版权声明:本文为qq_30612351原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。