云服务器内容精选

  • 仲裁队列与镜像队列的差异 仲裁队列是RabbitMQ 3.8版本引入的队列类型,它与镜像队列拥有类似的功能,为RabbitMQ提供高可用的队列。镜像队列有一些设计上的缺陷,这也是RabbitMQ提供仲裁队列的原因。 镜像队列主要的缺陷在于消息同步的性能低。 镜像队列包含一个主队列和多个从队列,当生产者向主队列发送一条消息,主队列会将消息同步给从队列,所有的从队列都保存消息后,主队列才会向生产者发送确认。 RabbitMQ使用集群部署时,如果其中一个节点故障下线,待它消除故障重新上线后,它保存的所有从队列的数据都会丢失。此时运维人员需要选择是否同步主队列的数据到从队列中,如果不同步数据,会增加消息丢失的风险。如果同步数据,同步时队列是阻塞的,无法对其进行操作。当队列中存在大量堆积消息时,同步会导致队列几分钟、几小时或者更长时间不可用。
  • 配置仲裁队列的长度 通过配置Policy或者队列属性的方式可以限制仲裁队列的长度和在内存中保存的长度。 x-max-length:仲裁队列最大消息数。如果超过则丢弃消息,或者发送到死信交换器。 x-max-length-bytes:仲裁队列最大总消息大小(字节数)。如果超过则丢弃消息,或者发送到死信交换器。 x-max-in-memory-length:限制仲裁队列的内存中最大消息数量。 x-max-in-memory-bytes:限制仲裁队列的内存中的最大总消息大小(字节数)。
  • 方法五:调用API批量删除队列 在RabbitMQ实例未开启SSL时,通过编写Shell脚本循环调用API执行删除命令,实现批量删除队列。 在Linux系统中连接RabbitMQ实例,具体步骤请参考使用客户端连接RabbitMQ(关闭SSL)。 创建“delete_queues.sh”脚本文件。 touch delete_queues.sh 执行以下命令,编辑脚本。 vim delete_queues.sh 将以下内容复制到脚本中,其中USERNAME、PASSWORD、HOST和QUEUES_LIST的值,请根据实际情况修改。 #!/usr/bin/env bash USERNAME=root PASSWORD=Zsxxxdx HOST=192.168.0.241 PORT=15672 VHOST='%2F' QUEUES_LIST="test1 test2 test3"; for QUEUE_NAME in $QUEUES_LIST : do curl -i -XDELETE http://$USERNAME:$PASSWORD@$HOST:$PORT/api/queues/$VHOST/$QUEUE_NAME done 参数说明如下: USERNAME:创建实例时设置的用户名。 PASSWORD:创建实例时设置的密码,如果忘记密码,参考重置RabbitMQ实例密码,重新设置密码。 HOST:在实例详情页,查看Web界面UI地址。 PORT:在实例详情页,查看Web界面UI端口号。 VHOST:Vhost名称,默认为“/”,在命令中设置为“%2F”。 QUEUES_LIST:待删除队列的名称,队列名称之间使用空格隔开。 保存脚本内容。 对脚本进行授权。 chmod 777 delete_queues.sh 执行脚本。 sh delete_queues.sh 删除成功后,回显如下: 图6 批量删除队列成功 您还可以在WebUI页面的“Queues”页签,查看队列是否成功删除。
  • 方法四:调用API删除单个队列 在RabbitMQ实例未开启SSL时,通过调用API删除单个队列。 在Linux系统中连接RabbitMQ实例,具体步骤请参考使用客户端连接RabbitMQ(关闭SSL)。 执行以下命令删除单个队列。 curl -i -XDELETE http://${USERNAME}:${PASSWORD}@${HOST}:${PORT}/api/queues/${VHOST_NAME}/${QUEUE_NAME} 参数说明如下: USERNAME:创建实例时设置的用户名。 PASSWORD:创建实例时设置的密码,如果忘记密码,参考重置RabbitMQ实例密码,重新设置密码。 HOST:在实例详情页,查看Web界面UI地址。 PORT:在实例详情页,查看Web界面UI端口号。 VHOST_NAME:Vhost名称,默认为“/”,在命令中设置为“%2F”。 QUEUE_NAME:待删除队列的名称。 示例如下: curl-i -XDELETE http://test:Zsxxxdx@192.168.0.241:15672/api/queues/%2F/hello 删除成功后,回显如下: 图5 删除队列成功 您还可以在WebUI页面的“Queues”页签,查看队列是否成功删除。
  • 使用场景 默认情况下,RabbitMQ生产者生产的消息存储在内存中,当需要释放内存时,会将内存中的消息换页至磁盘中。换页操作会消耗较长的时间,且换页过程中队列无法处理消息。 如果生产速度过快(例如执行批处理任务),或者消费者由于各种原因(例如消费者下线、宕机)长时间内无法消费消息,导致消息大量堆积,使得内存使用率过高,换页频繁,可能会影响其他队列的消息收发。这种场景下,建议您启用惰性队列。 惰性队列(Lazy Queue)会尽可能的将消息存入磁盘中,在消费者消费到相应的消息时才会被加载到内存中,这样可以减少内存的消耗,但是会增加I/O的使用,影响单个队列的吞吐量。惰性队列的一个重要的设计目标是能够支持更长的队列,即支持更多的消息存储/消息堆积。 在以下情况下,推荐使用惰性队列: 队列可能会产生消息堆积 队列对性能(吞吐量)的要求不是非常高,例如TPS 1万以下的场景 希望队列有稳定的生产消费性能,不受内存影响而波动 处于以下情况时,无需使用惰性队列: RabbitMQ需要高性能的场景 队列总是很短(即队列中没有消息堆积) 设置了最大长度策略 更多关于惰性队列的说明,请参考Lazy Queues。 仅RabbitMQ 3.8.35版本支持惰性队列。