消息队列
1、什么是消息队列?
消息队列(Message Queue,MQ),指保存消息的一个容器,本质是个队列。这个队列需要支持高吞吐、高并发、高可用。
2、消息队列的发展历程
3、业界消息队列对比
Kafka: 分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色。
RocketMQ: 低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广。
Pulsar: 是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计。
BMQ: 和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群。
消息队列-kafka
1、使用场景
kafka可以用在搜索服务、直播服务、订单服务和支付服务等等。它提供了日志信息、Metrics数据和用户行为
2、如何使用kafka
kafka官方文档。使用kafka一般有以下流程:
graph TD
创建集群 --> 新增Topic
新增Topic --> 编写生产者逻辑
编写生产者逻辑 --> 编写消费者逻辑
3、基本概念
- Topic:逻辑队列,不同Topic可以建立不同的Topic
- Cluster:物理集群,每个集群中可以建立多个不同的Topic
- Producer:生产者,负责将业务消息发送到Topic中
- Consumer:消费者,负责消费处理Topic中的消息
- ConsumerGroup:消费者组,不同组Consumer消费进度互不干涉
Topic内部
Offset: 消息在partition内的相对位置信息,可以理解为唯一ID,在partition内部严格递增。
Replica: 每个Partition多个Replica,Leader Replica 将会从ISR中选出。Follower与leader差距过大会在ISR中被剔除。kafka的Replica机制介绍
ZooKeeper:复制存储集群元信息,包括分区分配信息等。ZooKeeper与kafka
4、kafka能支撑高吞吐量的原因
Producer
批量发送、数据压缩,如图:
Broker
Broker通过顺序写入磁盘,提高写入效率。Broker消息文件结构如下:
消息索引。Consumer通过发送FetchRequest请求消息数据,Broker会指定Offset处的消息,按照时间窗口和消息大小窗口发送给Consumer。通过二分法寻找小于目标Offset的最大文件,然后二分寻找小于目标Offset的最大索引位置。
零拷贝。将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手 。 零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。
Consumer
如何解决Partition在Consumer Group中的分配问题?
1、手动分配(Low-Level)。哪个Consumer消费哪个Partition完全由业务决定。优点在于速度快,其缺点在于无法自动容灾,如果要增加Consumer可能造成机器的启停。
2、自动分配(High-Level)。对于不同的Consumer Group选取一个Broker作为Coordinator服务,帮助某个Consumer Group内部的每个consumer自动分配(rebalance)。
Rebalance过程
移步Kafka重平衡—Rebalance 你了解吗? - 掘金 (juejin.cn)
5、kafka的缺点
- 运维成本高
- 对于负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖Page Cache
- Controller和Coordinator和Broker在同一进程中,大量IO会造成其性能下降