这是我参与「第五届青训营 」伴学笔记创作活动的第 10 天
今天补一下昨天课上学习的关于消息队列内容的笔记。消息队列(Message Queue,简称MQ)指保存消息的一个容器。该容器本质上是一个队列,但是支持高吞吐、高并发、高可用的需求场景。消息队列被广泛应用于互联网应用中。
目前业界主要流行的消息队列有四种:Kafka、RocketMQ、Pulsar和BMQ。
Kafka主要使用在搜索服务、直播服务、订单服务和支付服务场景。其使用流程分为四步:创建Kafka集群、在集群中创建Topic并设置好分片数量、编写生产者逻辑和编写消费者逻辑。Topic是Kafka中的逻辑队列,大概每个不同的业务场景就是不同的Topic,一个业务场景的所有数据都存储在该Topic中;Cluster是Kafka的物理集群。可以新建多个Topic;Produce和Consumer分别生产和消费Topic中的消息;Partition是Topic中的分片。对每一个Partition,每一条消息都有唯一Offset,表示在Partition中的相对位置信息,并且严格递增;每个Partition又有多个Replica,作为副本用来容灾。Broker是一个个Kafka节点,不同Topic中的不同Partiation在其中存储分布,所有Broker节点组成一个集群。每条消息由Producer生产,存储在Broker中,由Consumer消费。Kafka具有运维成本高、高负载解决方案复杂的特点,BMQ兼容Kafka,进行了一些优化。
RocketMQ主要使用在电商业务线和业务峰值中,对比Kafka多了标签和集群的概念,Partition改名叫做ConsumerQueue。数据流也是通过Producer发送给Broker集群,再由Consumer消费,存储模型方面Broker将所有消息append到CommitLog上,按照不同的Queue重新分配到不同Consumer。ConsumerQueue存储的不是真实数据,真实数据只存在CommitLog中,ConsumerQueue上存储的相当于Queue上所有消息在CommitLog上的位置,是这个Queue的密集索引。