首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MQ 相关问题的详细解答

MQ 相关问题的详细解答

作者头像
命运之光
发布2025-07-12 09:01:19
发布2025-07-12 09:01:19
13800
代码可运行
举报
运行总次数:0
代码可运行
一、MQ 应用场景
  1. 应用解耦:商城中,订单系统与库存、物流、营销等系统解耦。下单后,订单系统发消息到 MQ,其他系统订阅消费,无需直接依赖,某系统故障不影响下单主流程。
  2. 异步处理:用户下单后,发送短信通知、积分更新等耗时操作,可丢入 MQ 异步执行,提升下单接口响应速度,改善用户体验。
  3. 削峰填谷:秒杀活动时,大量下单请求涌入,MQ 暂存消息,订单系统按自身处理能力消费,避免数据库被瞬时高并发压垮。
  4. 流量削峰:比如商城大促时,瞬时高并发请求通过 MQ 缓冲,下游系统平稳消费。
  5. 日志采集:各微服务日志发往 MQ,日志系统统一消费处理,实现集中化日志分析。
  6. 事件驱动:商品库存变更、价格变动等事件,通过 MQ 广播给关注的服务(如搜索服务更新索引、营销服务触发活动 )。
二、RabbitMQ 收发消息入门程序(Java + Spring Boot 示例 )
1. 依赖配置(pom.xml
代码语言:javascript
代码运行次数:0
运行
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 生产者(发送消息)
代码语言:javascript
代码运行次数:0
运行
复制
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProducerController {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/send")
    public String sendMessage() {
        String queueName = "demo_queue";
        String message = "Hello, RabbitMQ!";
        // 发送消息到队列
        rabbitTemplate.convertAndSend(queueName, message); 
        return "消息发送成功";
    }
}
3. 消费者(接收消息)
代码语言:javascript
代码运行次数:0
运行
复制
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
public class ConsumerService {
    // 监听指定队列
    @RabbitListener(queues = "demo_queue") 
    public void receiveMessage(String message) {
        System.out.println("收到消息: " + message);
    }
}
4. 配置 RabbitMQ 连接(application.yml
代码语言:javascript
代码运行次数:0
运行
复制
spring:
  rabbitmq:
    host: localhost  # RabbitMQ 服务器地址
    port: 5672       # 端口
    username: guest  # 用户名
    password: guest  # 密码
三、工作队列模型特点
  1. 任务分发:多个消费者竞争消费同一队列消息,每条消息仅被一个消费者处理(避免重复执行 )。
  2. 能者多劳:RabbitMQ 默认按轮询分发消息,但可通过设置 channel.basicQos(1) 实现“公平分发”,消费者处理完当前消息,才会获取下一条,让处理快的消费者多消费。
  3. 应用场景:商城中订单处理、物流单分发等,多个 Worker 服务竞争处理任务,提升并行效率。
四、发布订阅模型的交换机类型

发布订阅模型中,交换机负责将消息路由到多个队列,核心交换机类型有:

  • Fanout(广播型 ):消息广播到所有绑定的队列,无视路由键(Routing Key )。
  • Direct(定向型 ):按路由键精准匹配,消息发给 routing key 完全一致的队列。
  • Topic(主题型 ):通过路由键通配符(* 匹配一个单词、# 匹配多个单词 )模糊匹配,实现更灵活的路由。
五、各交换机特性
1. Fanout 交换机
  • 特性:消息广播到所有绑定队列,无需路由键匹配;效率高,适合纯广播场景。
  • 示例:商城商品上下架事件,所有关注的服务(搜索、营销、库存 )都需接收,用 Fanout 广播。
2. Direct 交换机
  • 特性:路由键完全匹配才转发消息;逻辑简单,适合一对一/精准路由场景。
  • 示例:订单支付成功消息,仅通知“支付结果通知”队列,用 Direct 交换机 + routingKey=pay.success
3. Topic 交换机
  • 特性:支持路由键通配符(如 order.# 匹配 order.createorder.pay.success 等 ),灵活适配多条件路由。
  • 示例:商城日志系统,按 服务名.日志级别 路由(如 user-service.error 消息,仅“用户服务错误日志”队列消费 )。
六、特殊队列特性
1. 惰性队列
  • 特性:默认队列消息存内存,惰性队列将消息持久化到磁盘,减少内存占用;适合消息量大、消费慢的场景,但会增加磁盘 IO 开销。
  • 应用:商城历史订单归档消息,量大且访问频率低,用惰性队列存储。
2. 优先级队列
  • 特性:消息带优先级(0 - 255 ),队列优先消费高优先级消息;需设置队列支持优先级,且生产者发送消息时指定优先级。
  • 应用:商城中,VIP 用户订单处理、客服工单加急等,高优先级消息优先处理。
七、解决 MQ 消息堆积问题
  1. 临时扩容消费者:快速新增消费实例,并行消费队列消息,缩短处理耗时。
  2. 优化消费逻辑:简化消费代码、批量处理消息、异步落库等,提升单消费者处理效率。
  3. 死信队列(DLQ ):设置过期未消费消息进入死信队列,避免阻塞正常消息,后续人工/自动处理死信。
  4. 队列拆分:按业务拆分队列(如订单队列拆分为“普通订单”“秒杀订单” ),降低单队列压力。
  5. 限流与降级:生产端限流,避免消息突增;消费端降级(如跳过非核心逻辑 ),优先保障主流程。
八、商城项目应用 MQ 实践
  1. 订单模块
    • 下单后,发消息到 MQ,触发库存扣减、积分发放、短信通知等异步流程。
    • 用 Direct 交换机,routingKey=order.create 路由到库存、积分队列。
  2. 商品模块
    • 商品价格/库存变更,通过 Fanout 交换机广播,搜索服务更新索引、营销服务触发活动。
  3. 秒杀模块
    • 秒杀请求先入 MQ 削峰,订单系统匀速消费,避免数据库被击穿。
  4. 日志与监控
    • 各服务日志发往 Topic 交换机,按 服务名.日志级别 路由到不同日志队列,集中分析。

通过 MQ 解耦、异步化商城各环节,既保障核心流程(如下单 )的高效响应,又能灵活扩展非核心功能,应对大促等高并发场景~

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-06-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、MQ 应用场景
  • 二、RabbitMQ 收发消息入门程序(Java + Spring Boot 示例 )
    • 1. 依赖配置(pom.xml)
    • 2. 生产者(发送消息)
    • 3. 消费者(接收消息)
    • 4. 配置 RabbitMQ 连接(application.yml)
  • 三、工作队列模型特点
  • 四、发布订阅模型的交换机类型
  • 五、各交换机特性
    • 1. Fanout 交换机
    • 2. Direct 交换机
    • 3. Topic 交换机
  • 六、特殊队列特性
    • 1. 惰性队列
    • 2. 优先级队列
  • 七、解决 MQ 消息堆积问题
  • 八、商城项目应用 MQ 实践
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档