目录
本文是Kafka系列文章的第一篇,将带你了解Kafka的核心术语及其应用场景,后续会逐步探索其各方面的原理及应用场景。下面先看一张大概得简图,涉及Kafka的功能、原理等等,后续不断深入介绍,欢迎关注。
1、什么是消息中间件
消息中间件(message queue middleWare, MQ)指利用高效可靠消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程通信。一般有两种传递模式:点对点模式和发布订阅模式。点对点的模式是基于队列的,消息生产者发送消息到队列,消费者从队列中接收消息,队列的存在使得消息的异步传输成为可能。发布订阅模式定义了如何向一个内容节点发布和订阅,这个内容节点称为主题(topic),主题可以认为是消息传递的中介,消息发布者将消息发布到某个主题,消息订阅者从主题中订阅消息。
消息中间件将消息路由给应用程序B,这样消息可以完全存在于两台不同的计算机上。消息中间件负责网络通信,如果网络不可用,消息中间件会存储消息直到连接可用。
1.1 消息中间件的作用
- 解藕:如上图,应用A与B完全隔离开,甚至不知道对方是谁,实现了完全解耦。
- 冗余(存储):有些情况数据处理会失败,消息中间件可以把数据进行持久化,直到他们已经被完全处理。通过这种方式规避数据丢失的风险。
- 扩展性:因为消息中间件解藕了应用的处理过程,所以提高消息入队和处理的效率很容易。
- 削峰:在访问剧增的情况下,应用仍然需要继续发挥作用,但这种突发的流量并不常见,如果以处理峰值的标准来投入资源,无疑是巨大的浪费,使用消息中间件支撑突发的流量,不会因为超负荷请求而完全奔溃。
- 可恢复性:当系统的一部分组件失效时不影响整个系统。降低了应用间的耦合性,系统恢复后还能继续处理消息。
- 顺序保证:大多数场景下,顺序处理数据很重要,大部分消息中间件支持一定程度上的顺序性。
- 缓冲:在任何重要的系统中,都会存在需要不同处理时间的元素,消息中间件通过一个缓冲层来帮助任务最高效率的执行,写入消息中间件的处理尽可能的快。该缓冲层有助于控制和优化数据流经过系统的速度。
- 异步通信:很多时候不需要立即处理消息,消息中间件提供了异步处理机制。
Kafka还提供了大多消息系统难以实现的消息顺序保障和回溯消费的功能。
2、Kafka简介
kafka是Scala语言开发的一个多分区、多副本且基于zookeeper协调的分布式消息系统。他具有三个功能。
第一个是消息中间件的功能,上边已经描述。
第二个是存储功能,Kafka把消息存储到磁盘,相比于其他基于内存的存储系统而言,有效的降低了数据丢失的风险。这也正得益于Kafka的消息持久化和多副本机制。
第三个是流式处理,Kafka不仅为每个流行的流式处理框架提供了可靠的数据源,还提供了一个完整的流式处理类库。
消息中间件主要又3部分组成:
- 生产者:发送消息的一方,生产者负责创建消息,然后将其投递到kafka中
- consumer:消费者,接受消息的一方。消费者链接到Kafka上并接收消息,进而进行相应的业务逻辑
- broker:服务代理节点。对于Kafka而言,broker可以简单的看作一个独立的Kafka服务节点或Kafka服务实例。
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之前的消息。
下一节将带你详细了解生产者发送消息流程。
往期经典推荐
深入剖析Kafka生产者:揭秘消息从发送到落地的全过程-CSDN博客
深入浅出 Kafka 消费者:解密分布式消息流的幕后英雄_kafka消费-CSDN博客