一、为什么需要消息队列
在跨境电商订单系统中,很多操作是耗时或需要解耦的。如果所有操作都在用户请求的同步链路中完成,响应时间会很长,用户体验会很差。
消息队列(Message Queue)的核心价值在于异步解耦和削峰填谷。
二、场景一:订单创建后的异步处理
用户下单后,系统需要做一系列操作:
1.
保存订单(必须同步,用户需要立即知道下单成功)
发送确认邮件(可以异步)
通知仓库系统(可以异步)
.
更新统计数据(可以异步)
触发营销活动检查(可以异步)
使用消息队列后:
python
import pikaimport jsonclass OrderEventPublisher: def init(self): self.connection = pika.BlockingConnection( pika.ConnectionParameters('localhost') ) self.channel = self.connection.channel() self.channel.queue_declare(queue='order_events', durable=True) def publish_order_created(self, order): message = { 'event_type': 'ORDER_CREATED', 'order_id': order.id, 'user_id': order.user_id, 'amount': order.amount, 'timestamp': order.created_at.isoformat() } self.channel.basic_publish( exchange='', routing_key='order_events', body=json.dumps(message), properties=pika.BasicProperties( delivery_mode=2, # 消息持久化 ) )# 消费者1:发送邮件def send_email_consumer(): # 消费order_events队列,发送确认邮件# 消费者2:更新仓库库存def warehouse_consumer(): # 消费order_events队列,通知仓库系统# 消费者3:数据分析def analytics_consumer(): # 消费order_events队列,更新统计数据
三、场景二:削峰填谷
在促销活动期间,下单请求量可能暴增10倍。如果所有请求直接打到数据库,数据库很快就会被压垮。
使用消息队列做缓冲:
python
from concurrent.futures import ThreadPoolExecutorclass OrderBuffer: def init(self): self.queue = [] # 实际使用RabbitMQ/Kafka self.executor = ThreadPoolExecutor(max_workers=10) def submit_order(self, order_data): # 立即返回,不等待处理完成 self.queue.append(order_data) self.executor.submit(self._process_order, order_data) return {"status": "accepted", "message": "订单已接收,正在处理"} def _process_order(self, order_data): # 实际的下单逻辑,可能耗时几秒 # 如果失败,进入重试队列 try: order = Order.create(order_data) # 后续处理... except Exception as e: # 进入死信队列,人工介入 self.dead_letter_queue.push(order_data, str(e))
四、场景三:分布式事务的最终一致性
跨服务的订单创建需要保证最终一致性:
text
订单服务 → 发送"订单已创建"消息 → 库存服务消费消息,扣减库存 → 支付服务消费消息,发起扣款 → 物流服务消费消息,准备发货
如果某个环节失败,使用重试 + 死信队列保证最终成功:
python
def inventory_consumer_with_retry(): channel.basic_consume( queue='order_events', on_message_callback=callback )def callback(ch, method, properties, body): try: order = json.loads(body) deduct_stock(order['product_id'], order['quantity']) ch.basic_ack(delivery_tag=method.delivery_tag) except InsufficientStockException: # 库存不足,进入死信队列等待人工处理 ch.basic_nack(delivery_tag=method.delivery_tag, requeue=False) dead_letter_queue.push(body, "库存不足") except Exception as e: # 其他异常,重试 ch.basic_nack(delivery_tag=method.delivery_tag, requeue=True)
五、总结
消息队列在订单系统中有三个核心应用场景:异步处理(提升响应速度)、削峰填谷(保护数据库)、分布式事务(保证最终一致性)。选择合适的MQ(RabbitMQ、Kafka、RocketMQ),根据业务场景配置合适的重试和死信策略,是稳定性的关键。