logo
Architecture Patterns

Message Queues

Message Queue 的场景

Message queue 是一种 service-to-service 的通信方式,支持 async communication。它异步接收 producer 的消息,再投递给 consumer,让系统在高峰期也能保持稳定。

Queues 常用于大规模分布式系统的请求管理:写入 latency 在小系统里可预测,但在复杂系统里更不稳定;queue 就是 buffer + decouple 的组合。

message-queue-concepts

核心概念

  • Producer/Publisher:发送消息的一方
  • Consumer/Subscriber:读取消息的一方
  • Queue:存消息的结构(FIFO / priority / delay)
  • Broker/Queue Manager:负责路由、存储、投递、ack
  • Message:payload + metadata(headers、timestamp、priority)

message-queue-core

How it works

消息会在 queue 中保存,直到被处理并删除。一个典型流程:

  1. Producer 生成 message(payload + metadata)
  2. Producer enqueue 到 broker
  3. Broker 存储(memory / disk / replicated)
  4. Consumer dequeue 并处理
  5. Consumer 发 ack,broker 删除 message

message-queue-flow

常见机制:

  • Visibility timeout:consumer 领取后在时间窗口内完成,超时则重新投递
  • Ack / Nack:成功 ack,失败可 nack 进入 retry
  • Retry + DLQ:多次失败进入 dead-letter queue 便于排查

Queue types / patterns

  • Point-to-point (Work Queue):一条消息只被一个 consumer 处理
  • Pub/Sub:一条消息被多个 subscriber 消费
  • FIFO:严格顺序,通常带去重
  • Priority Queue:按优先级处理
  • Delay/Scheduled Queue:定时投递(比如 10 分钟后)
  • Competing Consumers:多个 consumer 并行拉取,提升吞吐

message-queue-types

Delivery semantics

投递语义决定了可靠性与复杂度:

  • At-most-once:可能丢,但不重复
  • At-least-once:不丢但可能重复(需要 idempotency)
  • Exactly-once:最贵,通常依赖 transaction / dedupe
  • Ordering:best-effort 或分区内顺序

Advantages

  • Scalability:高峰期 write 入 queue,消费端可横向扩展
  • Decoupling:producer/consumer 彼此不依赖,降低耦合
  • Performance:async processing 提升吞吐
  • Reliability:消息持久化 + retry + DLQ
  • Load leveling:削峰填谷,避免瞬时 overload

message-queue-advantages

Trade-offs

  • Latency vs Reliability:持久化 + retry 带来更高 latency
  • Complexity:需要监控 lag、幂等、重试策略
  • Eventual Consistency:UI/数据状态会有 delay
  • Operational cost:需要维护 broker、partition、retention

When to use

常见场景:

  • Microservices:异步服务间通信,降低同步依赖
  • Background jobs:image/video processing、email/SMS
  • Event-driven:事件分发到多个系统
  • Load spikes:请求排队,稳住 backend
  • 可靠通信:服务短暂不可用仍能投递

UI/UX 设计建议(MQ 参与时)

  • Pattern A:前台只安排任务 → 告知用户稍后完成(配合 polling / notification)
  • Pattern B:前台先做“看起来完成”的部分 → 后台异步补齐(比如 fanout timeline)

Best practices

  • Idempotency:consumer 必须可重复执行
  • Retry policy:指数退避 + 最大重试次数
  • DLQ:隔离坏消息,避免卡主主队列
  • Backpressure:限制写入或动态扩容 consumer
  • Observability:queue length、consumer lag、error rate
  • Security:TLS、ACL、encryption at rest

RabbitMQ vs Kafka(快速对比)

  • RabbitMQ:传统 broker,routing 灵活(exchange/queue),适合任务型消息
  • Kafka:分区日志(distributed log),高吞吐、streaming/event 为主
  • 选型:任务型 + routing 用 RabbitMQ;大量 event/stream 用 Kafka

message-queue-rabbitmq message-queue-kafka

Backpressure

当 queue 过大,可能超过 memory 或增加磁盘 IO,导致整体性能下降。Backpressure 通过限制 queue size 或 request rate 来保持吞吐和响应时间。队列满时,client 可收到 server busy 或 HTTP 503,再配合 exponential backoff 重试。

Examples / Products

相关练习题

Message Queues

暂无相关练习题