云服务器内容精选

  • 计费说明 分布式消息服务RabbitMQ版的计费项由实例费用和存储空间费用组成。具体内容如表1所示。 如您需要快速了解分布式消息服务RabbitMQ版的具体价格,请参见分布式消息服务RabbitMQ版价格详情。 表1 分布式消息服务RabbitMQ版计费项 计费项 计费项说明 适用的计费模式 计费公式 实例费用 计费因子:代理规格和代理数量 说明: 实例费用在账单中显示的产品名称为“分布式消息服务专享版”。 包年/包月、按需计费 实例规格单价 * 购买时长 实例规格单价请参见分布式消息服务RabbitMQ版价格详情中的“实例价格”。 存储空间费用 计费因子:云硬盘类型、容量 说明: 存储空间费用在账单中显示的产品名称为“分布式消息服务物理多租存储”。 包年/包月、按需计费 云硬盘单价 * 购买时长 云硬盘单价请参见分布式消息服务RabbitMQ版价格详情中的“存储价格”。
  • 计费示例 以包年/包月计费模式为例,假设您于2023/03/08 15:50:04在“华北-北京四”区域购买了一个包年/包月RabbitMQ实例(规格:rabbitmq.2u4g.cluster*3,总存储空间:超高I/O 300GB),计费资源包括实例费用(代理规格和代理数量),以及存储空间费用(超高I/O 300GB)。购买时长为一个月,并在到期前手动续费1个月,则: 第一个计费周期为:2023/03/08 15:50:04 ~ 2023/04/08 23:59:59 第二个计费周期为:2023/04/08 23:59:59 ~ 2023/05/08 23:59:59 图1给出了上述示例配置的费用计算过程。图中价格仅供参考,实际计算请以分布式消息服务RabbitMQ版价格详情中的价格为准。 图1 包年/包月RabbitMQ实例费用计算示例(华北-北京四区域) 按需计费模式下,各计费项的计费示例请参见计费示例。
  • 维度 Key Value rabbitmq_instance_id RabbitMQ实例 rabbitmq_node RabbitMQ实例节点 rabbitmq_queue RabbitMQ实例队列 rabbitmq_vhost RabbitMQ实例Vhost rabbitmq_vhost_exchange RabbitMQ实例Exchange rabbitmq_vhost_queue RabbitMQ实例Queue
  • 变更实例规格的影响 表3 变更实例规格的影响 变更配置类型 影响 代理数量 变更规格过程中会有秒级业务中断,客户端需要支持自动重连,建议在业务低峰时进行变更。 预计总变更时长为10分钟左右。 存储空间 扩容存储空间不会影响业务。 可用存储空间=实际存储空间-用于存储日志的存储空间-格式化磁盘的损耗。例如,实际扩容存储空间到700GB,用于存储日志的数据的存储空间为100GB,格式化磁盘损耗7GB,那么扩容后的可用存储空间为593GB。 预计总变更时长为5分钟内。 代理规格/实例规格 RabbitMQ 3.x.x版本单机实例和没有配置镜像/仲裁队列的集群实例在变更规格过程中会有分钟级业务中断,客户端需要支持自动重连,建议在业务低峰时进行变更。 RabbitMQ 3.x.x版本配置了镜像/仲裁队列的集群实例在变更规格过程中会有秒级业务中断,客户端需要支持自动重连,建议在业务低峰时进行变更。 RabbitMQ AMQP-0-9-1版本单机实例和集群实例在变更规格过程中会有秒级连接闪断,客户端需要支持自动重连,建议在业务低峰时进行变更。 代理采用滚动重启的方式进行实例变更,变更时长和代理数量有关,单个代理的变更时长一般在5~10分钟,总变更时长为(5~10分钟)*代理数量。
  • 测试步骤 登录客户端服务器,进入“rabbitmq-perf-test-2.18.0/bin”目录下。 运行以下脚本,测试并记录不同实例规格下的生产速率和消费速率。 ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x 3 -y 3 -z 300 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 3 -y 3 -z 300 运行以下脚本,测试并记录rabbitmq-ssl实例在不同生产者数量、消费者数量、队列数量的生产速率和消费速率。 单队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqps://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x ${生产者个数} -y ${消费者个数} -z 300 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqps://test:******@192.168.0.150:5671 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300 多队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqps://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqps://test:******@192.168.0.150:5671 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3 运行以下脚本,测试并记录rabbitmq-2u4g实例在不同生产者数量、消费者数量、队列数量的生产速率和消费速率。 单队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x ${生产者个数} -y ${消费者个数} -z 300 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300 多队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -x ${生产者个数} -y ${消费者个数} -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3 运行以下脚本,测试并记录rabbitmq-2u4g实例在不同生产者数量、消费者数量、队列数量、队列类型的生产速率和消费速率,其中队列类型分别为“惰性”、“镜像”和“仲裁”。 单队列测试脚本(不包括仲裁队列): ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x ${生产者个数} -y ${消费者个数} -z 300 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300 多队列测试脚本(不包括仲裁队列): ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -x ${生产者个数} -y ${消费者个数} -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3 单队列测试脚本(仲裁队列): ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x ${生产者个数} -y ${消费者个数} -z 300 --predeclared 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -u queue-1 -x 1 -y 1 -z 300 --predeclared 多队列测试脚本(仲裁队列): ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -x ${生产者个数} -y ${消费者个数} -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x --predeclared 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-direct -s 1024 -x 3 -y 3 -z 300 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3 --predeclared 运行以下脚本,测试并记录rabbitmq-2u4g实例的Fanout Exchange在不同消费者数量、队列数量的生产速率和消费速率。 单队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x ${生产者个数} -y ${消费者个数} -z 300 --predeclared 示例如下: ./runjava com.rabbitmq.perf.PerfTest -h amqp://test:******@192.168.0.150:5672 -e exchange-fanout -s 1024 -u queue-1 -x 1 -y 3 -z 300 --predeclared
  • 测试结果 测试场景一(实例规格):相同Exchange、队列、生产者数量、消费者数量、不同的实例规格 测试参数如下: Exchange:类型为“direct”,非持久化,不会自动删除。 队列:类型“经典队列”,数量为“3”,非持久化,会自动删除。 生产者:数量为“3”。 消费者:数量为“3”。 表2 测试结果 实例规格 磁盘类型 代理数量 生产速率 消费速率 rabbitmq.2u4g.cluster 超高I/O 3 32052 25219 rabbitmq.4u8g.cluster 超高I/O 3 53774 47370 rabbitmq.8u16g.cluster 超高I/O 3 54727 45730 rabbitmq.16u32g.cluster 超高I/O 3 66896 51061 通过上表的测试结果,得出以下结论,仅供参考:实例规格越大,实例性能越高。
  • 测试脚本 测试脚本自动创建的Exchange类型为“direct”,队列特性为非持久化、自动删除,在测试fanout类型Exchange和仲裁队列时,需要在脚本后增加“--predeclared”,表示使用自己定义的Exchange和队列参数。 测试开启SSL的实例时,需要将“amqp://”修改为“amqps://”,表示以加密形式传输数据。 单队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -u ${队列名称} -x ${生产者个数} -y ${消费者个数} -z ${运行时间} 参数说明如下: 实例用户名:购买实例时设置的用户名。 实例密码:购买实例时设置的密码。 内网连接地址:购买实例后获取的内网连接地址。 队列名称:队列的名称。 生产者个数:生产者的数量。 消费者个数:消费者的数量。 运行时间:脚本的运行时间,单位为秒。 多队列测试脚本: ./runjava com.rabbitmq.perf.PerfTest -h amqp://${实例用户名}:${实例密码}@${内网连接地址} -e ${Exchange名称} -s 1024 -x ${生产者个数} -y ${消费者个数} -z ${运行时间} --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to x 参数说明如下: 实例用户名:购买实例时设置的用户名。 实例密码:购买实例时设置的密码。 内网连接地址:购买实例后获取的内网连接地址。 生产者个数:生产者的数量。 消费者个数:消费者的数量。 运行时间:脚本的运行时间,单位为秒。 queue-%d:表示多个队列,队列名称前缀为queue-,%d表示变量,取值为从--queue-pattern-from数值到--queue-pattern-to数值的连续整数。例如 --queue-pattern 'queue-%d' --queue-pattern-from 1 --queue-pattern-to 3,表示3个队列,队列名称为queue-1、queue-2、queue-3。
  • 测试环境 进行性能测试前,您需要先构建如下的测试环境: 购买如表1所示RabbitMQ 3.8.35版本的集群实例,购买方法请参考购买RabbitMQ实例。 设置连接RabbitMQ密码时,建议不要使用特殊字符。如果使用特殊字符,在使用测试脚本时,需要对特殊字符进行转义处理,否则会报错。 购买“rabbitmq-2u4g”实例时,请开启公网访问,并在安全组中入方向规则中放通15672端口,以便在浏览器中访问WebUI界面。 表1 实例参数 名称 代理数量 规格 是否开启SSL 磁盘类型 rabbitmq-ssl 3 rabbitmq.2u4g.cluster 是 超高I/O rabbitmq-2u4g 3 rabbitmq.2u4g.cluster 否 超高I/O rabbitmq-4u8g 3 rabbitmq.4u8g.cluster 否 超高I/O rabbitmq-8u16g 3 rabbitmq.8u16g.cluster 否 超高I/O rabbitmq-16u32g 3 rabbitmq.16u32g.cluster 否 超高I/O 购买完成后,在实例详情页获取RabbitMQ实例的内网连接地址,并记录购买实例时设置的用户名和密码。如果是“rabbitmq-2u4g”实例,除了内网连接地址、用户名和密码外,还需要记录Web界面UI地址,此地址在后续登录WebUI界面设置镜像队列和惰性队列时需要使用。 在“rabbitmq-2u4g”实例中,登录WebUI,并设置镜像队列、惰性队列和仲裁队列。 在“rabbitmq-2u4g”实例的“/”Vhost下,创建“fanout”类型的Exchange,具体步骤请参考创建RabbitMQ Exchange。 获取测试工具rabbitmq-perf-test-2.18.0-bin.tar.gz。 购买客户端服务器。 购买区域、可用区、虚拟私有云、子网、安全组与RabbitMQ实例保持一致,规格为16U32G,Linux系统的E CS 服务器,具体步骤请参考购买弹性云服务器。 购买完成ECS后,需要在ECS中完成以下配置: 安装Java JDK,并配置JAVA_HOME与PATH环境变量。 export JAVA_HOME=/root/jdk1.8.0_231 export PATH=$JAVA_HOME/bin:$PATH 下载rabbitmq-perf-test-2.18.0-bin.tar.gz,并解压。 tar -zxvf rabbitmq-perf-test-2.18.0-bin.tar.gz
  • 约束与限制 2020年7月1日之前购买的RabbitMQ实例,不支持在控制台开启插件,如果需要开启,请提交工单联系技术人员在后台开启插件。 2020年11月14日之前购买的RabbitMQ实例,不支持在控制台开启rabbitmq_consistent_hash_exchange插件,如果需要开启,请提交工单联系技术人员在后台开启插件。 开启插件过程中,不会重启实例。 rabbitmq_shovel和rabbitmq_federation插件在特定场景下才支持开启,具体如表2所示。 表2 支持开启插件的场景 实例 rabbitmq_shovel rabbitmq_federation 未开启SSL的单机实例 支持 支持 已开启SSL的单机实例 不支持 不支持 未开启SSL的集群实例 不支持 支持 已开启SSL的集群实例 不支持 不支持
  • 创建RabbitMQ Vhost(RabbitMQ WebUI) 登录RabbitMQ WebUI。 在顶部导航栏选择“Admin”,进入Admin页面。 在右侧导航栏选择“Virtual Hosts”,进入Virtual Hosts页面。 图4 Virtual Hosts 在“Add a new virtual host”区域,输入Vhost名称,单击“Add virtual host”。 图5 创建Vhost(WebUI) 创建成功后,在“All virtual hosts”区域,显示创建成功的Vhost。 图6 Vhost列表(WebUI)
  • 配置RabbitMQ镜像队列 登录RabbitMQ实例的Web UI。 在菜单栏,选择“Admin”。 图1 选择Admin菜单 (可选)如果您需要设置指定Vhost,请执行本步骤;如果不需要,请直接执行4。 选择右侧导航栏“Virtual Hosts”,然后输入“Name”,单击“Add virtual host”,创建Vhost。 图2 创建Vhost 选择右侧导航栏“Policies”,为Vhost设置策略。 图3 设置Vhost策略 表1 策略参数说明 参数 说明 Virtual Host 设置策略所应用的Vhost。如果为指定的Vhost设置,请在“Virtual Host”选择3创建的Vhost;如果没有,则默认为“/”。 Name 策略的名称,用户自定义。 Pattern Queue的匹配模式(正则表达式)。 Apply to 策略所适用的目标。 Priority 策略的优先级,数字越大,优先级越高。 Definition 镜像定义,包括三个部分ha-sync-mode、ha-mode、ha-params。 ha-sync-mode: 表示镜像队列中消息的同步方式,有效取值范围为:automatic和manual。 automatic:表示自动向master同步数据。 manual:表示手动向master同步数据。 ha-mode: 指明镜像队列的模式,有效取值范围为:all、exactly和nodes。 all:表示在集群所有的节点上进行镜像。 exactly:表示在指定个数的节点上进行镜像,节点的个数由ha-params指定。 nodes:表示在指定的节点上进行镜像,节点名称通过ha-params指定。 ha-params: ha-mode模式需要用到的参数。 说明: 如果将队列镜像到集群所有节点上,可能会导致集群承受不必要的网络及磁盘I/O流量。因此,推荐您使用以下参数配置: ha-sync-mode: automatic ha-mode: exactly ha-params: n/2+1,其中n表示集群中总节点数量,n/2的值向下取整。 例如集群总节点数为3,ha-params设置为3/2+1=2,此时队列将镜像到一个主节点和一个从节点上。这样配置既保证了数据的高可用性,又避免了不必要的资源开销。 单击“Add policy”。 策略添加成功后如下图所示。 图4 Vhost策略
  • 预取值设置建议 如果您只有一个或很少几个消费者在处理消息,建议一次预取多条消息,尽量让客户端保持忙碌。如果您的处理时间和网络状态稳定,则只需将总往返时间除以每条消息在客户端的处理时间即可获得估计的预取值。 在消费者多且处理时间短的情况下,建议使用较低的预取值。过低的预取值会使消费者闲置,因为消费者在处理完消息后需要等待下一批的消息到达。过高的值可能会使单个消费者忙碌,其他消费者处于空闲状态。 在消费者多且处理时间很长的情况下,建议您将预取值设置为1,以便消息在所有消费者间均匀分布。
  • 设置预取值 以下示例演示在Java客户端为单个消费者设置预取值为10。 ConnectionFactory factory = new ConnectionFactory(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); //设置预取值为10。 channel.basicQos(10, false); QueueingConsumer consumer = new QueueingConsumer(channel); channel.basicConsume("my_queue", false, consumer); 在Java客户端中,global的默认值为false,因此以上示例可以简单地写为channel.basicQos(10)。 global取值的含义如下: false:分别作用于通道上的每个新消费者。 true:在通道上的所有消费者之间所共享。
  • 设置Exchange持久化 在RabbitMQ WebUI页面设置Exchange持久化。 创建Exchange时,设置“durable”为“true”,如图1所示。 图1 设置Exchange持久化(WebUI) 设置成功后如图2所示。 图2 持久化的Exchange(WebUI) 在RabbitMQ实例控制台设置Exchange持久化。 创建Exchange时,设置Exchange持久化,如图3所示。 图3 设置Exchange持久化(控制台) 设置成功后如图4所示。 图4 持久化的Exchange(控制台)
  • 设置Queue持久化 在RabbitMQ WebUI页面设置Queue持久化。 创建Queue时,设置“durable”为“true”,如图5所示。 图5 设置Queue持久化(WebUI) 设置成功后如图6所示。 图6 持久化的Queue(WebUI) 在RabbitMQ实例控制台设置Queue持久化。 创建Queue时,设置Queue持久化,如图7所示。 图7 设置Queue持久化(控制台) 设置成功后如图8所示。 图8 持久化的Queue(控制台)