Queue 101
文章目录
前言
在现代互联网系统中,队列(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)”的数据结构,用于有序传递和处理消息或任务。
工作原理
一句话:通过在生产者与消费者之间加入队列,进行异步通信与流量控制。
属性与指标
关注的队列属性与指标包括:
- Message Retention Time(消息保留时间)
- Throughput(吞吐量)
- Latency(消息投递延迟)
- Message Ordering(消息顺序保证)
- Durability(消息持久化能力)
- Visibility Timeout(可见性超时)
- Dead Letter Queue (DLQ)(死信队列)
- Scalability(可扩展性)
类型
根据功能划分
- 消息队列(Message Queue):用于传递消息,一般关注消息的可靠性和顺序,如 RabbitMQ、Kafka。
- 任务队列(Task Queue):用于分发和处理任务,如 Celery + Redis。
- 事件队列(Event Queue):用于事件驱动架构中,如 Kafka、EventBridge。
根据投递模型划分
- 点对点模型(Point-to-Point):一个生产者对应一个消费者,消息只被消费一次。
- 发布订阅模型(Pub/Sub):一个消息可以被多个消费者订阅和消费。
根据持久性划分
- 持久化队列(Persistent Queue):消息写入磁盘,重启后仍可恢复。
- 非持久化队列(In-Memory Queue):保存在内存中,适合高性能但数据可丢失的场景。
根据系统架构划分
- 集中式队列:例如 RabbitMQ、ActiveMQ。
- 分布式队列:例如 Kafka、RocketMQ、Pulsar。
- 内存队列:例如 Redis List、ZeroMQ。
常见场景
- 削峰填谷:高并发写入缓冲,后台异步慢速处理。
- 解耦组件:生产者与消费者逻辑完全隔离。
- 异步处理:提高响应速度,不阻塞主流程。
- 任务调度:延时任务、定时任务管理。
- 广播通知:一个事件通知多个子系统。
常用队列产品
常见队列产品如下:
- RabbitMQ:轻量、可靠,适合复杂路由和消息确认。
- Kafka:高吞吐、分布式,适合日志和事件流。
- Redis Queue(如 RQ、Celery 后端):高性能、低延迟,适用于短任务场景。
- RocketMQ:阿里开源,性能强劲,适合大规模消息传输。
- Amazon SQS:托管服务,自动扩展,适合云原生架构。
- Google Pub/Sub:全球分布,适合事件驱动架构。
- Apache Pulsar:支持多租户、流和消息混合模型。
文章作者 沉风网事
上次更新 2019-01-10