消息队列选型与实战:Kafka vs RabbitMQ

一、为什么要用消息队列

三个核心价值:解耦(生产者不依赖消费者)、异步(下单后慢慢发短信)、削峰(秒杀流量先进队列再匀速消费)。没有 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 不是银弹,它把”同步的复杂性”换成了”异步的复杂性”——消息丢失、重复、乱序都要提前设计。