一、为什么要用消息队列
三个核心价值:解耦(生产者不依赖消费者)、异步(下单后慢慢发短信)、削峰(秒杀流量先进队列再匀速消费)。没有 MQ,系统只能同步串起来,一处慢全网卡。
二、Kafka vs RabbitMQ
| 维度 | Kafka | RabbitMQ |
|---|---|---|
| 定位 | 高吞吐日志/事件流 | 低延迟、复杂路由的业务消息 |
| 模型 | 发布订阅 + 消费组,持久日志 | Exchange 路由到 Queue |
| 吞吐 | 极高(十万级/秒) | 中(万级/秒) |
| 适用 | 日志、埋点、流式处理 | 订单、通知、任务分发 |
三、一个 RabbitMQ 生产消费(Python)
import pika
conn = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
ch = conn.channel()
ch.queue_declare(queue="order", durable=True)
ch.basic_publish(exchange="", routing_key="order",
body="order-1001",
properties=pika.BasicProperties(delivery_mode=2))
print("已发送")
# 消费侧
def cb(ch, method, props, body):
print("处理", body)
ch.basic_ack(delivery_tag=method.delivery_tag) # 手动 ack
ch.basic_consume(queue="order", on_message_callback=cb)
ch.start_consuming()
四、必做的几件事
- 消费幂等:消息会重投,处理逻辑必须幂等(见本站立的《接口幂等设计》);
- 手动 ack:处理完再确认,避免丢消息;
- 死信队列:处理失败的消息进死信,便于排查;
- 监控积压:队列长度告警,别等爆了才发现。
MQ 不是银弹,它把”同步的复杂性”换成了”异步的复杂性”——消息丢失、重复、乱序都要提前设计。