这是我参与「第四届青训营 」笔记创作活动的第7天。
今日内容:#Kafka到pulsar的数据流演进之路
学习重点:消息队列、Kafka、Pulsar
一.课前预习
消息队列应用场景
消息队列常见使用场景:异步处理,应用解耦,流量削锋和消息通讯。
1.异步处理
场景说明:用户注册后,需要发注册邮件和注册短信。传统的做法有两种 1.串行的方式;2.并行方式
(1)串行方式:
将注册信息写入[数据库]成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端
(2)并行方式:
将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间
假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。
因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100)
引入消息队列,将不是必须的业务逻辑,异步处理。改造后的架构如下:
按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍
2.应用解耦
场景说明:用户下单后,订单系统需要通知库存系统。传统的做法是,订单系统调用库存系统的接口。如下图
传统模式的缺点:
·假如库存系统无法访问,则订单减库存将失败,从而导致订单失败
·订单系统与库存系统耦合
如何解决以上问题呢?引入应用消息队列后的方案,如下图:
·订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
·库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
·假如:在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦
3.流量削锋
一般在秒杀或团抢活动中使用广泛
应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。
·可以控制活动的人数
-可以缓解短时间内高流量压垮应用
·用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面
·秒杀业务根据消息队列中的请求信息,再做后续处理
4.消息通讯
消息通讯是指,消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等
点对点通讯:
客户端A和客户端B使用同一队列,进行消息通讯。
聊天室通讯:
客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。
(转自CSDN)
二、课中笔记
一、消息队列
1.应用场景
1.1MQ消息通道
优势:异步解耦/ 削峰填谷(等待故障恢复,可以继续服务)/ 高可用(独立)/ 发布订阅
1.2EventBridge事件总线
事件源-事件集-事件目标
1.3data platform流数据平台(重点)
Connect/ streaming/ function 批和流数据处理和灵活的数据预处理
2.主流消息队列
二、Kafka详解
1.架构
Producer/ consumer/ broker/ zookeeper
1.1ZooKeeper
1.2Broker
消息接收/持久化/高可用保证
1.3Controller选举:
Broker在zk中注册controller,注册后就成为controller,其余会watch,到期重新注册
Controller作用:
副本failover切换/ topic meta信息广播/ 扩缩容的状态控制/ 状态机维护
1.4Coordinator
负载的均衡/ 不同场景不同分配策略
2.高可用
依赖副本同步/副本切换
2.1ISR机制
AR/OSR/ISR
Assign Replica 已分配所有副本
Out Sync Replica 很久未同步副本
Insync.replica 一直在同步的副本
min. Insync.replica 最少isr下限
2.2写入Ack机制
=1 leader副本写成功即为成功
=0 oneway/ producer发送后成功
=-1 isr所有副本都成功即成功
2.3副本同步
LEO log end offset 日志末尾
HW 是ISR中最小的LEO,也是consumer可见的部分
副本选举
Clean和unclean选举机制
都是优先选lsr中副本。无可用时,前者认定partition不可用,后者选其他存活副本。
3.Kafka集群运维
3.1集群扩缩容
目标:
Topic( partition这在broker中分布均匀/ 同一个partition的replica分布在多个broker)
Broker(之中replica分布均匀)
3.2步骤和问题
扩容broker节点 – 计算均衡的replica分布拓扑 – controller将新部分分布元数据广播- broker将新副本数据同步 – 缩容的broker节点下线
扩缩容问题:
时间长、期间集群不稳定、期间无法执行其他操作
3.3Kafka未来演进
去除zk依赖
数据存取困难、开销大、违背软件设计原则、网络分区复杂、并发访问zk问题多
Kraft库替换
Precess.roles= broker/ controller/ broker+controller/ null
3.4运维调优经验
单机吞吐(2.3.1ver./ 40c 500gb 12*1tb 25gb/ ack=-1 replica=2or3)
参数配置(timeout.ms=30000/topics.enable=false/rebalance.enable=false unclean选举关闭)
扩缩容优化(均匀分布)
指标可视化(图表 pct99)
三、Pulsar
1.pulsar架构
1.1Proxy
提供gateway代理能力,解耦客户端和broker,提供云环境和k8s环境下的网关能力(网络隔离)
1.2.broker
无状态组件负责模块:http服务器/ 调度分发器
数据层代理:bookie通讯/ 流量代理
1.3pulsar 存储
不同存储中的抽象
定义抽象实现多介质
根据需求(实时程度,冷热程度划分)多级存储
缓存:tail-read – bookkeeper:catch-up短时间的热数据– s3等冷存:catch-up长时间的冷数据
2.bookkeeper架构
有效降低长尾延时
基本概念:
Ledger:基本存储和读写单元
Fragment:最小分布单元,和ledger默认一一对应
Entry:一条日志=一个entry=一个record,有对应entry id
新建ledger:
参数变化提高系统能力
Bk的读写一致性
加锁处理
Pipeline模式
Entry id<=LAC
读写分离
写入:缓存+定期刷盘 优化排序
读入:先读memtable,没命中就读索引
3.pulsar特性
生产模式:*
shared/ exclusive/ exclusive with fencing/ waitforexclusive
多个往一个topic生产/ 独占生产+其余standby/断开/无法创建
消费模式:
Exclusive 独占订阅
Failover 故障时切换
Shared 共享、queue队列模型
Key_shared key哈希
多租户:
体现于url中
Plugin
一套插件支持各种类型
4.集群HA&Scale_up
topic根据哈希值落入哈希环,顺时针归属于不同bundle
bundle均匀分给broker