云服务器内容精选

  • 消息堆积产生的原因 一般来说消息堆积是由于生产消息的速率远大于消费消息的速率所导致的。比如某个时间段消费端处理消息异常缓慢,发送一条消息只要3秒钟,而消费一条消息需要1分钟,每分钟发送20个消息,只有一个消息被消费端处理,这样队列中就会产生大量的消息堆积。 消费者出现异常,生产者一直在发送消息,但是消费者不能消费,造成消息积压。 消费者没有出现异常,但是消费者与队列间的订阅可能出现了异常,也会导致消息无法被消费从而造成堆积的情况。 消费者正常,与队列间的订阅也正常,但是消费端的代码本身逻辑耗费时间长导致了消费能力降低,这时候就会出现1中的情况从而导致消息堆积。
  • 客户端是否可以连接同个RabbitMQ下多个Vhost? 客户端可以连接同个RabbitMQ下多个Vhost。 Vhost(Virtual Hosts)是RabbitMQ的基本特性,每个Vhost相当于一个相对独立的RabbitMQ服务器,每个Vhost数据目录不同,共用一个进程。性能上,连接多个Vhost和单独使用一个Vhost差别不大,只是RabbitMQ进程多一些对象,建议使用业务模型实测。 Vhost的相关介绍,请参考官网文档Virtual Hosts。 父主题: 连接问题
  • 实例是否支持修改可用区? 不支持,您可以重新购买实例,以满足可用区要求,然后进行实例元数据的迁移。 RabbitMQ 3.x.x版本实例元数据的迁移步骤如下: 登录重新购买前的RabbitMQ实例的WebUI页面。 在“Overview”页签中,单击“Download broker definitions”,导出元数据。 登录重新购买的RabbitMQ实例的WebUI页面,在“Overview”页签中,单击“选择文件”,选择2中导出的元数据。 单击“Upload broker definitions”,上传元数据。 上传成功后,显示如下信息。 父主题: 实例问题
  • 如何配置安全组? RabbitMQ实例支持VPC内访问和公网访问,配置安全组的方式如下: VPC内访问实例 客户端只能部署在与RabbitMQ实例处于相同虚拟私有云(VPC)的弹性云服务器(E CS )上。 除了ECS、RabbitMQ实例必须处于相同VPC之外,还需要他们的安全组分别配置了正确的规则,客户端才能访问RabbitMQ实例。 建议ECS、RabbitMQ实例配置相同的安全组。安全组创建后,默认包含组内网络访问不受限制的规则。 如果配置了不同安全组,可参考如下配置方式: 假设ECS、RabbitMQ实例分别配置了安全组:sg-53d4、Default_All。 以下规则,远端可使用安全组,也可以使用具体的IP地址。 ECS所在安全组需要增加如下规则,以保证客户端能正常访问RabbitMQ实例。 图1 配置ECS安全组 表1 安全组规则 方向 协议端口 目的地址 出方向 全部放通 Default_All RabbitMQ实例所在安全组需要增加如下规则,以保证能被客户端访问。 图2 配置RabbitMQ实例安全组 表2 安全组规则 方向 协议端口 源地址 入方向 全部放通 sg-53d4 通过公网访问实例 RabbitMQ实例所在安全组需要增加如下规则,以保证能被客户端访问。 表3 安全组规则 方向 协议端口 源地址 入方向 TCP:5672 RabbitMQ客户端所在的IP地址或地址组 具体如图3所示。 图3 安全组规则1 父主题: 连接问题
  • 可能原因一:连接地址不正确 VPC内访问场景下,连接地址不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.125.110 5672 user *******Exception in thread "main" java.net.NoRouteToHostException: No route to host (Host unreachable)at java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 公网访问场景下,连接地址不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 139.xxx.178 5672 user *******Exception in thread "main" java.net.SocketTimeoutException: connect timed outat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 解决方法:在RabbitMQ控制台的“基本信息”页面,获取“内网连接地址”/“公网连接地址”,修改连接实例代码中的连接地址。
  • 可能原因二:端口不正确 VPC内访问场景下,端口不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.125.111 5673 user *******Exception in thread "main" java.net.ConnectException: Connection refused (Connection refused)at java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 公网访问场景下,端口不正确时,报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 139.xxx.179 5673 user *******Exception in thread "main" java.net.SocketTimeoutException: connect timed outat java.net.PlainSocketImpl.socketConnect(Native Method)at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 解决方法:修改端口号。
  • 可能原因五:未创建Vhost或者填错Vhost名称 报错如下: Couldn't log in: server connection error 530, message: NOT_ALLOWED - vhost /localdev/ not found 解决方法: 如果未创建Vhost,进入RabbitMQ控制台的“Vhost列表”页面,创建Vhost。 如果是Vhost名称填错了,请参考RabbitMQ控制台的“Vhost列表”页面显示的Vhost名称,修改连接URL和配置文件。
  • SSL方式连接RabbitMQ实例失败? 首先排查安全组的入方向规则,是否放开了端口5671(SSL方式访问)或5672(非SSL访问)。 其次,参考如下内容配置SSL单向认证: 12345678 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setUsername(user); factory.setPassword(password); factory.useSslProtocol(); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); 父主题: 连接问题
  • 可能原因三:用户名或密码错误 报错如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.125.111 5672 user *******Exception in thread "main" com.rabbitmq.client.AuthenticationFailureException: AC CES S_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.at com.rabbitmq.client.impl.AMQConnection.start(AMQConnection.java:351)at com.rabbitmq.client.impl.recovery.RecoveryAwareAMQConnectionFactory.newConnection(RecoveryAwareAMQConnectionFactory.java:64) 解决方法:修改用户名或密码。如果忘记密码,参考重置实例密码,重置密码。
  • 约束与限制 2023年7月30日前创建的实例,不支持运行日志功能。 运行日志默认保留时间为七天,如果需要延长保留天数,可以在LTS控制台修改日志组的存储时间。 运行日志开启后会在LTS控制台创建对应的日志组、日志流和仪表盘。使用期间按照日志量收费,收费标准请参考LTS价格详情。 频繁产生运行日志,可能会影响RabbitMQ实例性能。 RabbitMQ AMQP-0-9-1版本实例不支持查看运行日志。
  • 命令行模式连接实例 登录客户端所在服务器。 下载RabbitMQ-Tutorial.zip示例工程代码。 wget https://dms-demo.obs.cn-north-1.myhuaweicloud.com/RabbitMQ-Tutorial.zip 解压RabbitMQ-Tutorial.zip压缩包。 unzip RabbitMQ-Tutorial.zip 进入RabbitMQ-Tutorial目录,该目录下包含预编译好的jar文件。 cd RabbitMQ-Tutorial 运行生产消息示例。 java -cp .:rabbitmq-tutorial.jar Send {host} {port} {user} {password} 参数说明如下: {host}:从前提条件中获取的连接地址。 {port}:RabbitMQ实例的连接端口,输入5672。 {user}:从前提条件中获取的用户名。 {password}:从前提条件中获取的密码。 生产消息示例如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.xx.40 5672 test Zxxxxxxs [x] Sent 'Hello World!'[root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Send 192.168.xx.40 5672 test Zxxxxxxs [x] Sent 'Hello World!' 运行消费消息示例。 java -cp .:rabbitmq-tutorial.jar Recv {host} {port} {user} {password} 参数说明如下: {host}:从前提条件中获取的连接地址。 {port}:RabbitMQ实例的连接端口,输入5672。 {user}:从前提条件中获取的用户名。 {password}:从前提条件中获取的密码。 消费消息示例如下: [root@ecs-test RabbitMQ-Tutorial]# java -cp .:rabbitmq-tutorial.jar Recv 192.168.xx.40 5672 test Zxxxxxxs [*] Waiting for messages. To exit press CTRL+C [x] Received 'Hello World!' [x] Received 'Hello World!' 如需停止消费使用Ctrl+C命令退出。
  • 变更实例规格的影响 表3 变更实例规格的影响 变更配置类型 影响 代理数量 变更规格过程中会有秒级业务中断,客户端需要支持自动重连,建议在业务低峰时进行变更。 预计总变更时长为10分钟左右。 存储空间 扩容存储空间不会影响业务。 可用存储空间=实际存储空间-用于存储日志的存储空间-格式化磁盘的损耗。例如,实际扩容存储空间到700GB,用于存储日志的数据的存储空间为100GB,格式化磁盘损耗7GB,那么扩容后的可用存储空间为593GB。 预计总变更时长为5分钟内。 代理规格/实例规格 RabbitMQ 3.x.x版本单机实例和没有配置镜像/仲裁队列的集群实例在变更规格过程中会有分钟级业务中断,客户端需要支持自动重连,建议在业务低峰时进行变更。 RabbitMQ 3.x.x版本配置了镜像/仲裁队列的集群实例在变更规格过程中会有秒级业务中断,客户端需要支持自动重连,建议在业务低峰时进行变更。 RabbitMQ AMQP-0-9-1版本单机实例和集群实例在变更规格过程中会有秒级连接闪断,客户端需要支持自动重连,建议在业务低峰时进行变更。 代理采用滚动重启的方式进行实例变更,变更时长和代理数量有关,单个代理的变更时长一般在5~10分钟,总变更时长为(5~10分钟)*代理数量。
  • 示例代码(Java) 连接实例并生产消息示例代码: VHOST_NAME:消息要发送的Queue所在的Vhost名称。 QUEUE_NAME:消息要发送的Queue名称。 Hello World!:要发送的消息,根据实际需要修改。 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setVirtualHost("VHOST_NAME"); factory.setUsername(user); factory.setPassword(password); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!"; channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8")); System.out.println(" [x] Sent '" + message + "'"); channel.close(); connection.close(); 连接实例并消费消息示例代码: VHOST_NAME:要消费消息的Queue所在的Vhost名称。 QUEUE_NAME:要消费消息的Queue名称。 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(host); factory.setPort(port); factory.setVirtualHost("VHOST_NAME"); factory.setUsername(user); factory.setPassword(password); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; channel.basicConsume(QUEUE_NAME, true, consumer);
  • 前提条件 已购买RabbitMQ实例,并记录创建时输入的用户名和密码,实例未开启SSL。 在实例详情中查看并记录“内网连接地址/公网连接地址”。 客户端所在服务器和RabbitMQ实例之间网络已互通,具体网络要求参见连接RabbitMQ网络要求。 客户端所在服务器已安装Java Development Kit 1.8.111或以上版本,并配置JAVA_HOME与PATH环境变量,环境变量配置方法如下: 使用执行用户在用户家目录下修改“.bash_profile”,添加如下行。其中“/opt/java/jdk1.8.0_151”为JDK的安装路径,请根据实际情况修改。 export JAVA_HOME=/opt/java/jdk1.8.0_151 export PATH=$JAVA_HOME/bin:$PATH 执行source .bash_profile命令使修改生效。 RabbitMQ实例中已创建Vhost、Exchange和Queue,且配置Exchange和Queue的绑定。
  • 约束与限制 RabbitMQ AMQP-0-9-1版本不支持插件功能。 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的集群实例 不支持 不支持