💚👉📌📍🧾📃💚
1. 异步消息通信原理
观察者模式:
当 订阅的主题发生改变时,所有消费者得到通知并进行更新
ObServer,又叫发布-订阅模式
定义对象间 一对多的依赖关系,当该对象改变时,所有依赖它的对象都会得到通知并自动更新
生产者消费者模式:
👉 传统模式:
- 生产者直接将消息传给消费者(耦合性高p变c变,生产与消费者 速度不匹配时大量数据积压)
👉 生产者消费者模式:
通过一个中间容器 来解决produce与comsumer之间的强耦合问题,生产者消费者之间不直接通信,而是通过阻塞队列来进行通讯。
中间容器引入 观察者模式,使得生产者及时生产,消费者及时消费
👉 此时数据传递的流程:
- 生产者消费者模式:N个线程生产,N个线程消费,两者之间通过内存缓冲区进行通信
- 生产者负责向缓冲区 添加数据单元
- 消费者负责向缓冲区 取出数据单元(FIFO)
缓冲区:
💚 解耦:p类不直接调用c类方法,生产者与消费者之间不产生直接依赖(都依赖于缓冲区)
💚 支持并发:若突然有多个生产者线程,而消费者处理较慢时,会使生产者阻塞
💚 支持忙闲不均:生产者与消费者之间的速度可以不匹配,会先暂存于缓存区
数据单元:
- 关联到业务对象
- 完整性
- 独立性:各个数据单元间没有依赖
- 颗粒度:根据数据处理量 来灵活调整数颗粒度
2.消息系统原理
一个消息系统负责将数据 从一个应用传递到另一个应用,应用只需关系数据,无需关心数据如何传递
2.1 点对点消息传递
-
消息持久化到队列中,一条消息只能被消费一次(被一个消费者消费后就从消息队列删除了)
-
多个消费者同时消费数据时,也能保证数据处理的顺序 FIFO
-
基于推送模型的消息系统,消息代理将消息push到消费者后,标记该条消息被消费,无法报错该条消息上下文等信息。(单个队列存所有消息数据 ,压力较大)
2.2 发布订阅消息传递
-
在发布-订阅消息系统中,消息被持久化到一个 topic中
-
消费者可以订阅若干个topic,消费者可以消费topic中的所有数据,同一条数据可以被多个消费者消费
-
生产者–发布者,消费者–订阅者
-
kafka采取拉取模型poll,由自己控制消费速度,消费进度,消费者可按任意偏移量进行消费。
3.Kafka
1.Producers:可以有很多的应用程序,将消息数据放入到Kafka集群中。
2.Consumers:可以有很多的应用程序,将消息数据从Kafka集群中拉取出来。
3.Connectors:Kafka的连接器可以将数据库中的数据导入到Kafka,也可以将Kafka的数据导出到数据库中。
4.Stream Processors:流处理器可以Kafka中拉取数据,也可以将数据写入到Kafka中。
kafka应用场景
- 异步处理
- 系统解耦(避免直接调用数据库接口,消息队列作为缓冲)
- 流量削峰(处理大量并发请求)
- 日志处理(临时记录日志)
优点:
- 解耦
- 冗余
- 拓展性(集群拓展)
- 灵活性&峰值处理能力(削峰)
- 可恢复性
- 顺序保证(保证一个Partition内的消息的有序性)
- 缓冲
- 异步通信
Kafka的系统架构
💚Broker
- Kafka集群包含一个或多个服务器,服务器节点称为broker
💚 Topic
- 每条发布到kafka集群的消息都有一个类别–topic
- 类似于 数据库的表名
- 物理上不同topic分开存储,逻辑上无需关心存在哪里
💚 Partition
- topic中的数据可被分割为 一个或多个partition
- 类似于 数据库 的列
- 每个topic至少有一个patition,partition内部是有序的(自增编号)
- 但partition之间无法保证顺序,因此对于需要保证严格消费顺序的场景(秒杀等)需要设partition为1
💚 replication
- 作为partition的备份(备份的多少取决于你对数据的重视程度)
- patition 的 有一个leader,N个follower(repication),follower尽量不放在leader节点上
💚 Leader(弱一致性情况下保证数据统一)
- 每个partition有多个副本,只有一个作为leader,数据的读写都是由 leader负责
- 一个topic中的 多个partition 可以分布在多个节点上,parttion1在节点1上作为leader,partiton2在节点2上作为leader,大大减轻了 leader节点服务器的压力!
💚 Follower
- follower不参与数据的读写,只作为leader的备份,leader所有的数据变更会广播给follower
- 若leader失效,则从follower中选举出一个新leader
- 当follower挂掉,卡住,同步太慢时,leader会将这个follower从 ISR 列表中删除,重新创建一个follower
💚 producer
- 消息的发布者,将消息发布到topic
- broker接收到 消息后,将其追加到segment文件中(partition)
💚 consumer
- 从broker中读取数据,消费者可以消费多个topic中的数据
💚 Consumer Group
- 消费者组,多个消费者共同处理某一个topic中的数据,提高消费能力
- 组内某一个消费者 消费了数据,其它消费者就不用再消费
💚 offset偏移量
- 唯一标识某一条消息,用于记录某条partition数据的读取位置
- 使用偏移量可以使 消息被消费后不被立马删除,可以被重复消费
- 消息最终还是会被删除的,默认生命周期为 1*24H
💚 Zookeeper
- kafka通过zookeeper来存储集群的mata信息
4.环境搭建
本次课程使用的Kafka版本为2.4.1,是2020年3月12日发布的版本。
可以注意到Kafka的版本号为:kafka_2.12-2.4.1,因为kafka主要是使用scala语言开发的,2.12为scala的版本号。http://kafka.apache.org/downloads可以查看到每个版本的发布时间。
1、将Kafka的安装包上传到虚拟机,并解压(保证JDK8+环境)
tar -xvzf kafka_2.12-2.4.1.tgz
2、修改 server.properties
#cd 到kafka_2.12-2.4.1/config
# vim server.properties
20 broker.id=0 # 指定broker的id
25 port = 9092
58 log.dirs=/opt/kafka_2.12-2.4.1/kafka-logs # 指定Kafka数据的位置
118 zookeeper.connect=localhost:2181 # 配置zk节点
3、配置环境变量
# vim /etc/profile
export KAFKA_HOME=/opt/kafka_2.12-2.4.1
export PATH=$KAFKA_HOME/bin:$PATH
#配置文件生效
source /etc/profile
4、启动kafka
##启动kafka前先启动zk
bin/zookeeper-server-start.sh config/zookeeper.properties
kafka-server-start.sh /opt/kafka_2.12-2.4.1/config/server.properties
5、搭建集群
创建多个kafka目录,并复制
## vim server.propertie
#1.配置brokerid
broker.id=1
broker.id=2
#2.配置zk集群
zookeeper.connect=localhost:2181,localhost:2182,localhost:2183
## source /etc/profile
目录名称 | 说明 |
---|---|
bin | Kafka的所有执行脚本都在这里。例如:启动Kafka服务器、创建Topic、生产者、消费者程序等等 |
config | Kafka的所有配置文件 |
libs | 运行Kafka所需要的所有JAR包 |
logs | Kafka的所有日志文件,如果Kafka出现一些问题,需要到该目录中去查看异常信息 |
site-docs | Kafka的网站帮助文件 |