这是我参与「第五届青训营 」伴学笔记创作活动的第 12 天
1.主要内容
- 消息队列是什么
- 消息队列的发展
- 主流消息队列介绍
2.课程详细内容
消息队列发展
消息队列是什么
消息队列,指保存消息的一个容器,本质是个队列。但是这个队列需要支持高吞吐、高并发、高可用。
- 系统崩溃,使用消息队列进行解耦
- 服务处理能力有限,使用消息队列进行削峰
- 链路耗时长尾,使用消息队列进行异步
- 消息队列处理日志问题
消息队列的发展
- TIB: 用于高盛,用于解决金融交易。于是发布订阅模式(PubSub)诞生了,同时还诞生了世界上第一个现代消息队列软件:Teknekron的The Information Bus(TIB)
- IBM MQ: 在20世纪80年代后期,IBM开始研究开发自己的消息队列软件,实际开发工作始于1990年,三年后,消息队列服务器软件IBM MQ产品系列面世。17年后,MQ系列进化成了WebSphere MQ并统治着商业消息队列平台市场
- MSMQ:微软消息队列
- JMS :本质上是一套Java API,JMS试图通过提供公共Java API的方式,隐藏单独MQ产品供应商提供的实际接口,从而跨越了壁垒和解决了互通问题。从技术上讲,Java应用程序只需针对JMS API编程,选择合适的MQ驱动即可。JMS会打理好其他部分。
- AMQP/RabbitMQ :开放标准,任何人都可以执行这一标准,同年RabbitMQ问世
- Kafka : kafka的诞生,是为了解决linkedin的数据管道问题,研发的消息传递系统
- RocketMQ :Kafka的特殊的日志通道定位,是不能完全满足阿里巴巴高频的在线交易场景,为此团队设计并研发了新一代消息引擎 RocketMQ。国内一些中大型规模的公司普遍部署了两套消息引擎,一套选择 Apache RocketMQ 用在交易,数据分发等核心链路上,一套选择 Apache Kafka 用在大数据等在线、离线分析链路上。毫无疑问,Kafka 目前在大数据生态建设这块,确实具备一定的先发优势。
主流消息队列
- Kafka :分布式、分区、多副本的日志提交服务,高吞吐场景下发挥出色
- RocketMQ :低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在实时场景中运用较广
- Pulsar :下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用存算分离的架构设计
- BMQ :和Pulsar架构类似,存算分离,初期定位是承高吞吐离线业务场景逐步替换掉Kafka集群
消息队列-Kafka
使用场景
- 各个服务的日志信息
- Metrics数据
- 用户行为
Kafka简介
Kafka使用流程
- 首先创建Kafka集群
- 在集群中创建一个Topic,并设置好分片数量
- 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法,将你的信息发出去
- 初始化一个消费者,调用Poll方法,将收到信息
基本概念
- Topic:Kafka中的逻辑队列,理解为每一个不同业务场景就是一个不同的Topic,对于这个业务来说,所有的数据都存储在这个Topic中
- Cluster:Kafka的物理集群,每个集群中可以新建多个不同的Topic
- Producer:生产者,消息的生产端,负责将业务消息发送到Topic中
- Consumer:消费者,消息的消费端,负责消费已经发送到Topic中的消息
- ConsumerGroup:消费者组,不同组的Consumer消费进度互不干涉
- Partition:通常Topic会有多个分片,不同分片直接消息并发处理,可以提高单个Topic的吞吐
- Offset:消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增
- Replica:分片的副本,分布在不同的机器上,可以容灾,每个分片有多个Replica,Leader将会从ISR中选出。Leader对外服务,Follower异步去拉取Leader的数据进行同步,如果Leader挂了,可以将Follower提成Leader再进行服务
- ISR:同步中的副本,对于Follower来说,始终和Leader是有差距的,但是这个差距较小时,就可以将这个Follower副本加入到ISR中,不在ISR中的副本是不可以提成Leader的
- Broker:Kafka的结点,集群中有一个Broker会同时扮演Controller的角色
- Controller:集群大脑,负责对副本和Broker进行分配
- ZooKeeper:存储集群的元数据信息,例如副本的分配信息等等,Controller计算好的方案会放在这
Kafka提高吞吐、稳定性
Producer:
- 批量发送:减少IO次数,加强发送能力
- 数据压缩:减少消息大小
Broker:
- 顺序写:采用顺序写的方式进行写入,以提高写入效率
- 消息索引:偏移量索引文件,时间戳索引文件
- 零拷贝:Consumer从Broker中读取数据,通过sendfile方式,将磁盘读到os内核缓冲区后,直接转到socket buffer进行网络发送
Consumer:
- Low Level:手动分配
- High Level:自动分配,在Broker集群中,对于不同的Consumer Group来讲,都会选取一台Broker当Corrdinator来帮助Consumer Group进行分片的分配,也叫做分片的rebalance
Kafka的问题
- 运维成本高
- 对于负载不均衡的场景,解决方案十分复杂
- 没有自己的缓存,全部依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量的IO会造成其性能下降
消息队列- RocketMQ
使用场景
电商业务线,需要保证数据准确性,如订单、注册、库存、物流等;也有业务峰值,如秒杀活动、周年庆、定期特惠。
架构
- Producer,Consumer,Broker三部分和Kafka一样,Kafka的Partition在这里叫ConsumerQueue
- Tag
高级特性
- 事务场景
- 延迟发送
- 延迟消息
- 消费重试和死信队列
3.字节BMQ实践
BMQ
兼容Kafka协议,存算分离,云原生消息队列
BMQ介绍
架构:Producer - Consumer - Proxy - Broker - HDFS - Controller - Coordinator - Meta
运维:重启、替换、扩容、缩容相较于Kafka的需要数据复制,时间较长,BMQ可以直接对外服务,秒级完成
BMQ读写流程
- Failover机制
- 写入状态机
BMQ高级特性
- 泳道消息
- DataBus:简化消息队列客户端复杂度,解耦业务与Topic,缓解集群压力,提高吞吐
- Mirror
- Index:直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据
- Parquet:直接在BMQ中将数据结构化,通过Parquet Engine,可以使用不同的方式构建Parquet文件
4.课后总结
- 消息队列是重要组件
- Kafka的大数据应用场景是后续发展的重要支撑
- 字节的BMQ属于面向云原生时期的消息队列组件
- 课后还需了解各个组件的具体使用方法
5.引用
字节内部课:消息队列原理与实战
稀土掘金-后端学习资料