kafka

💚👉📌📍🧾📃💚

1. 异步消息通信原理

观察者模式:

当 订阅的主题发生改变时,所有消费者得到通知并进行更新

  • ObServer,又叫发布-订阅模式

  • 定义对象间 一对多的依赖关系,当该对象改变时,所有依赖它的对象都会得到通知并自动更新
    在这里插入图片描述

生产者消费者模式:

👉 传统模式:

  • 生产者直接将消息传给消费者(耦合性高p变c变,生产与消费者 速度不匹配时大量数据积压)

👉 生产者消费者模式:

  • 通过一个中间容器 来解决produce与comsumer之间的强耦合问题,生产者消费者之间不直接通信,而是通过阻塞队列来进行通讯。

  • 中间容器引入 观察者模式,使得生产者及时生产,消费者及时消费

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WwCrjeCl-1663745663607)(images/image-20220918161207059.png)]

👉 此时数据传递的流程:

  • 生产者消费者模式: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的网站帮助文件

在这里插入图片描述

5.Kafka数据检索机制

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值