消息队列RabbitMQ版会对单实例的TPS流量峰值进行限流,本文介绍消息队列RabbitMQ版实例的限流规则、限流后的行为以及限流最佳实践等。
限流后行为
当消息队列RabbitMQ版实例的TPS流量峰值超过您所购买实例的TPS规格上限时,消息队列RabbitMQ版实例会被限流。
限流后的行为如下:
- 消息队列RabbitMQ版服务端会返回错误码信息。
- 消息队列RabbitMQ版服务端关闭当前请求的Channel。代码中可以捕获异常重新开启Channel。
错误码信息:
- 错误码:reply-code=530
- 错误信息:reply-text=denied for too many requests
Java客户端错误堆栈示例:
Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>
(reply-code=530, reply-text=denied for too many requests, ReqId:5FB4C999314635F952FCBFF6, ErrorHelp[dstQueue=XXX_test_queue,
srcExchange=Producer.ExchangeName,bindingKey=XXX_test_bk, http://mrw.so/6rNqO8], class-id=50, method-id=20)
at com.rabbitmq.client.impl.ChannelN.asyncShutdown(ChannelN.java:516)
at com.rabbitmq.client.impl.ChannelN.processAsync(ChannelN.java:346)
at com.rabbitmq.client.impl.AMQChannel.handleCompleteInboundCommand(AMQChannel.java:182)
at com.rabbitmq.client.impl.AMQChannel.handleFrame(AMQChannel.java:114)
at com.rabbitmq.client.impl.AMQConnection.readFrame(AMQConnection.java:672)
at com.rabbitmq.client.impl.AMQConnection.access$300(AMQConnection.java:48)
at com.rabbitmq.client.impl.AMQConnection$MainLoop.run(AMQConnection.java:599)
at java.lang.Thread.run(Thread.java:748)
实例秒级TPS峰值查询
通过查询实例实际使用的秒级TPS峰值,您可以了解业务的流量波动情况和流量峰值,判断实例规格是否满足业务需求。
消息队列RabbitMQ版提供以下三种方式查询实例的秒级TPS峰值:
查询方式 | 说明 | 查询时间级别 | 查询资源级别 |
---|---|---|---|
(推荐)通过云监控查询实例TPS峰值并设置告警 | 优势:
| 分钟级TPS峰值 取值为1分钟周期内,每秒钟实例TPS的最大值。 | 实例级别TPS峰值 |
(推荐)通过实例详情查询实例TPS峰值 |
| 秒级TPS峰值 |
|
通过日志查询实例TPS峰值 |
| 秒级TPS峰值 | 实例级别TPS峰值 |
实例TPS计算规则
以下接口调用时,会被计算进TPS流量中,即调用一次接口,计算为一次TPS。
- ConnectionOpen、ChannelOpen
- QueueDeclare、QueueDelete、QueueBind、QueueUnbind
- ExchangeDeclare、ExchangeDelete
- ExchangeBind、ExchangeUnBind
- SendMessage、BasicConsume、BasicGet、BasicAck、BasicReject、BasicNack、BasicRecover
说明
延时消息是消息队列RabbitMQ版的高级特性消息,收发延时消息时,调用API接口的次数需要在普通消息的基础上乘以5倍,
示例:发布延时消息10次/秒,计算TPS时,按照10×5=50次/秒计算。