活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心
      文档中心

      分布式消息服务RabbitMQ

      分布式消息服务RabbitMQ

        • 产品动态
        • 产品简介
        • 产品定义
        • 产品优势
        • 典型应用场景
        • 产品规格
        • RabbitMQ实例规格
        • 与Kafka、RocketMQ的差异
        • 与其他云服务的关系
        • 约束与限制
        • RabbitMQ相关概念
        • 权限管理
        • 计费说明
        • 计费概述
        • 计费模式
        • 计费模式概述
        • 包年/包月
        • 按需计费
        • 计费项
        • 计费样例
        • 产品价格
        • 快速入门
        • 入门指引
        • 步骤一:准备环境
        • 步骤二:创建RabbitMQ实例
        • 步骤三:连接实例生产消费消息
        • 不使用SSL证书连接
        • 使用SSL证书连接
        • 步骤四:配置必须的监控告警
        • 入门实践
        • 用户指南
        • 权限管理
        • 创建用户并授权使用RabbitMQ
        • RabbitMQ自定义策略
        • RabbitMQ资源
        • RabbitMQ请求条件
        • 环境准备
        • 购买实例
        • 连接实例
        • 连接未开启SSL的RabbitMQ实例
        • 连接已开启SSL的RabbitMQ实例
        • 连接RabbitMQ 管理地址
        • 开启心跳
        • 查看客户端连接地址
        • 实例日常管理
        • 查看实例
        • 重启实例
        • 删除实例
        • 修改实例信息
        • 重置实例密码
        • 变更实例规格
        • 设置实例的公网访问
        • 设置实例镜像队列
        • 管理实例标签
        • 按需转包周期
        • 删除队列
        • 导出实例
        • 插件管理
        • 开启实例插件
        • 使用rabbitmq_tracing插件
        • Vhost管理
        • 创建Vhost
        • 删除Vhost
        • 高级特性
        • 惰性队列
        • 消息持久化
        • 死信和TTL
        • RabbitMQ消息确认机制
        • 预取值
        • 心跳检测
        • 单一活跃消费者
        • 仲裁队列
        • 调整资源配额
        • 监控
        • 支持的监控指标
        • 设置RabbitMQ告警规则
        • 查看监控数据
        • 云审计服务支持的关键操作
        • 云审计服务支持的RabbitMQ操作列表
        • 查看云审计日志
        • 最佳实践
        • RabbitMQ业务迁移
        • RabbitMQ消息持久化
        • RabbitMQ惰性队列
        • RabbitMQ队列迁移
        • 如何实现RabbitMQ的高性能
        • 节点重启后消费者如何重连
        • 网络异常自动恢复
        • 常见问题
        • 实例类
        • 连接类
        • 插件类
        • 消息问题
        • 监控告警类
        • DMS RabbitMQ帐号密码规范
        • 复杂操作问题
        • 消息堆积对业务的影响及解决办法
        • 文档下载
        • 相关协议
        • 分布式消息服务RabbitMQ服务等级协议
          无相关产品

          本页目录

          帮助中心分布式消息服务RabbitMQ最佳实践如何实现RabbitMQ的高性能
          如何实现RabbitMQ的高性能
          更新时间 2024-09-11 15:36:25
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          最近更新时间: 2024-09-11 15:36:25
          分享文章
          • 新浪微博
          • 微信
            扫码分享
          • 复制链接
          本文主要介绍如何实现RabbitMQ的高性能最佳实践。

          本章节基于吞吐量和可靠性两个指标,指导您通过设置队列长度、集群负载均衡、优先队列数量等参数,实现RabbitMQ的高性能。

          使用较小的队列长度

          队列中存在大量消息时,会给内存使用带来沉重的负担,为了释放内存,RabbitMQ会将消息刷新到磁盘。这个过程通常需要时间,由于需要重建索引,重启包含大量消息的集群非常耗时。当刷盘的消息过多时,会阻塞队列处理消息,从而降低队列速度,对RabbitMQ节点的性能产生负面影响。

          要获得最佳性能,应尽可能缩短队列。建议始终保持队列消息堆积的数量在0左右。

          对于经常受到消息峰值影响的应用程序,和对吞吐量要求较高的应用程序,建议在队列上设置 最大长度 。这样可以通过丢弃队列头部的消息来保持队列长度,队列长度永远不会大于最大长度设置。

          最大长度可以通过Policy设置,也可以通过在队列声明时使用对应参数设置。

          • 在Policy中设置

          图片8.png

          • 在队列声明时使用对应参数设置
            //创建队列
            HashMap<String, Object> map = new HashMap<>();
            //设置队列最大长度
            map.put("x-max-length",10 );
            //设置队列溢出方式保留前10
            map.put("x-overflow","reject-publish" );
            channel.queueDeclare(queueName,false,false,false,map);
            

          当队列长度超过设置的最大长度时,RabbitMQ的默认做法是将队列头部的信息(队列中最老的消息)丢弃或变成死信。可以通过设置不同的overflow值来改变这种方式,如果overflow值设置为 drop-head ,表示从队列前面丢弃或dead-letter消息,保存后n条消息。如果overflow值设置为 reject-publish ,表示最近发布的消息将被丢弃,即保存前n条消息。

          说明

          如果同时使用以上两种方式设置队列的最大长度,两者中较小的值将被使用。
          超过队列最大长度的消息会被丢弃,请谨慎使用。

          使用集群的负载均衡

          队列的性能受单个CPU内核控制,当一个RabbitMQ节点处理消息的能力达到瓶颈时,可以通过集群进行扩展,从而达到提升吞吐量的目的。

          使用多个节点,集群会自动将队列均衡的创建在各个节点上。除了使用集群模式,您还可以使用以下两个插件优化负载均衡:

          Consistent hash exchange

          该插件使用交换器来平衡队列之间的消息。根据消息的路由键,发送到交换器的消息一致且均匀地分布在多个队列中。该插件创建路由键的散列,并将消息传播到与该交换器具有绑定关系的队列中。使用此插件时,需要确保消费者从所有队列中消费。

          使用示例如下:

          • 使用不同的路由键来路由消息。
          public class ConsistentHashExchangeExample1 {
            private static String CONSISTENT_HASH_EXCHANGE_TYPE = "x-consistent-hash";
          
            public static void main(String[] argv) throws IOException, TimeoutException, InterruptedException {
              ConnectionFactory cf = new ConnectionFactory();
              Connection conn = cf.newConnection();
              Channel ch = conn.createChannel();
          
              for (String q : Arrays.asList("q1", "q2", "q3", "q4")) {
                ch.queueDeclare(q, true, false, false, null);
                ch.queuePurge(q);
              }
          
              ch.exchangeDeclare("e1", CONSISTENT_HASH_EXCHANGE_TYPE, true, false, null);
          
              for (String q : Arrays.asList("q1", "q2")) {
                ch.queueBind(q, "e1", "1");
              }
          
              for (String q : Arrays.asList("q3", "q4")) {
                ch.queueBind(q, "e1", "2");
              }
          
              ch.confirmSelect();
          
              AMQP.BasicProperties.Builder bldr = new AMQP.BasicProperties.Builder();
              for (int i = 0; i < 100000; i++) {
                ch.basicPublish("e1", String.valueOf(i), bldr.build(), "".getBytes("UTF-8"));
              }
          
              ch.waitForConfirmsOrDie(10000);
          
              System.out.println("Done publishing!");
              System.out.println("Evaluating results...");
              // wait for one stats emission interval so that queue counters
              // are up-to-date in the management UI
              Thread.sleep(5);
          
              System.out.println("Done.");
              conn.close();
            }
          }
          
          • 通过不同的header来路由消息,该方式需要为交换器提供“hash-header”参数设置,且消息必须带有header,否则会被路由到相同的队列。
          public class ConsistentHashExchangeExample2 {
            public static final String EXCHANGE = "e2";
            private static String EXCHANGE_TYPE = "x-consistent-hash";
          
            public static void main(String[] argv) throws IOException, TimeoutException, InterruptedException {
              ConnectionFactory cf = new ConnectionFactory();
              Connection conn = cf.newConnection();
              Channel ch = conn.createChannel();
          
              for (String q : Arrays.asList("q1", "q2", "q3", "q4")) {
                ch.queueDeclare(q, true, false, false, null);
                ch.queuePurge(q);
              }
          
              Map<String, Object> args = new HashMap<>();
              args.put("hash-header", "hash-on");
              ch.exchangeDeclare(EXCHANGE, EXCHANGE_TYPE, true, false, args);
          
              for (String q : Arrays.asList("q1", "q2")) {
                ch.queueBind(q, EXCHANGE, "1");
              }
          
              for (String q : Arrays.asList("q3", "q4")) {
                ch.queueBind(q, EXCHANGE, "2");
              }
          
              ch.confirmSelect();
          
          
              for (int i = 0; i < 100000; i++) {
                AMQP.BasicProperties.Builder bldr = new AMQP.BasicProperties.Builder();
                Map<String, Object> hdrs = new HashMap<>();
                hdrs.put("hash-on", String.valueOf(i));
                ch.basicPublish(EXCHANGE, "", bldr.headers(hdrs).build(), "".getBytes("UTF-8"));
              }
          
              ch.waitForConfirmsOrDie(10000);
          
              System.out.println("Done publishing!");
              System.out.println("Evaluating results...");
              // wait for one stats emission interval so that queue counters
              // are up-to-date in the management UI
              Thread.sleep(5);
          
              System.out.println("Done.");
              conn.close();
            }
          }
          
          • 使用消息属性来路由消息,例如message_id、correlation_id或timestamp属性。该方式需要使用“hash-property”参数来声明交换器,且消息必须带有所选择的消息属性,否则会被路由到相同的队列。
          public class ConsistentHashExchangeExample2 {
            public static final String EXCHANGE = "e2";
            private static String EXCHANGE_TYPE = "x-consistent-hash";
          
            public static void main(String[] argv) throws IOException, TimeoutException, InterruptedException {
              ConnectionFactory cf = new ConnectionFactory();
              Connection conn = cf.newConnection();
              Channel ch = conn.createChannel();
          
              for (String q : Arrays.asList("q1", "q2", "q3", "q4")) {
                ch.queueDeclare(q, true, false, false, null);
                ch.queuePurge(q);
              }
          
              Map<String, Object> args = new HashMap<>();
              args.put("hash-header", "hash-on");
              ch.exchangeDeclare(EXCHANGE, EXCHANGE_TYPE, true, false, args);
          
              for (String q : Arrays.asList("q1", "q2")) {
                ch.queueBind(q, EXCHANGE, "1");
              }
          
              for (String q : Arrays.asList("q3", "q4")) {
                ch.queueBind(q, EXCHANGE, "2");
              }
          
              ch.confirmSelect();
          
          
              for (int i = 0; i < 100000; i++) {
                AMQP.BasicProperties.Builder bldr = new AMQP.BasicProperties.Builder();
                Map<String, Object> hdrs = new HashMap<>();
                hdrs.put("hash-on", String.valueOf(i));
                ch.basicPublish(EXCHANGE, "", bldr.headers(hdrs).build(), "".getBytes("UTF-8"));
              }
          
              ch.waitForConfirmsOrDie(10000);
          
              System.out.println("Done publishing!");
              System.out.println("Evaluating results...");
              // wait for one stats emission interval so that queue counters
              // are up-to-date in the management UI
              Thread.sleep(5);
          
              System.out.println("Done.");
              conn.close();
            }
          }
          

          RabbitMQ sharding

          该插件自动对队列进行分区,也就是说,一旦您将一个交换器定义为sharded,那么在每个集群节点上自动创建支持队列,并在它们之间共享消息。该插件提供了一个集中发送消息的位置,并通过向集群中的其他节点添加队列,实现负载均衡。使用此插件时,需要确保消费者从所有队列中消费。

          配置RabbitMQ sharding插件的步骤如下:

          1. 创建x-modulus-hash属性交换器。

          图片9.png

          1. 为该交换器添加策略。

          图片10.png

          1. 单击该交换器详情,查看是否配置成功。

          图片11.png

          自动删除不再使用的队列

          客户端可能连接失败导致队列被残留,大量的残留队列会影响实例的性能。RabbitMQ提供三种自动删除队列的方法:

          • 在队列中设置TTL策略:例如TTL策略设置为28天,当持续28天队列未被使用时,此队列将被删除。
          • 使用auto-delete队列:当最后一个消费者退出或通道/连接关闭(或与服务器的TCP连接丢失)时,auto-delete队列会被删除。
          • 使用exclusive queue:exclusive queue只能在创建它的连接中使用,当此连接关闭或消失时,exclusive queue会被删除。

          设置方法如下:

          boolean exclusive = true;
          boolean autoDelete = true;
          channel.queueDeclare(QUEUENAME, durable, exclusive, autoDelete, arguments);
          

          限制使用优先队列的数量

          每个优先队列会启动一个Erlang进程,过多的优先队列会影响性能。在大多数情况下,建议使用不超过5个优先队列。

          连接和通道

          每个连接使用大约100 KB的内存(如果使用 TLS会更多),成千上万的连接会导致RabbitMQ负载很高,极端情况下,会导致内存溢出。AMQP协议引入了通道的概念,一个连接中可以有多个通道。连接是长期存在的,AMQP连接的握手过程比较复杂,至少需要7个TCP数据包(如果使用TLS会更多)。相对连接来说,打开和关闭通道会更简单,但是建议通道也设置为长期存在的。例如,应该为每个生产者线程重用相同的通道,不要在每次生产时都打开通道。最佳实践是重用连接并将线程之间的连接与通道多路复用。

          推荐使用Spring AMQP线程池:ConnectionFactory是Spring AMQP定义的连接工厂,负责创建连接。

          不要在线程之间共享通道

          大多数客户端并未实现通道的线程安全,所以不要在线程之间共享通道。

          不要频繁打开和关闭连接或通道

          频繁打开和关闭连接或通道会发送和接收大量的TCP包,从而导致更高的延迟,确保不要频繁打开和关闭连接或通道。

          生产者和消费者使用不同的通道

          生产者和消费者使用不同的连接以实现高吞吐量。当生产者发送太多消息给服务端处理时,RabbitMQ会将压力传递到TCP连接上。如果在同一个TCP连接上消费,服务端可能不会收到来自客户端的消息确认,从而影响消费性能。若消费速度过低,服务端将不堪重负。

          大量的连接和通道可能会影响RabbitMQ管理接口的性能

          RabbitMQ会收集每个连接和通道的数据进行分析和显示,大量连接和通道会影响RabbitMQ管理接口的性能。

          禁用未使用的插件

          插件可能会消耗大量CPU或占用大量内存,建议禁用未使用的插件。

          文档反馈

          建议您登录后反馈,可在建议与反馈里查看问题处理进度

          鼠标选中文档,精准反馈问题

          选中存在疑惑的内容,即可快速反馈问题,我们会跟进处理

          知道了

          上一篇 :  RabbitMQ队列迁移
          下一篇 :  节点重启后消费者如何重连
          搜索 关闭
          ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
          公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
          备案 京公网安备11010802043424号 京ICP备 2021034386号
          ©2025天翼云科技有限公司版权所有
          京ICP备 2021034386号
          备案 京公网安备11010802043424号
          增值电信业务经营许可证A2.B1.B2-20090001
          用户协议 隐私政策 法律声明