这是我参与「第三届青训营 -后端场」笔记创作活动的的第五篇笔记。
消息队列
支持高吞吐,高并发,高可用的队列。
Kafka
使用场景
- 日志信息
- Metrics数据(程序状态的采集)
- 用户行为(搜索,点赞,评论,收藏...)
如何使用Kafka
- 创建集群
- 新增Topic
- 编写生产者逻辑
- 编写消费者逻辑
基本概念
- 一个topic为一个业务的逻辑队列,一个topic可以有多个parttion(分区),分区之间是并发处理的。
- 每个partition有多个Replica。Leader Replica会从ISR(In-Sync-Replica)中选出。其他的follower会与leader有一定的差距,如果差距超过规定会被踢出ISR。这样如果leader所在的机器宕机,可以从follower中恢复。
架构
- Broker为集群的节点
- ZooKeeper与controller(Broker中的一个)配合,存储集群元信息,包含分区分配信息等
帮助Kafka提高吞吐性能和稳定性的功能:
- Producer: 批量发送,数据压缩
- Broker: 顺序写,消息索引,零拷贝
- Consumer: Rebalance
问题
重启,替换,缩容,扩容都需要数据复制,分钟级甚至天级。
BMQ
- 兼容Kafka协议,存算分离(Broker里的数据拿出来放到另一个分布式存储系统如hdfs中),云原生消息队列。
- 重启,替换,缩容,扩容均为秒级。
Databus
解决直接使用原生SDK的问题
- 简化消息队列客户端复杂度
- 解耦业务与Topic
- 缓解集群压力,提高吞吐
Mirror
使用Mirror通过最终一致的方式,解决跨region读写的问题。
Index
直接在BMQ中将数据结构化,配置索引DDL,异步构建索引后,通过Index Query服务读出数据
RocketMQ
应用于秒杀场景