这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
主要内容
这节课主要学习了消息队列的概念,并且详细了解了Kafka、BMQ和RocketMQ这些消息队列的底层原理以及适用场景等。
具体内容
消息队列基本概念
消息队列,本质上是个队列,指保存消息的一个容器,但需要支持高吞吐、高并发、高可用。
消息队列很早就诞生了,最早是TIB(1985年就有了),之后是IBM MQ,MSMQ,再到JMS,RabbitMQ,Kafka(2010年),RocketMQ,最后到Pulsar。 Kafka是分布式的、分区的,在高吞吐量场景下发挥出色。 RocketMQ具有低延迟、强一致性、高性能、高可靠等优点,在实时场景中运用较广 Pulsar采用存算分离的结构设计,集消息、存储等功能于一身。 BMQ与Pulsar的架构类似,存算分离。
Kafka
Kafka的使用场景包括搜索、直播、订单和支付服务。会将日志等导入Kafka中并进行处理,得出用户的行为信息。
使用Kafka的步骤:创建集群->新建Topic,并设置分区数量->编写生产者逻辑->编写消费者逻辑。
Kafka中的基本概念
- Topic:逻辑队列,每一个不同的业务场景就是一个Topic
- Cluster:物理集群,每个集群中可以建立多个topic
- Prodecer:生产者
- Consumer:消费者
- ConsumerGroup:消费者组
Topic内有多个Partitions,每个Partition中有唯一的Offset(消息在Partition中的相对位置)。每个分片中有多个Replica。此外Kafka中还会有ZooKeeper,负责存储群元信息,包括分区分配信息等。Kafka中通过数据压缩来减小消息的大小。
为了帮助Kafka提高吞吐或者提高稳定性,Producer中采用批量发送、数据压缩等方式,Broker采用顺序写、消息索引、零拷贝等方式,Consumer采用Rebalance。
之后学习了Kafka数据复制、重启、替换扩容缩容、重启的操作过程,所有的这些都会涉及到时间成本的问题。最后总结说,Kafka存在的问题有运维成本高、负载均衡的实现方案较复杂,Kafka没有自己的缓存,完全依赖Page Cache,同时当出现大量的IO时其性能会下降。
BMQ
兼容了Kafka协议,存算分离。之后学习了BMQ的架构,其架构中存在Producer、Controller、Coodinator、Proxy Cluster、Broker Cluster、Consumer Group。
其重启、替换、扩容、缩容后都可以秒级完成,都可直接对外提供服务。
RocketMQ
主要用于电商业务线,或者实时的业务,如秒杀、特惠等。其底层大部分的名字与Kafka很像,但是多了标签和生产者集群,此外分区变成了ConsumerQueue,集群控制器变成了Nameserver。之后学习了其架构模型和存储模型,以及其事务消息、延迟队列等高级性能。
总结
本节课主要学习了消息队列的概念以及它们的底层原理和高级特性,还有很多不是很懂的地方,这个只能慢慢体会了。