浅学消息队列 | 青训营笔记

135 阅读3分钟

消息对列

1. 相关概念辨析

  • 消息对列: 消息队列(Message Queue,简称MQ)指保存消息的一个容器,其实本质就是一个保存数据的队列。需要支持高吞吐、高并发、高可用。

image-20230609002226480

  • 消息中间件: 消息中间件是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系统的构建。

消息中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性的系统架构。

2. 业界流行的消息队列

业界常用的MQ有kafka、RocketMQ、Pulsar、BMQ等几种,这些MQ的特点对比以及其适用场景如下:

  • kafka: 最常见的消息对列,分布式的、分区的、多副本的日志提交服务,在高吞吐的场景下发挥较为出色
  • RocketMQ: 阿里自研的消息对列,具有低延迟、强一致、高性能、高可靠、亿万级容量和灵活的可扩展性,在一些实时场景中运用较广
  • Pulsar: 主要腾讯公司在使用,但是这个消息对列属于国外的公司。是下一代云原生分布式消息流平台,集消息、轻量化函数式计算为一体,采用了存算分离的架构设计
  • BMQ: 字节跳动自己的消息对列。和Pulsar架构类似,存算分离,初期的定位是承接高吞吐的离线业务场景,逐步替换掉了对应的kafka集群。

Kafka消息对列

1. 使用场景

应对一些离线服务。针对搜索服务、直播服务、订单服务、支付服务等,如日志信息会先发送到kafka队列中,由kafka的各种下游对日志数据进行分析。另外的数据有metrics数据(评判程序的一些指标)、使用APP时的用户行为(如点赞、收藏等),这些场景都可以使用kafka消息对列来进行处理。

2. 如何使用kafka

  • 创建集群

  • 新增Topic

    • 在集群中新建一个Topic
    • 设置好分片数量
  • 编写生产者逻辑

    • 引入对应语言的SDK,配置好集群和Topic参数
    • 初始化一个生产者,调用Send方法,将写好的Hello Word发送出去
  • 编写消费者逻辑

    • 引入对应语言的SDK,配置好集群和Topic参数
    • 初始化一个消费者,调用Poll方法,将受到刚刚发送的Hello World

3. 基本概念

  • Cluster

    如图是一个集群的示例,其中的概念与前文的概念一致。

    image-20230609004652608

  • Offset

    • 是指消息在partition内的相对位置信息,可以理解为唯一的ID,在partition的内部严格递增
  • Replica

    image-20230609005331509

    • 分片的副本,分布在不同的机器上,可以用来容灾
    • 每个分片上有多个Replica,Leader Replica将会从同步的副本(In-Sync-Replicas, ISR)中选出
    • Leader对外服务,Follower异步拉取Leader的数据进行同步,一旦Leader挂掉,将Follower提升为Leader
    • Follower和Leader始终存在差距,但是当差距较小时就可以将Follower加入到ISR中
    • 不在ISR中的Follower不允许被提升为Leader

4. Kafka架构

image-20230609005501370

  • ZooKeeper:集群上的一个模块,存储了集群的元数据信息,例如副本的分配信息
  • Broker:集群上的节点