? ? ? ? 本文是Kafka系列文章的第一篇,将带你了解Kafka的核心术语及其应用场景,后续会逐步探索其各方面的原理及应用场景。下面先看一张大概得简图,涉及Kafka的功能、原理等等,后续不断深入介绍,欢迎关注。
????????消息中间件(message queue middleWare, MQ)指利用高效可靠消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程通信。一般有两种传递模式:点对点模式和发布订阅模式。点对点的模式是基于队列的,消息生产者发送消息到队列,消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。发布订阅模式定义了如何向一个内容节点发布和订阅,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,消息订阅者从主题中订阅消息。
????????消息中间件将消息路由给应用程序B,这样消息可以完全存在于两台不同的计算机上。消息中间件负责网络通信,如果网络不可用,消息中间件会存储消息直到连接可用。
????????Kafka还提供了大多消息系统难以实现的消息顺序保障和回溯消费的功能。
????????kafka是Scala语言开发的一个多分区、多副本且基于zookeeper协调的分布式消息系统。他具有三个功能。
? ? ? ? 第一个是消息中间件的功能,上边已经描述。
????????第二个是存储功能,Kafka把消息存储到磁盘,相比于其他基于内存的存储系统而言,有效的降低了数据丢失的风险。这也正得益于Kafka的消息持久化和多副本机制。
? ? ? ? 第三个是流式处理,Kafka不仅为每个流行的流式处理框架提供了可靠的数据源,还提供了一个完整的流式处理类库。
? ? ? ? 消息中间件主要又3部分组成:
? ? ? ? Kafka中有两个重要概念,分别是主题(Topic)和分区(partion),消息是以主题进行分类的,生产者负责将消息发送到特定主题中,而消费者负责订阅消息。消息发送到broker前,会根据分区规则选择存储到具体哪个分区中。
? ? ? ? kafka的分区引入了多副本(Replcia)机制,通过增加副本数来增加容灾能力,同一分区的不同副本保存的是相同的消息,副本之间是一主多从的关系,其中leader副本负责处理读写请求,生产者和消费者只与leader副本进行交互,follower副本只负责与leader副本的消息同步。这里留一个思考题,为什么要这样设计呢?
????????AR:分区中所有副本统称为AR(Assigned Replicas)。
????????ISR:所有与leader副本保持一定程度同步的副本(包括leader副本在内)组成ISR(In-SyncReplicas)
????????OSR:与leader副本同步滞后过多的副本(不包括leader副本在内)组成OSR(Out-of-Sync Replicas)。
????????消息会先发往leader副本,然后follower副本才从leader副本中拉取消息进行同步,同步期间内followed副本相对leader副本而言会有一定程度的滞后。一定程度是指可以在容忍的范围内,这个范围可以通过参数进行配置。AR=ISR+OSR.
????????ISR与HW和LEO有着紧密的关系。
????????HW:是high watermark的缩写,俗称高水位,它标识了一个特定的消息偏移量(offset),消费者只能拉取到这个offset之前的消息。
????????
????????如上图表示一个日志文件,这个日志文件中有9条消息,第一条消息的offset(LogStartOffset)为0,最后一条消息的offset为8,offset为9的消息用虚线框表示,代表下一条待写入的消息。日志文件的HW为6,表示消费者只能拉取到offset为0至5之间的消息,而offset为6的消息对消费者而言是不可见的。
????????LEO:是Log End Offset的缩写,表示当前日志文件中下一条待写入消息的offset,LEO的大小相当于当前日志分区中最后一条消息的offset值加1.????????
????????分区ISR集合中的每个副本都会维护自身的LEO,而ISR集合中最小的LEO即为分区的HW,对消费者而言只能消费HW之前的消息。
? ? ? ? 下一节将带你详细了解生产者发送消息流程。