消息队列 | 青训营笔记

48 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第14天

消息队列概述

消息队列,是分布式系统中重要的组件,其通用的使用场景可以简单地描述为:

  • 当不需要立即获得结果,但是并发量又需要进行控制的时候,差不多就是需要使用消息队列的时候。

  • 消息队列主要解决了应用耦合、异步处理、流量削锋等问题。

  • 当前使用较多的消息队列有RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等,而部分数据库如Redis、Mysql以及phxsql也可实现消息队列的功能。

消息队列使用场景

消息队列在实际应用中包括如下四个场景:

  • 应用耦合:多应用间通过消息队列对同一消息进行处理,避免调用接口失败导致整个过程失败;
  • 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,相比串行处理,减少处理时间;
  • 限流削峰:广泛应用于秒杀或抢购活动中,避免流量过大导致应用系统挂掉的情况;
  • 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理;

业界的消息队列对比

  • Kafka:分布式的、分区的、多副本的日志提交服务,在高吞吐场景下发挥较为出色
  • RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实时场景中运用较广
  • Pulsar:是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体、采用存算分离的架构设计
  • BMQ:和Pulsar架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群

Kafka消息队列

Kafka是目前主流的消息队列之一,提供分布式、分区的、多副本的日志提交服务,在高吞吐的场景下出色,由Apache基金会开源维护。

  • Kafka的基本概念

    • Topic:逻辑队列,不同的业务可以建立不同的Topic
    • Partition:一个Topic可以包含一个或多个Partition
    • Cluster:物理集群,可以部署一个或多个Topic
    • Broker:Cluster中的物理结点
    • Producer:生产者,将消息发送到Topic中
    • Consumer:消费者,负责消费Topic中的消息
    • ConsumerGroup:消费者组,不同组的Consumer的消费进度互不干涉
  • Kafka的数据容灾

    • Kafka为每个topic的在多个服务器中的partitions复制日志。这允许在集群中的一个服务器失败时进行自动的故障切换(failover),从而消息不会由于失败而丢失。

    • 复制(replication)的基本单位是partition,包含若干个replica,分为leader和follower。

    • 每个partition都有一个leader和零个或多个follower。

    • leader中配置的复制因子(replication factor)决定了复制的数量。

    • producer生产的数据都会被发送到leader,而consumer的读操作可以从leader或follower中读取。

    • follower就像consumer一样,从leader中消费由producer生产的数据,并且将它们应用到自己的日志(log)中。

    • 每个follower的日志与leader的日志是相同的,具有相同的偏移和相同顺序的消息。

    • 但leader的日志末尾可能有少量的消息尚未来得及被复制到follower。