Lesson7 中间件之消息队列|青训营笔记

19 阅读3分钟

四. 消息队列

4.1 场景举例

  1. 系统崩溃

    解决方案:解耦

    解耦

  2. 服务处理能力有限

    解决方案:削峰

    削峰

  3. 链路耗时长

    解决方案:异步

    异步

  4. 日志如何处理

    Log -> 消息队列 -> LogStash -> ES -> Kibana

  5. 什么是消息队列?

    MQ指保存消息的一个容器,本质是个队列,要支持 高吞吐、高并发、高可用

    Kafka / RocketMQ / Pulsar / BMQ

    用于日志信息、Metrics数据、用户行为等

4.2 基本概念

Topic:逻辑队列

Cluster:物理集群

Producer:生产者

Consumer:消费者

ConsumerGroup:消费者组

4.3 Kafka

消息:Kafka 中的数据单元被称为消息,也被称为记录,可以把它看作数据库表中某一行的记录。

批次:为了提高效率, 消息会分批次写入 Kafka,批次就代指的是一组消息。

主题:消息的种类称为 主题(Topic),可以说一个主题代表了一类消息。相当于是对消息进行分类。主题就像是数据库中的表。

分区:主题可以被分为若干个分区(partition),同一个主题中的分区可以不在一个机器上,有可能会部署在多个机器上,由此来实现 kafka 的伸缩性,单一主题中的分区有序,但是无法保证主题中所有的分区有序。

偏移量:偏移量(Consumer Offset)是一种元数据,它是一个不断递增的整数值,用来记录消费者发生重平衡时的位置,以便用来恢复数据。

broker: 一个独立的 Kafka 服务器就被称为 broker,broker 接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘保存。

broker 集群:broker 是集群 的组成部分,broker 集群由一个或多个 broker 组成,每个集群都有一个 broker 同时充当了集群控制器的角色(自动从集群的活跃成员中选举出来)。

副本:Kafka 中消息的备份又叫做 副本(Replica),副本的数量是可以配置的,Kafka 定义了两类副本:领导者副本(Leader Replica) 和 追随者副本(Follower Replica),前者对外提供服务,后者只是被动跟随。

重平衡:Rebalance。消费者组内某个消费者实例挂掉后,其他消费者实例自动重新分配订阅主题分区的过程。Rebalance 是 Kafka 消费者端实现高可用的重要手段。

Kafka系统架构

Producer:批量发送、数据压缩

Broker:顺序写,消息索引,零拷贝

Consumer:Rebalance

4.4 BMQ消息队列

4.4.1 简介

BMQ 兼容 Kafka 协议,支持存算分离,支持云原生消息队列。

  • 新增 Proxy 层作为代理;
  • Coordinator 和 Controller 可以独立部署;
  • 底层新增 HDFS 用于存算分离。

4.4.2 BMQ 读写流程

在 BMQ 中,客户端写入前会选择一定数量的 DataNode,这个数量一般是副本数,然后将一个文件写入到这几个节点上,切换到下一个 segment 之后,又会重新选择节点进行写入。这样对于单个副本的所有 segment,会随机写入到集群当中。

对于写入逻辑,BMQ 还有一个状态机的机制(Broker-Partition),用来保证不会出现同一个分片在两个 Broker 上同时启动的情况,另外也能保证一个分片的正常运行。

BMQ 的具体写入过程:

  1. CRC 数据校验参数是否合法。
  2. 校验完成后,会把数据放入 Buffer 中。
  3. 通过一个异步的 Write 线程将数据最终写入到底层的存储系统。

4.5 RocketMQ

RocketMQ是由阿里捐赠给Apache的一款低延迟、高并发、高可用、高可靠的分布式消息中间件。经历了淘宝双十一的洗礼。RocketMQ既可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。