应用场景
- 存储系统临时崩溃-->解耦
- 服务器短时处理能力有限-->削峰
- 链路耗时长尾-->异步
- 日志如何处理-->日志系统
消息队列(MQ)
本质上是保存消息的一个容器(队列),支持高吞吐、高并发、高可用
| 1985 | 1993 | 1997 | 2001 | 2004 | 2010 | 2011 | 2012 |
|---|---|---|---|---|---|---|---|
| 金融/新闻机构 | IBM MQ | 微软 | AMQP协议 | Linked | 阿里 | Yahoo | |
| TIB | WebSphere | MSMQ | JMS | RabbitMQ | Kafka | RocketMQ | Pulsar |
- Kafka:分布式、分区、多副本日志提升服务,高吞吐场景下发挥出色
- RocketMQ: 低延迟、强一致、高性能、高可靠、万亿容量、灵活扩展,在实时场景运用较广
- Pulsar: 下一代云原生分布式信息流平台,消息、存储、轻量化、函数式计算为一体,采用存算分离架构
- BMQ: 与Pulsar相似,存算分离,逐步替换Kafka
Kafka
简介
graph LR
创建集群 --> 新增Topic
新增Topic --> 编写生产者逻辑
新增Topic-->编写消费者逻辑
- offset:消息在Partition中的相对位置,严格递增
- Replica:每个分片有多个Replica作为备份用来容灾,Leader Replica会从中选出
- Broker表示kafka节点
- ZooKeeper用来存储集群的元数据信息
从不同视角优化
- Producer
- 批量发送,增强发送能力
- 数据压缩,节省带宽
- Broker
- 顺序写(符合磁盘物理结构)
- 搜索
- 二分法加多级offset分层索引
- 时间戳快速定位offset,而后找到最终数据
- 零拷贝
- sendfile
- mmap
- Consumer
- 如何解决Partition在consumer Group的分配问题
- 手动,不灵活
- Rebalance:自动,更均衡,且易扩展(引入Coordinator)
- 如何解决Partition在consumer Group的分配问题
不足
- 不同节点之间副本需要拷贝,有消耗
- 重启,数据同步耗时
- 替换、扩容、缩容麻烦
- 负载不均衡,解决方案复杂
- 没有自己缓存,依赖Page Cache
- Controller Coordinator Broker在统一进程中,大量IO性能下降
BMQ
- 兼容Kafka协议,存算分离,云原生的消息队列
- 运维效率更高,更方便
- HDFS写文件流程
- 随机选择一定数量的DataNode写入
- 高级特性
- 只支持泳道
- Mirror
- Databus
- Index
- Parquet
RocketMq
- 支持事务
- 支持延迟发送
- 支持延迟消息
- 支持处理失败
- 消费重试和死信队列