阿里云云消息队列RabbitMQ版配置流程:从实例创建到生产级消息收发全解析
引言:为什么选择阿里云云消息队列RabbitMQ版
在分布式系统架构中,消息队列作为解耦、削峰填谷、异步通信的核心组件,已经渗透到订单处理、日志采集、实时通知、数据同步等几乎每一个业务场景。开源RabbitMQ凭借其轻量、稳定、功能丰富以及出色的社区生态,成为消息中间件领域最受欢迎的解决方案之一。然而,自建RabbitMQ集群往往面临着运维复杂度高、脑裂风险、消息积压导致的内存泄漏、弹性扩容困难等一系列稳定性痛点。
阿里云云消息队列RabbitMQ版并非开源RabbitMQ的简单托管版本,而是基于阿里云自研的分布式消息存储技术重新设计的高级消息队列服务。它严格遵循AMQP 0-9-1协议,完全兼容开源RabbitMQ生态系统与多语言客户端,同时通过底层架构的深度优化,有效避免了因消息积压导致的内存泄漏和服务器故障等稳定性问题,并成功解决了分布式系统中的脑裂难题。用户无需关心集群部署、高可用保障、自动扩容、故障恢复等底层运维工作,只需专注于业务代码的开发即可享受开箱即用的全托管消息服务。
本文将从零开始,系统梳理阿里云云消息队列RabbitMQ版的完整配置流程,包含实例创建、核心资源管理、用户权限配置、多语言代码接入、监控告警设置以及常见问题排查,力求打造一份兼具理论深度与实践操作价值的技术指南。
一、核心概念速览:Vhost、Exchange与Queue的三位一体
在开始具体的配置操作之前,先理解阿里云云消息队列RabbitMQ版中三个最核心的抽象概念至关重要。
Vhost(虚拟主机)是实现逻辑隔离的容器单位。一个RabbitMQ实例下可以创建多个Vhost,每个Vhost拥有自己独立的Exchange、Queue和Binding规则,不同Vhost之间的消息和应用互不干扰。这种设计使得同一套RabbitMQ资源可以服务于多个完全独立的业务系统或开发环境,既提升了资源利用率又保障了安全性。生产者与消费者在连接服务端时必须明确指定一个Vhost。
Exchange(交换机)是消息流转的中转枢纽。生产者并不直接将消息发送到Queue,而是将消息投递给Exchange,由Exchange根据预设的Routing Key与绑定规则将消息路由到一个或多个Queue中,或者在某些匹配失败的情况下直接丢弃消息。阿里云RabbitMQ版支持四种Exchange类型:Direct(完全匹配)、Topic(模糊匹配)、Fanout(广播)和Headers(属性匹配)。
Queue(队列)是实际存储消息的容器。消息被Exchange路由到Queue后落盘存储,消费者从Queue中拉取消息进行消费处理。Queue支持持久化、排他性和自动删除等多种属性配置,以满足不同场景的可靠性需求。这三个概念通过Binding(绑定)规则相互关联,Binding定义了Exchange与Queue或Exchange与Exchange之间的路由关系,通过Routing Key实现灵活的消息分发策略。
需要先登录阿里云控制台,点击:阿里云控制台
二、第一步:创建RabbitMQ实例
实例是云消息队列RabbitMQ版最顶层的资源实体,包含Vhost、Exchange、Queue等所有下层资源要素,也是计费与运维管理的基本单位。正式使用之前,需要先创建一个可用的实例。
2.1 准备工作
创建实例前需确保已完成以下准备工作:
- 拥有阿里云账号并已完成实名认证
- 若使用RAM子账号进行操作,需要为该子账号授予操作RabbitMQ服务的相关权限策略,建议遵循最小权限原则
- 确定实例部署的地域(Region),建议与业务服务器保持在同一地域以降低网络延迟
2.2 控制台创建实例
登录云消息队列RabbitMQ版控制台,在左侧导航栏选择"实例列表"。在顶部菜单栏选择目标地域后,单击"创建实例"按钮进入购买配置页面。购买页面需要配置以下核心参数:
- 实例系列:可选择专业版、企业版或铂金版,不同版本在性能规格、高可用保障和功能特性上有所差异。专业版和企业版购买后立即进入服务中状态,铂金版购买后先进入部署中状态,待集群分配完成后再进入服务中状态
- 实例规格:根据预期的消息吞吐量选择合适的TPS(每秒事务处理数)规格
- 存储空间:配置消息持久化存储的磁盘容量
- VPC网络:选择实例所在的专有网络和交换机,后续客户端需通过该网络访问实例
- 身份验证模式:在创建实例时需选择开源身份验证方式或阿里云访问控制(RAM)方式,一旦选定后续不支持修改
完成配置并勾选服务协议后,单击"立即购买"并根据提示完成支付流程。实例创建成功后,可在实例列表页面查看实例状态,确认进入"服务中"状态后即可进行后续资源配置。
三、第二步:创建Vhost——实现多业务逻辑隔离
Vhost是RabbitMQ中实现逻辑隔离的核心机制。在实例创建完成后,首先需要创建Vhost作为后续Exchange和Queue的容器。
3.1 控制台创建Vhost
在实例列表页面单击目标实例名称进入实例详情页。在左侧导航栏单击"Vhost列表",然后点击"创建Vhost"按钮。在弹出的面板中输入Vhost名称,名称只能包含字母、数字、短划线(-)、下划线(_)、半角句号(.)、井号(#)、正斜线(/)、at符号(@)。单击"确定"完成创建。
3.2 Vhost设计最佳实践
在实际生产环境中,建议按照以下原则规划Vhost:
- 按业务域隔离:不同业务系统(如订单系统、支付系统、日志系统)使用不同的Vhost
- 按环境隔离:开发环境、测试环境、预发布环境、生产环境分别使用独立的Vhost
- 按团队隔离:不同开发团队负责的业务模块使用不同的Vhost,便于权限管理和故障隔离
四、第三步:创建Exchange——定义消息路由规则
Exchange是消息路由的中枢,生产者将消息发送到Exchange,由Exchange根据路由规则将消息分发到绑定的Queue中。
4.1 控制台创建Exchange
在实例详情页的左侧导航栏单击"Exchange列表"。在页面顶部的Vhost切换下拉列表中选择目标Vhost,然后点击"创建Exchange"按钮。配置以下参数:
- Exchange名称:自定义名称,不能以"amq."开头(保留字段)
- 类型:选择Direct、Topic、Fanout或Headers之一
- 是否为Internal类型:Internal类型Exchange仅用于Exchange之间的绑定,不接收生产者直接发送的消息
配置完成后单击"确定"创建Exchange。
4.2 Exchange四种类型详解
Direct Exchange:路由规则最为严格,仅当消息的Routing Key与Binding Key完全匹配时,消息才会被路由到对应的Queue。适用于点对点的精准路由场景,如将特定类型的订单消息路由到对应的订单处理队列。
Topic Exchange:与Direct类型相似,但支持通配符匹配。Routing Key使用点号分隔的单词列表,Binding Key支持两个通配符:*匹配一个单词,#匹配零个或多个单词。例如,Binding Key为"order.*.created"可以匹配"order.payment.created"和"order.shipping.created"。适用于需要灵活订阅的消息分发场景。
Fanout Exchange:路由规则最为简单,会将所有发送到该Exchange的消息广播到所有与之绑定的Queue中。适用于广播通知、配置更新推送等场景。
Headers Exchange:不使用Routing Key进行路由,而是使用消息的Headers属性与绑定时设置的键值对进行匹配。适用于需要基于多种属性组合进行复杂路由判断的场景。
五、第四步:创建Queue——消息存储容器
Queue是实际存储消息的容器,消费者从Queue中拉取消息进行消费。
5.1 控制台创建Queue
在实例详情页的左侧导航栏单击"Queue列表"。在Vhost切换下拉列表中选择目标Vhost,然后点击"创建Queue"按钮。配置以下核心参数:
- Queue名称:自定义名称,在同一Vhost下必须唯一
- 是否持久化:开启后消息会持久化到磁盘,服务重启后消息不丢失
- 是否排他:排他队列仅对创建它的连接可见,连接断开后队列自动删除
- 是否自动删除:当最后一个消费者取消订阅后,队列自动删除
- 消息存活时间(TTL):设置队列中消息的最大存活时间,超时后消息进入死信状态
- 死信Exchange:指定消息成为死信后转发到的目标Exchange
5.2 通过代码声明Queue
除了控制台创建,开发者也可以在客户端代码中通过声明方式动态创建Queue。以下为Java原生客户端声明Queue的示例:
Channel channel = connection.createChannel();
// 声明一个持久化、非排他、非自动删除的队列
Map arguments = new HashMap<>();
// 设置队列级别的消息TTL,单位毫秒
arguments.put("x-message-ttl", 60000);
// 设置死信Exchange
arguments.put("x-dead-letter-exchange", "dlx.exchange");
arguments.put("x-dead-letter-routing-key", "dlx.routing.key");
channel.queueDeclare("order.queue", true, false, false, arguments); 需要注意的是,云消息队列RabbitMQ版不支持通过rabbitmqctl工具的policy进行设置,所有TTL配置需通过控制台或客户端代码的x-message-ttl参数完成。如果同时设置了队列级TTL和消息级TTL,则取两者中的较小值作为消息的实际存活时间。
六、第五步:绑定Exchange与Queue——建立路由关系
Binding是将Exchange与Queue关联起来的桥梁,定义了消息从Exchange路由到Queue的规则。
6.1 控制台添加绑定
在Exchange列表页面,找到目标Exchange并单击其名称进入详情页。点击"添加绑定"按钮,配置以下参数:
- 绑定目标:选择要绑定的Queue或其他Exchange
- Routing Key:根据Exchange类型填写对应的路由键
- 对于Direct类型,Routing Key需与消息的Routing Key完全一致
- 对于Topic类型,Routing Key可使用通配符
- 对于Fanout类型,Routing Key会被忽略
单击"确定"完成绑定关系的创建。
6.2 绑定关系设计原则
在设计Binding关系时,建议遵循以下原则:
- 单一职责:每个Queue只绑定与其业务处理能力相关的Exchange和Routing Key
- 避免过度绑定:过多的绑定关系会增加路由开销,影响性能
- 使用Topic Exchange实现灵活路由:当业务需要多种订阅模式时,Topic Exchange比多个Direct Exchange更易于维护
七、第六步:配置用户权限——保障访问安全
云消息队列RabbitMQ版支持两种身份验证和权限管理模式,在创建实例时选定后不可修改。
7.1 两种权限模式对比
开源身份验证和权限管理方式:
- 支持创建自定义用户名和密码,并支持为用户添加细粒度授权
- 支持开源RabbitMQ无缝迁移上云
- 权限的增删改查更加直观
- 支持对Vhost下资源进行细粒度的权限管理(读、写、配置)
- 缺点:内网环境下需要集成私网连接(PrivateLink),使用私网接入点会产生一定费用
- 仅支持新购的Serverless系列独享实例,存量实例不支持
阿里云访问控制(RAM)方式:
- 用户名和密码通过RAM的AccessKey和AccessKey Secret动态生成
- 内网无需集成PrivateLink,不会产生额外费用
- 支持Vhost、Exchange、Queue粒度的授权
- 缺点:高度依赖RAM,耦合性较高;权限配置相对复杂;迁移上云时客户端需要修改用户名和密码
7.2 创建静态用户名密码(开源模式)
若实例采用开源身份验证模式,需在控制台创建静态用户名密码:
在实例详情页的左侧导航栏单击"用户和权限管理"。点击"创建用户名密码"按钮,输入用户名、密码和确认密码。创建成功后,客户端即可使用该用户名密码连接服务端。建议不要使用简单密码,并禁用默认的guest账号。
7.3 RAM子账号授权(RAM模式)
若实例采用RAM模式,需要为RAM用户授予操作RabbitMQ服务的权限。登录RAM控制台,创建自定义权限策略或使用系统预置策略,为RAM用户授予对应实例的访问权限。AccessKey和AccessKey Secret是账号级别的权限认证,多个实例(同一阿里云账号下)可共用一对AccessKey。
如果需要更新静态用户名密码,可以删除后重新创建。客户端在调用SDK收发消息时,应尽可能使用长期存活的Connection,避免每次收发消息都创建新的Connection,以免消耗大量网络资源和服务端资源。
八、第七步:获取接入点——客户端连接配置
接入点是客户端连接RabbitMQ服务端的网络地址,包含VPC内网接入点和公网接入点两种类型。
8.1 获取接入点信息
在实例详情页的"接入点信息"页签中,可以查看以下信息:
- VPC内网接入点:适用于部署在同一VPC内的ECS等阿里云资源访问,延迟低且无公网流量费用
- 公网接入点:适用于外部网络环境访问,建议仅在必要时开启并配置白名单限制
- 端口信息:默认5672端口用于AMQP协议通信
8.2 配置IP白名单
为保障实例安全,建议配置IP白名单限制访问来源。在实例详情页的"接入点信息"页签中,单击白名单列的"VPC白名单"或"公网白名单"进行配置。对于公网访问,可以配置公网IP白名单,确保只有白名单内的IP地址能够访问实例。对于VPC内网访问,可通过配置VPC白名单限制特定VPC或VSwitch的访问。
九、第八步:代码接入——多语言客户端开发
获取接入点和用户名密码后,即可使用开源RabbitMQ客户端进行消息收发。阿里云云消息队列RabbitMQ版完全兼容AMQP 0-9-1协议,支持所有主流编程语言的RabbitMQ客户端。
9.1 Java原生客户端示例
以下为使用Java原生RabbitMQ客户端进行消息生产和消费的完整示例:
import com.rabbitmq.client.*;
import java.nio.charset.StandardCharsets;
public class RabbitMQDemo {
private final static String QUEUE_NAME = "order.queue";
private final static String EXCHANGE_NAME = "order.exchange";
private final static String ROUTING_KEY = "order.created";
public static void main(String[] args) throws Exception {
// 1. 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置接入点(从控制台获取)
factory.setHost("XXXXXX.amqp.aliyuncs.com");
factory.setPort(5672);
// 设置用户名和密码(从控制台获取)
factory.setUsername("your_username");
factory.setPassword("your_password");
// 设置Vhost
factory.setVirtualHost("your_vhost");
// 2. 创建连接和通道
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 3. 声明队列(如果尚未创建)
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
// 4. 声明Exchange
channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT, true);
// 5. 绑定队列到Exchange
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
// 6. 发送消息
String message = "Hello, RabbitMQ!";
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes(StandardCharsets.UTF_8));
System.out.println(" [x] Sent '" + message + "'");
// 7. 消费消息(QoS预取设置)
int prefetchCount = 10;
channel.basicQos(prefetchCount);
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String received = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println(" [x] Received '" + received + "'");
// 手动确认消息
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
// 保持程序运行
System.out.println(" Press Ctrl+C to exit.");
Thread.sleep(60000);
}
}
}9.2 Spring Boot集成示例
阿里云云消息队列RabbitMQ版提供了对Spring框架的官方SDK支持。在Spring Boot项目中集成时,首先在pom.xml中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>在application.properties或application.yml中配置连接参数:
# 接入点(从控制台实例详情页获取)
spring.rabbitmq.host=XXXXXX.amqp.aliyuncs.com
# 端口
spring.rabbitmq.port=5672
# 静态用户名(从控制台静态用户名密码页面获取)
spring.rabbitmq.username=your_username
# 静态密码
spring.rabbitmq.password=your_password
# Vhost名称
spring.rabbitmq.virtual-host=your_vhost
# 消息确认模式:manual手动确认
spring.rabbitmq.listener.simple.acknowledge-mode=manual
# 缓存模式设置为CONNECTION,可更均衡地连接多个服务节点
spring.rabbitmq.cache.connection.mode=connection
spring.rabbitmq.cache.connection.size=50
spring.rabbitmq.cache.channel.size=1
# QoS预取值,服务端使用min{prefetch, 100}作为实际值
spring.rabbitmq.listener.simple.prefetch=100
# 并发消费者数
spring.rabbitmq.listener.simple.concurrency=10
spring.rabbitmq.listener.simple.max-concurrency=20配置参数说明:
- acknowledge-mode:支持none(自动确认,不考虑消费是否成功)、auto(客户端自动发送ack或nack)、manual(手动调用basicAck确认)三种模式
- cache.connection.mode:建议设置为CONNECTION模式,客户端可以更均衡地连接到集群中的多个服务节点,有效防止负载热点
- prefetch:控制消费者未确认消息的最大数量,若消费者处理能力较低,应适当降低该值
在Spring Boot中使用RabbitTemplate发送消息:
@Service
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrderMessage(OrderMessage message) {
rabbitTemplate.convertAndSend("order.exchange", "order.created", message);
}
}使用@RabbitListener注解消费消息:
@Component
public class MessageConsumer {
@RabbitListener(queues = "order.queue")
public void handleOrderMessage(OrderMessage message, Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) long tag) {
try {
// 业务处理逻辑
System.out.println("Received: " + message);
// 手动确认
channel.basicAck(tag, false);
} catch (Exception e) {
// 异常时重新入队或转入死信
channel.basicNack(tag, false, true);
}
}
}十、第九步:配置监控告警——保障服务稳定性
实例创建后,云监控自动开始对其进行监控。开发者可以查看实例、Vhost、Queue和Exchange的多维度监控数据,并设置报警规则以便在数据异常时及时收到通知。
10.1 核心监控指标
云消息队列RabbitMQ版支持以下核心监控项:
- 实例级别:消息流入速率(InstanceTPSIn)、消息流出速率(InstanceTPSOut)、API请求速率峰值(InstanceMaxTpsInMiunte)、消费者数量(InstanceConsumers)、连接数量(InstanceConnections)、通道数量(InstanceChannelsNew)
- Vhost级别:每秒消息流入数(VHostTPSIn)、每秒消息流出数(VHostTPSOut)、消费者数量(InstanceVhostConsumers)、连接数量(VhostConnections)、通道数量(VhostChannels)
- Queue级别:每秒消息流入数(QueueTPSIn)、每秒消息流出数(QueueTPSOut)、消费者数量(InstanceVhostQueueConsumers)、消息堆积量
消息堆积量的计算方式:如果Queue没有设置MessageTTL,则堆积量是Queue中未消费的消息数量;如果Queue设置了MessageTTL,堆积量计算的是定时器中的消息量。
10.2 设置报警规则
在云监控控制台为RabbitMQ实例创建报警规则,建议重点关注以下报警场景:
- 消息堆积量过高:当Queue中未消费消息数量超过阈值时报警,提示消费者处理能力不足
- 消息流入/流出速率异常:速率突降可能表示生产者或消费者出现故障
- 连接数或通道数超限:可能表示客户端未正确关闭连接或存在连接泄漏
- 消费者数量归零:表示没有活跃消费者,消息将无法被及时处理
10.3 消息轨迹查询
当消息收发不符合预期时,可以使用消息轨迹查询功能排查问题。实例是否支持消息轨迹以及可查询的时间范围,由创建实例时的配置决定。支持按Queue查询和按Message ID查询两种方式。通过消息轨迹可以追踪消息从生产到消费的完整链路,快速定位消息丢失、重复消费、消费延迟等异常问题。
十一、第十步:高级特性配置——死信队列与消息TTL
11.1 死信队列配置
死信队列用于处理无法被正常消费的消息。消息成为死信的常见原因包括:消息被消费者拒绝(basicNack/basicReject)且不重新入队、消息TTL过期、队列达到最大长度等。
在控制台创建Queue时,可以配置以下死信相关参数:
- 死信Exchange:指定消息成为死信后转发到的目标Exchange
- 死信Routing Key:指定死信消息转发时使用的Routing Key
通过代码声明Queue时设置死信参数:
Map args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx.exchange");
args.put("x-dead-letter-routing-key", "dlx.routing.key");
channel.queueDeclare("main.queue", true, false, false, args); 建议为每个业务队列配置对应的死信队列,以便对异常消息进行隔离分析和人工处理。
11.2 消息TTL配置
云消息队列RabbitMQ版支持两种TTL设置方式:
- 队列级别TTL:在创建Queue时通过x-message-ttl参数设置,作用于该队列中的所有消息
- 消息级别TTL:在发送消息时通过expiration属性设置,仅作用于单条消息
发送消息时设置TTL的示例:
byte[] messageBody = "expiring message".getBytes();
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.expiration("60000") // 60秒后过期
.deliveryMode(2) // 持久化
.build();
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY, properties, messageBody);当队列级别TTL和消息级别TTL同时设置时,取两者中的较小值作为消息的实际存活时间。
十二、常见问题排查与最佳实践
12.1 连接失败排查
连接失败时,按以下步骤排查:
- 确认接入点地址是否正确(从控制台实例详情页获取)
- 确认用户名密码是否正确(从控制台用户和权限管理页面获取)
- 确认Vhost名称是否正确
- 确认网络连通性:检查安全组规则、IP白名单配置
- 确认实例状态是否为"服务中"
12.2 消息堆积处理
消息堆积的常见原因及解决方案:
- 消费者处理能力不足:增加消费者实例数量或提升单消费者处理速度
- 消费者异常退出:检查消费者代码稳定性,配置重试机制
- QoS设置不合理:适当增加prefetch值以提高消费吞吐量
- 网络延迟过高:将消费者部署在与RabbitMQ实例相同的VPC内
12.3 最佳实践总结
- 使用长连接:客户端应尽可能使用长期存活的Connection,避免频繁创建和销毁连接
- 合理设置QoS:根据消费者处理能力调整prefetch值,避免消息过度堆积或消费者过载
- 配置死信队列:为每个业务队列配置死信队列,防止异常消息阻塞正常消息处理
- 开启消息轨迹:在创建实例时开启消息轨迹功能,便于后续问题排查
- 遵循最小权限原则:使用RAM子账号并授予最小必要权限
- 配置监控告警:对消息堆积量、消费速率等核心指标设置告警
问答环节
问1:阿里云云消息队列RabbitMQ版与开源RabbitMQ有何区别?
答:阿里云云消息队列RabbitMQ版并非开源RabbitMQ的简单托管,而是基于阿里云自研分布式存储技术重新设计的高级服务。它完全兼容AMQP 0-9-1协议和开源客户端,同时解决了开源版本的消息堆积导致内存泄漏、脑裂等稳定性问题,用户无需关心集群部署、高可用保障和自动扩容等运维工作。
问2:创建实例时选择的身份验证模式可以后续修改吗?
答:不可以。云消息队列RabbitMQ版支持开源身份验证和RAM两种模式,在创建实例时仅可选择其中一种,且不支持后续修改。因此在创建实例前需根据业务需求慎重选择。
问3:如何实现不同业务系统之间的消息隔离?
答:通过Vhost实现逻辑隔离。一个实例下可以创建多个Vhost,每个Vhost拥有独立的Exchange、Queue和Binding,不同Vhost之间的消息和应用互不干扰。建议按业务域、环境或团队划分不同的Vhost。
问4:消息堆积的根源是什么?如何优化?
答:消息堆积的根源通常是消费者处理能力低于生产者发送速率。优化方案包括:增加消费者实例数量、提升单消费者处理性能、合理设置QoS预取值(prefetch)、检查消费者是否存在异常退出情况。服务端使用min{prefetch, 100}作为实际的QoS值。
问5:如何在Spring Boot中配置手动消息确认?
答:在application.properties中设置`spring.rabbitmq.listener.simple.acknowledge-mode=manual`,然后在消费方法中通过Channel参数手动调用`basicAck`确认成功消费或`basicNack`拒绝消费。
问6:消息轨迹功能如何使用?
答:实例是否支持消息轨迹由创建时的配置决定。在控制台的消息轨迹页面,可以通过按Queue查询(适用于只知道Queue名称的模糊查询)或按Message ID查询(精确查询)两种方式追踪消息的完整收发链路,帮助排查消息丢失、重复消费等异常问题。



