在测试区,经常因为测试导致测试区很多队列里面堆积很多消息。这一方面对测试区MQ的性能造成问题,dashboard这个插件经常卡主。此外消息过多也不方便debug。
一、需求
- 测试环境服务器资源吃紧,MQ 非常容易爆掉。监控界面都进不去的时候,该如何处理?
- 消息堆积太多,如何快速清理?
二、dashboard purge message
mq的dashbnoard插件提供了puege单个队列的所有消息。如下图
三、批量清除所有的队列以及消息
[root@P1QMSARC01 ~]# rabbitmqctl stop_app Stopping rabbit application on node rabbit@P1QMSARC01 ... #检查是否关闭 [root@P1QMSARC01 ~]# lsof -i:5672 [root@P1QMSARC01 ~]# #清除所有队列以及消息 [root@P1QMSARC01 ~]# rabbitmqctl reset Resetting node rabbit@P1QMSARC01 ...
清空后的overview 的Queues为0.
#启动 [root@P1QMSARC01 ~]# rabbitmqctl start_app Starting node rabbit@P1QMSARC01 ... completed with 3 plugins.
四、MQ的 meta data导入与导出
使用rabbitmqctl reset 之前切记一定要将队列的定义信息导出。待清空完成后再导入。
导出的队列是一个json格式的文件。
"rabbit_version": "3.7.10", "users": [{ "name": "guest", "password_hash": "AgvI76xv7Z7x8GgygqtqM75S3TkqfcuwmndHpeFRuPaNZkTN", "hashing_algorithm": "rabbit_password_hashing_sha256", "tags": "administrator" }], "vhosts": [{ "name": "/" }], "permissions": [{ "user": "guest", "vhost": "/", "configure": ".*", "write": ".*", "read": ".*" }], "topic_permissions": [], "parameters": [], "global_parameters": [{ "name": "cluster_name", "value": "rabbit@P1QMSARC01" }], "policies": [{ "vhost": "/", "name": "ha-all", "pattern": "^", "apply-to": "all", "definition": { "ha-mode": "all" }, "priority": 0 }], "queues": [{ "name": "466XPNRP0300", "vhost": "/", "durable": true, "auto_delete": false, "arguments": {} },
将这个json文件从dashboard导入,之前所有的队列都恢复了,但消息再也回不来了。所以正式区还是慎用,除非消息被备份了。
五、如何清空部分MQ 的message?
测试代码如下:
@Test public void testpurgeRabbitMQ() throws IOException { // 快捷情况MQ 的消息 String queueName = "A_GLASS,A_PANEL,A_DEFECT,F_GLASS,F_PANEL,F_DEFECT,C_GLASS,C_PANEL,C_DEFECT"; List<String> queueStrList = Arrays.asList(queueName.split(",")); // final List<JSONObject> jsonObjectList = buildJsonString(); try { for(int i= 0; i< queueStrList.size(); i++){ channel.queuePurge(queueStrList.get(i)); log.info("QueueName:{},had purged",queueStrList.get(i)); } } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); }
2021年6月22日01:01:12
rabbitmqadmin purge queue name=purge-test name=purge-test1
六、如何使用命令行purge 大量堆积的MQ
rabbitmqadmin purge queue name=purge-test
可以跟多个name吗?一次性purge多个
rabbitmqadmin purge queue name=purge-test name=purge-test1
一次puege多个好像不可以。
api purge
这个还没测通,api url中的vhost_name是一个/ 该如何处理?
curl -i -u guest:guest -XDELETE http://10.50.10.179:15672/api/queues//purge-test/contents