第三章:Kafka 组织的成员介绍和生产者发送消息机制(概念篇)

作者:pany

时间:2019-3-3 21:36

参考:Kafka 权威指南(Kafka :The Definitive Guide)

注:如果网上找不到这本书的资源,可以联系我,免费分享。微信:py1149050048

原书上翻译感觉有点拗口,我根据我的理解尽可能将内容描述的通俗易懂

@all 转载请注明出处

章节概要

本文主要讲解Kafka的诞生背景和解决了什么问题,主要章节如下:

           1、Kafka 组织的成员介绍

           2、生产发送消息机制

一、Kafka就是你们要的发布与订阅的消息系统

讲到这一章,我们的Kafka终于登场了,我再介绍Kafka之前,直接按自己的理解画了一张图,如下:


第三章:Kafka 组织的成员介绍和生产者发送消息机制(概念篇)_第1张图片
Kafka结构图

我们先基于这张图来说下Kafka这个组织的成员:

1、Producter:生产者,也就消息的发送者,产生者,负责向我们的分区里发送消息。

2、Consumer: 消费者,消息的订阅者,可以订阅一个或多个主题,并且依据消息生产的顺序读取他们

3、Broker:一个独立的Kafka服务器我们称为Broker,Broker接口来自生产者的消息,为消息设置偏移量(offset),并提交消息到磁盘。Broker为消费者提供服务,对读取分区的请求做出响应,返回已经提交到磁盘上的消息。

4、Consumer Group: 消费者群组,消费者是消费者群组的一部分,一个或多个消费者可以共同读取一个主题,但是每个分区只能被一个消费者使用

5、Partition:分区,一个分区就是一个提交日志,消息以追加的方式写入分区,这样可以保证在同一个分区里面,消息是有序的,但是整个主题里没办法保证消息是有序的。

6、批次:批次就是一组消息,Kafka之所以有高吞吐量的特性,就是因为将消息分批次发送,一个批次的消息同属于一个主题和分区。有关于批次和高吞吐量后面会详细介绍。

7、Offset:偏移量,消息的唯一标识,是连续的序列号

8、ISR:同步副本组,这个后面会详细介绍

9、Segment:Partition物理上由多个segment组成

二、Kafka生产者如何发送消息

我介绍学习Kafka的思路依然是顺着我上面画的那张图的,生产者将消息发布到Broker,我们顺着这条线先来了解下生产者如何发送消息的。说到消息的发送,就免不了需要讨论下下面几个问题:

1、消息的发送对网络的影响?

2、当有大量消息产生时,消息发送和获取是否有延迟?

3、消息的读写操作之间耦合性?

       为什么我们学习消息的发送会讨论上面几个问题呢?现实中一旦服务之间有通信,我们就会关心通信对网络流量、带宽这些是否有影响。而且我们也必须关注服务之间通信的时效性,是否有延迟。并且我们还得考虑到应用的扩展性,如果说服务之间通信的格式给固定,意味着一旦有一方作出升级时,可能会引起服务间通信不再正常,所以我们很关心消息的格式是否会对服务之间的读写操作产生强烈的耦合。而Kafka正好在这些方面都有很好的处理,我就依据这三个问题逐一去解读。

      Kafka为了减少消息对网络的影响,将相同主题的消息整成一个批次,也就是一组消息,这样就可以减少网络的开销。试想一下,如果同一时间产生了超大量的消息,而每一条消息都需要单独穿行于网络,发送到对端,我们得有产生多少连接,得造成大量的网络开销。但是如果我们将相同主题的消息放入一个批次,是不是可以减少网络的连接,是不是可以减少对网络的影响。

      但是消息以批次的形式发送之后,问题又来了,如果批次越大,单位时间内处理的消息就越多,单个消息的传输时间也会越长,这样消息就有可能产生延迟。有些场景下数据的时效性显得很重要,比如说设备的监控数据,我们设备实时的CPU使用率、内存使用率等,这与这些监控指标我们会更关心数据的时效性,如果不能保证消息实时接收到,那么数据将毫无意义。Kafka为了消息的时效性,于是将批次的消息压缩,提升数据传输效率。并且Kafka可以从两个维度去设定批次发送的标准。

      第一个维度是消息的大小,我们可以设定当一个批次达到多大,我们就可以发送了(这个设置的参数我们后面的章节会介绍,这里只是让大家了解到这么个思想,具体的实现后面介绍),比如我们设定一个批次消息达到100KB就开始发送到Broker,但是如果生产者产生的消息很少很慢,几分钟甚至于半小时都无法达到这个量怎么办呢?是不是我们的消息就不发送了?所以Kafka又依据第二个维度设定了标准。

      第二个维度是批次的时间,我们可以设定发送消息的频率,如果在指定时间内仍然无法满足大小,Kafka就会认为达到了时间维度的标准,也会发送消息,很好的解决了消息可能延迟的问题,保证了消息的时效性。当然,如果在指定时间内,消息提前达到了大小的标准,也会触发消息的发送,也就是说消息的发送是按两个维度的最低标准原则发送的。

      对于消息读写操作之间的强耦合,Kafka在消息发送前将消息系列化,读取的时候再将消息反序列化。序列化后的消息,分为模式(Schema)和 消息体(Data),而且Kafka推荐使用Apache Avro序列化器,它最初是Hadoop开发的序列化框架,提供一种紧凑的序列化格式,模式和消息体是分开的,当模式发生变化时,不需要重新生成代码,它还支持强类型和模式进化,版本既向前兼容,也向后兼容。(这里描述有点概念化,后面我们会详细介绍)

你可能感兴趣的:(第三章:Kafka 组织的成员介绍和生产者发送消息机制(概念篇))