云服务器内容精选

  • 开源SDK列表 分布式消息服务RabbitMQ版支持所有开源版本的SDK,常见的开源SDK如表1所示。 表1 开源SDK列表 编程语言 SDK Java rabbitmq-java-client Spring Framework SpringAMQP .Net rabbitmq-dotnet-client Python pika PHP php-amqplib C rabbitmq-c Go amqp091-go 推荐使用最新Release版本的SDK。
  • 客户端网络环境说明 客户端可以通过以下方式访问RabbitMQ实例: VPC内子网地址访问 如果客户端是云上E CS ,与RabbitMQ实例处于同region同VPC,则可以直接访问RabbitMQ实例提供的VPC内子网地址。 VPC对等连接方式访问 如果客户端是云上ECS,与RabbitMQ实例处于相同region但不同VPC,则可以通过建立VPC对等连接后,访问RabbitMQ实例提供的VPC内子网地址。 关于创建和使用VPC对等连接,可参考VPC对等连接说明。 公网访问 客户端在其他网络环境,或者与RabbitMQ实例处于不同region,则访问实例的公网地址。 不同网络环境,对于客户端配置来说,只是连接地址的差异,其他都一样。因此,本手册以同一VPC内子网地址的方式,介绍客户端开发环境搭建。 遇到连接超时或失败时,请注意确认网络是否连通。可使用telnet方式,检测实例连接地址与端口。
  • 生产消息 以下加粗内容需要替换为实例自有信息,请根据实际情况替换。 SSL认证方式 import pika import ssl # 连接信息 conf = { 'host': 'ip', 'port': 5671, 'queue_name': 'queue-test', 'username': 'root', 'password': 'password' } context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) credentials = pika.PlainCredentials(conf['username'], conf['password']) parameters = pika.ConnectionParameters(conf['host'], conf['port'], '/', credentials, ssl_options=pika.SSLOptions(context)) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(conf['queue_name']) data = bytes('Hello World!', encoding='utf-8') channel.basic_publish(exchange='', routing_key=conf['queue_name'], body=data) print(" [x] Sent 'Hello World!'") connection.close() 非SSL认证方式 import pika # 连接信息 conf = { 'host': 'ip', 'port': 5672, 'queue_name': 'queue-test', 'username': 'root', 'password': 'password' } credentials = pika.PlainCredentials(conf['username'], conf['password']) parameters = pika.ConnectionParameters(conf['host'], conf['port'], '/', credentials) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(conf['queue_name']) data = bytes("Hello World!", encoding="utf-8") channel.basic_publish(exchange='', routing_key=conf['queue_name'], body=data) print(" [x] Sent 'Hello World!'") connection.close()
  • 消费消息 以下加粗内容需要替换为实例自有信息,请根据实际情况替换。 SSL认证方式 import pika import ssl # 连接信息 conf = { 'host': 'ip', 'port': 5671, 'queue_name': 'queue-test', 'username': 'root', 'password': 'password' } context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) credentials = pika.PlainCredentials(conf['username'], conf['password']) parameters = pika.ConnectionParameters(conf['host'], conf['port'], '/', credentials, ssl_options=pika.SSLOptions(context)) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(conf['queue_name']) def callback(ch, method, properties, body): print(" [x] Received %r" % body.decode('utf-8')) channel.basic_consume(queue=conf['queue_name'], on_message_callback=callback, auto_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming() 非SSL认证方式 import pika # 连接信息 conf = { 'host': 'ip', 'port': 5672, 'queue_name': 'queue-test', 'username': 'root', 'password': 'password' } credentials = pika.PlainCredentials(conf['username'], conf['password']) parameters = pika.ConnectionParameters(conf['host'], conf['port'], '/', credentials) connection = pika.BlockingConnection(parameters) channel = connection.channel() channel.queue_declare(conf['queue_name']) def callback(ch, method, properties, body): print(" [x] Received %r" % body.decode('utf-8')) channel.basic_consume(queue=conf['queue_name'], on_message_callback=callback, auto_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming()
  • 消费消息 import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component; import java.text.SimpleDateFormat; import java.util.Date; @Component public class ReceiveMsgService { Logger LOG = LoggerFactory.getLogger(ReceiveMsgService.class); @RabbitListener(queues = "test") public void receive(String message) { SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); LOG.info("receive message: {}", message + " 接收时间:" + simpleDateFormat.format(new Date())); } }
  • (可选)在application.properties文件中填写配置 如果RabbitMQ实例已开启SSL,在“application.properties”文件中填写如下配置。 #开启SSL认证 spring.rabbitmq.ssl.enabled=true #SSL使用的算法 spring.rabbitmq.ssl.algorithm=TLSv1.2 #是否启用主机验证 spring.rabbitmq.ssl.verify-hostname=false #是否启用服务端证书验证 spring.rabbitmq.ssl.validate-server-certificate=false
  • SDK列表 在开始使用之前,请确保您安装的是最新版本的SDK。使用过时的版本可能会导致兼容性问题或无法使用最新功能。您可以在 SDK中心 查询版本信息。 表1提供了分布式消息服务RabbitMQ版支持的SDK列表,您可以在GitHub仓库查看SDK更新历史、获取安装包以及查看指导文档。 表1 SDK列表 编程语言 Github地址 参考文档 Java huaweicloud-sdk-java-v3 Java SDK使用指导 Python huaweicloud-sdk-python-v3 Python SDK使用指导 Go huaweicloud-sdk-go-v3 Go SDK使用指导 NodeJs huaweicloud-sdk-nodejs-v3 NodeJs SDK使用指导 .NET huaweicloud-sdk-net-v3 .Net SDK使用指导 PHP huaweicloud-sdk-php-v3 PHP SDK使用指导 表1提供的SDK为管理面API的SDK,并非生产消费消息的SDK。如果需要生产消费消息的SDK,请参考开发指南。
  • 新老规格对应关系 2种RabbitMQ实例规格对比,新老规格的对应关系如所示。 表3 RabbitMQ实例新老规格对应关系 老规格 对应的新规格 规格类型 TPS参考值 规格类型 TPS参考值 4核 | 8GB * 3 3000 rabbitmq.4u8g.cluster * 3 6000 8核 | 16GB * 3 6000 rabbitmq.8u16g.cluster * 3 12000 16核 | 32GB * 3 24000 rabbitmq.16u32g.cluster * 3 48000 新老规格区别如下: 新规格性能更好,同等价格下性价比更优。 老规格使用的非独享资源,在高负载情况下容易出现资源抢占情况。新规格使用的独占资源,性能更优、稳定性更好。 新规格支持灵活的水平/垂直动态扩容,能更好的应对复杂的业务变化情况。 新规格支持更大规格的,最大可以支持rabbitmq.32u64g.cluster。 新规格除了原有的磁盘类型,还支持通用型SSD、极速型SSD等多种磁盘类型,客户选择更加灵活。
  • RabbitMQ实例的存储空间估算参考 在集群模式中,RabbitMQ需要对消息持久化写入到磁盘中,因此,您在创建RabbitMQ实例选择存储空间时,建议根据业务消息体积预估以及镜像队列副本数量选择合适的存储空间。镜像队列副本数最大为集群的代理数。 例如:业务消息体积预估100GB,则磁盘容量最少应为100GB*镜像队列副本数+预留磁盘大小100GB。 如果是单机实例,则是计算业务消息体积+预留磁盘大小即可。 当前RabbitMQ实例支持修改集群实例的代理个数,您可以根据业务情况,随时更改集群代理个数。单机实例暂不支持变更规格。
  • RabbitMQ实例规格 RabbitMQ实例兼容开源RabbitMQ 3.8.35和自研RabbitMQ AMQP-0-9-1,实例类型包括单机和集群,实例规格请参考表1和表2。 表1 RabbitMQ集群实例规格(3.8.35版本) 型号 代理数 存储空间范围(GB) TPS参考值 单个代理最大消费者数 单个代理建议队列数 单个代理最大连接数 rabbitmq.2u4g.cluster 3 300~90000 3000 4000 100 1000 5 500~150000 5000 4000 100 1000 7 700~210000 7000 4000 100 1000 rabbitmq.4u8g.cluster 3 300~90000 6000 8000 200 2000 5 500~150000 10000 8000 200 2000 7 700~210000 14000 8000 200 2000 rabbitmq.8u16g.cluster 3 300~90000 12000 16000 400 4000 5 500~150000 20000 16000 400 4000 7 700~210000 28000 16000 400 4000 rabbitmq.12u24g.cluster 3 300~90000 24000 24000 600 6000 5 500~150000 40000 24000 600 6000 7 700~210000 56000 24000 600 6000 rabbitmq.16u32g.cluster 3 300~90000 48000 32000 800 8000 5 500~150000 80000 32000 800 8000 7 700~210000 112000 32000 800 8000 rabbitmq.24u48g.cluster 3 300~90000 60000 40000 1000 10000 5 500~150000 100000 40000 1000 10000 7 700~210000 140000 40000 1000 10000 rabbitmq.32u64g.cluster 3 300~90000 72000 40000 1000 10000 5 500~150000 120000 40000 1000 10000 7 700~210000 168000 40000 1000 10000 为了保证稳定性,服务端限制了单条消息的最大长度为50MB,请勿发送大于此长度的消息。 上表中TPS(即生产+消费的TPS)是指以2K大小的消息为例的每秒处理消息条数,测试场景为不开启持久化的非镜像队列,实时生产实时消费,队列无积压。此数据仅供参考,生产使用需要以实际压测性能为准。 服务端的性能主要跟以下因素相关:队列数、消息堆积、连接数、channel、消费者数、镜像队列、优先级队列、消息持久化和exchange类型等,在选择实例规格时,请根据业务模型压测结果选择。 一条连接最多可以开启2047个channel。 单机版实例可用于测试场景,不建议用于生产业务,暂不提供单机版实例的产品规格。 表2 RabbitMQ集群实例规格(AMQP-0-9-1专业版) 型号 存储空间范围(GB) TPS参考值 实例最大队列数 实例最大连接数 amqp.p2.large.6 200~60000 3000 1000 500 amqp.p2.large.10 200~60000 5000 1000 500 amqp.p2.large.14 200~60000 7000 2000 1000 amqp.p2.large.20 200~60000 10000 2000 1000 amqp.p2.large.28 200~60000 14000 2000 1000 amqp.p2.large.40 200~60000 20000 3000 1500 amqp.p2.large.56 400~120000 28000 4000 2000 amqp.p2.large.80 400~120000 40000 6000 3000 amqp.p2.large.112 400~120000 56000 8000 4000 amqp.p2.large.144 600~180000 72000 10000 5000 amqp.p2.large.200 600~180000 100000 12000 6000 amqp.p2.large.240 800~240000 120000 16000 8000 amqp.p2.large.280 1200~360000 140000 16000 8000 为了保证稳定性,服务端限制了单条消息的最大长度为4MB,请勿发送大于此长度的消息。 上表中TPS,是指以4K大小的消息为例的每秒处理消息条数,测试场景为实时生产实时消费,队列无积压。此数据仅供参考,生产使用需要以实际压测性能为准。 服务端的性能主要跟以下因素相关:队列数、消息堆积、连接数、channel、消费者数和Exchange类型等,在选择实例规格时,请根据业务模型压测结果选择。 一条连接最多可以开启2000个channel。 单机版实例可用于测试场景,不建议用于生产业务,暂不提供单机版实例的产品规格。
  • 身份认证 无论用户通过控制台还是API访问DMS for RabbitMQ,都会要求访问请求方出示身份凭证,并进行身份合法性校验,同时提供登录保护和登录验证策略加固身份认证安全。DMS for RabbitMQ基于 统一身份认证 服务(Identity and Access Management,简称 IAM ),支持三种身份认证方式:用户名密码、访问密钥、临时访问密钥。同时还提供登录保护及登录验证策略。
  • 测试结果 测试场景一(实例规格):相同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 通过上表的测试结果,得出以下结论,仅供参考:实例规格越大,实例性能越高。
  • 测试步骤 登录客户端服务器,进入“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类型为“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系统的ECS服务器,具体步骤请参考购买弹性云服务器。 购买完成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