消息队列概述
消息队列的应用场景
✔MQ消息通道
✔EventBridge事件总线
- 事件源:将云服务、自定义应用、SaaS 应用等应用程序产生的事件消息发布到事件集。
- 事件集:存储接收到的事件消息,并根据事件规则将事件消息路由到事件目标。
- 事件目标:消费事件消息。
✔Data Platform流数据平台
- 提供批流数据处理能力
- 各类组件提供各类Connect
- 提供Streaming/Function能力
- 根据数据schema灵活的进行数据预处理
「自我思考」消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
主流消息队列的相关介绍
Kafka
「简介」Kafka是一种消息队列,主要用来处理大量数据状态下的消息队列,一般用来做日志的处理。既然是消息队列,那么Kafka
也就拥有消息队列的相应的特性了。
Kafka架构介绍
👇讲解架构中的组件
Zookeeper
- 选举机制: Paxos机制
- 提供一致性:
- 写入(强一致性)
- 读取(会话一致性)
- 提供可用性:一半以上节点存活即可读写
- 提供功能:
- watch机制
- 持久/临时节点能力
Broker
- 若千个Broker节点组成Kafka集群
- Broker作为消息的接收模块,使用React网络模型进行消息数据的接收
- Broker作为消息的持久化模块,进行消息的副本复制以及持久化
- Broker作为高可用模块,通过副本间的Failover进行高可用保证
Controller选举
- Broker启动会尝试去zk中注册controller节点
- 注册上controller节点的broker即为controller
- 其期broker会watch controller 节点,节点出现异常则进行重新注册
Controller作用
- Broker重启/宕机时,负责副本的Failover切换
- Topic创建/删除时,负债Topic meta信息广播
- 集群扩缩容时,进行状态控制
- Partition/Replica状态机维护
Coordinator介绍
- 负责topic partition <-> consumer的负载均衡
- 根据不同的场景提供不同的分配策略
Kafka高可用
- 副本同步机制
- 提供Isr副本复制机制,提供热备功能
- 写入端提供ack=0,-1,1机制,控制副本同步强弱
- 副本切换机制
- 提供clean/unclean副本选举机制
Kafka集群扩缩容之后的目标
- Topic维度
- partition在各个broker之间分布是均匀的
- 同一个partition的replica不会分布在一台broker
- Broker维度
- Broker之间replica的数量是均匀的
自我思考
- Kafka像其他Mq一样,也有自己的基础架构,主要存在生产者Producer、Kafka集群Broker、消费者Consumer、注册消息Zookeeper
- Kafka中消息是以topic进行分类的,Producer生产消息,Consumer消费消息,都是面向topic的。
Pulsar
「简介」Pulsar 是一个企业级的分布式消息系统,最初由 Yahoo 开发,在 2016 年开源,并于2018年9月毕业成为 Apache 基金会的顶级项目。Pulsar 已经在 Yahoo 的生产环境使用了三年多,主要服务于Mail、Finance、Sports、 Flickr、the Gemini Ads platform、 Sherpa (Yahoo 的 KV 存储)。
Pulsar架构介绍
👇讲解架构中的组件
Pulsar Proxy的作用及应用场景
- 部分场景无法知道Broker地址,如云环境或者Kubernetes环境
- Proxy提供类似GateWay代理能力,解耦客户端和Broker,保障Broker安全
Pulsar Broker
无状态组件,负责运行两个模块
- Http服务器
- 暴露了restful接口,提供生产者和消费者topic查找api
- 调度分发器
- 异步的tcp服务器,通过自定义二进制协议进行数据传输
Pulsar数据存储Segment在不同存储中的抽象
- 分布式Jourmal系统(Bookeeper)中为Journal/L edger
- 分布式文件系统(GFS/HDFS)中为文件
- 普通磁盘中为文件
- 分布式Blob存储中为Blob
- 分布式对象存储中为对象
Pulsar Storage
Bookkeeper基本概念
- Ledger: BK的一个基本存储单元,BK Client的读写操作都是以Ledger为粒度的
- Fragment: BK的最小分布单元(实际上也是物理上的最小存储单元),也是Ledger的组成单位,默认情况下一个Ledger会对应的一个Fragment (一 个Ledger也可能由多个Fragment组成)
- Entry:每条日志都是一个Entry,它代表一个record,每条record都会有一个对应的 entry id
Pulsar生产模式
Pulsar消费模式
Pulsar VS Kafka
- 存储架构
- 存储计算分离之后带来的优劣势
- 多层架构,状态分离之后的优势
- 运维操作
- 应对突发流量变化,集群扩缩容是否便捷
- 运维任务是否影响可用性
- 集群部署是否灵活
- 功能特性
- 多语言&多协议
- 多租户管理
- 生产消费模式
- 生态集成
自我思考Pulsar对比Kafka优点
- 流式处理和队列的合体
- 支持分区,但不是必需的
- 日志固然不错,但 ledger 更胜一筹
- 无状态
- 简单的跨域复制
- 稳定的表现