前言

在现代互联网系统中,队列(Queue)作为系统“解耦、削峰、异步处理”的核心手段,几乎无处不在。从消息传递、任务调度到事件驱动架构,队列始终扮演着重要角色。

定义

Wiki定义如下:

In computer science, a queue is a collection of entities that are maintained in a sequence and can be modified by the addition of entities at one end of the sequence and the removal from the other end.

简而言之,队列是一种“先进先出(FIFO)”的数据结构,用于有序传递和处理消息或任务。

工作原理

一句话:通过在生产者与消费者之间加入队列,进行异步通信与流量控制。

属性与指标

关注的队列属性与指标包括:

  1. Message Retention Time(消息保留时间)
  2. Throughput(吞吐量)
  3. Latency(消息投递延迟)
  4. Message Ordering(消息顺序保证)
  5. Durability(消息持久化能力)
  6. Visibility Timeout(可见性超时)
  7. Dead Letter Queue (DLQ)(死信队列)
  8. Scalability(可扩展性)

类型

根据功能划分

  1. 消息队列(Message Queue):用于传递消息,一般关注消息的可靠性和顺序,如 RabbitMQ、Kafka。
  2. 任务队列(Task Queue):用于分发和处理任务,如 Celery + Redis。
  3. 事件队列(Event Queue):用于事件驱动架构中,如 Kafka、EventBridge。

根据投递模型划分

  1. 点对点模型(Point-to-Point):一个生产者对应一个消费者,消息只被消费一次。
  2. 发布订阅模型(Pub/Sub):一个消息可以被多个消费者订阅和消费。

根据持久性划分

  1. 持久化队列(Persistent Queue):消息写入磁盘,重启后仍可恢复。
  2. 非持久化队列(In-Memory Queue):保存在内存中,适合高性能但数据可丢失的场景。

根据系统架构划分

  1. 集中式队列:例如 RabbitMQ、ActiveMQ。
  2. 分布式队列:例如 Kafka、RocketMQ、Pulsar。
  3. 内存队列:例如 Redis List、ZeroMQ。

常见场景

  1. 削峰填谷:高并发写入缓冲,后台异步慢速处理。
  2. 解耦组件:生产者与消费者逻辑完全隔离。
  3. 异步处理:提高响应速度,不阻塞主流程。
  4. 任务调度:延时任务、定时任务管理。
  5. 广播通知:一个事件通知多个子系统。

常用队列产品

常见队列产品如下:

  1. RabbitMQ:轻量、可靠,适合复杂路由和消息确认。
  2. Kafka:高吞吐、分布式,适合日志和事件流。
  3. Redis Queue(如 RQ、Celery 后端):高性能、低延迟,适用于短任务场景。
  4. RocketMQ:阿里开源,性能强劲,适合大规模消息传输。
  5. Amazon SQS:托管服务,自动扩展,适合云原生架构。
  6. Google Pub/Sub:全球分布,适合事件驱动架构。
  7. Apache Pulsar:支持多租户、流和消息混合模型。