这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
本节内容分为以下几个部分:
- 消息队列的概念
- Kafka
- BMQ
- RocketMQ
消息队列
消息队列有什么用?
消息队列可以在系统中起到解耦,削峰填谷的作用,也可以用于异构、分布式系统中海量数据的异步化处理。
- 解耦:当业务过长,存在消息丢失的风险时,通过消息队列可以将业务分解
- 削峰填谷:当业务存在一段时间的高并发,流量洪峰击垮系统的风险,通过消息队列可以将超高流量分摊到更长的一段时间去消化
- 异步:当业务调用其他接口时,需要等待其他接口的返回,造成时延,通过消息队列可以立刻返回用户响应
Kafka
使用场景:日志信息、Metrics数据、用户行为
如何使用Kafka:
- 创建集群
- 新增 Topic
- 编写生产者逻辑
- 编写消费者逻辑
概念:生产者和消费者、Topic、Partition、Cluster、Broker
- 生产者和消费者:对于消息而言的发出和使用(接收)
- Topic:每一个主题都对应一个消息队列,类似于数据库中的表
- Partition:允许在一个主题中,开辟多条道路以此完成在同一主题的水平扩展
- Cluster:物理集群
- Broker:物理集群的节点
细节:Offset、Partition选主
- Offset:消息在消息队列中的相对位置,在Partition中严格递增
- Replica:Partition通过副本进行容灾,Leader-Follow ISR选主(保证高可用)
Kafka的设计
如何实现高吞吐和稳定:
- Produce:批量发送、数据压缩
- Broker:顺序写、消息索引、零拷贝
- Consumer:负载均衡
其他重点:数据复制、重启操作、缩容和扩容、负载不均衡
BMQ
兼容Kafka协议,存放分离,云原生消息队列
RocketMQ
使用场景
针对电商业务线,其业务涉及广泛,如注册、订单、库存、物流等;同时,也会涉及许多业务峰值时刻,如秒杀活动、周年庆、定期特惠等