RabbitMQ(四):RabbitMQ消息大小限制,队列长度限制

1. 消息大小限制

在版本3.7中的源码,我们可以看到最大消息大小为2GiB。

274 %% Trying to send a term across a cluster larger than 2^31 bytes will 
275 %% cause the VM to exit with "Absurdly large distribution output data 
276 %% buffer". So we limit the max message size to 2^31 - 10^6 bytes (1MB 
277 %% to allow plenty of leeway for the #basic_message{} and #content{} 
278 %% wrapping the message body). 
279 -define(MAX_MSG_SIZE, 2147383648). 

参考:https://github.com/rabbitmq/rabbitmq-common/blob/v3.7.15/include/rabbit.hrl

在版本3.8开始是512MiB

232 %% Max message size is hard limited to 512 MiB. 
233 %% If user configures a greater rabbit.max_message_size, 
234 %% this value is used instead. 
235 -define(MAX_MSG_SIZE, 536870912). 

参考:https://github.com/rabbitmq/rabbitmq-common/blob/master/include/rabbit.hrl

2. 消息大小不要超过4MB

  • 客户端与RabbitMQ服务端的最大帧是128K,但消息大小却可支持数MB,这是可能是因为底层做了拆包组包的,目前我还未查看底层代码。
  • 用线程来模拟50个发布者和50个订阅者;
消息包大小由1K到10MB,当包大小达到4.5MB时,服务器的性能出现明显的异常,传输率尤其是每秒订阅消息的数量,出现波动,不稳定;同时有一部分订阅者的TCP连接出现断开的现象。可能是客户端底层或者RabbitMQ服务端在进行拆包,组包的时候,出现了明显的压力,而导致异常的发生。
  • 超过4MB的消息,最好先进行分包

3. 队列长度限制

队列的最大长度限制可以是限制消息的数量,或者是消息的总字节数(总字节数表示的是所有的消息体的字节数,忽略消息的属性和任何头部信息),又或者两者都进行了限制。

限制队列长度的方式有两种:

  • 通过客户端在队列声明时使用队列的可选参数进行配置
  • 通过服务器的policy命令设置

如果同事使用这两种方式设置了队列的最大长度,那么较小的值将被使用。

队列长度也可以通过operator policies进行设置。

在所有情况中,只有处于ready状态的消息被计数未被确认的消息不会被计数受到limit的限制。

来自rabbitmqctl list_queues命令或者管理API的两个字段值message_ready和message_bytes_ready显示了消息的限制数量值。

4. 队列的溢出行为

4.1 默认行为

当队列的消息超过设置的最大长度或大小时,RabbitMQ默认的做法是将处于队列头部的信息(队列中最老的消息)丢弃或变成死信。可以通过设置overflow的值来改变这种方式。

4.2 溢出行为配置

使用overflow参数来配置队列的溢出操作。如果overflow值设置为reject-publish,那么最近被发送的消息将被丢弃。另外,如果开启了发送者确认模式,那么会使用basic.nack方法通知发送者消息被拒绝。如果消息被同时路由到多个队列,并且被其中最少一个队列拒绝,那么通道将会使用basic.nack方法来通知消费者消息被拒绝,但是消息仍可以继续发送给可以接受它的队列。

使用policy定义队列的最大长度

使用policy命令来设置队列的最大长度,通过设置max-length或max-length-bytes的值进行配置:

rabbitmqctl set_policy my-pol "^one-meg$" '{"max-length-bytes":1048576}'   --apply-to queues

以上代码设置了my-pol的策略,该策略保证了one-meg队列最多只能有1MiB的数据。当达到这个限制时,将从队列的头部丢弃最老的消息。

定义溢出操作—无论是从队列头部丢弃消息还是拒绝新的消息,都可以通过在policy命令中添加overflow来定义。如:

rabbitmqctl set_policy my-pol "^two-messages$"  '{"max-length":2,"overflow":"reject-publish"}'   --apply-to queues

以上代码中,my-pol策略保证了two-messages队列最多只能包含两个消息,并且只要队列中消息数已经达到限制并且发送者确认开启,就会发送basic.nack响应通知发送者拒绝消息。

使用x-arguments定义队列的最大长度

  • 为队列声明参数 x-max-length 提供一个非负整数值来设置最大消息条数。
  • 声明参数 x-max-length-bytes 提供一个非负整数值,设置最大字节长度。如果设置了两个参数,那么两个参数都将适用;无论先达到哪个限制,都将强制执行。
  • 溢出行为可以通过向队列声明参数x-overflow提供字符串值来设置。可能的值是:drop-head(默认值):从队列前面丢弃或 dead-letter 消息,保存后n条消息。reject-publish:最近发布的消息将被丢弃,即保存前n条消息。

以下是使用java代码声明配置队列最大长度为10个消息:

//创建队列
HashMap<String, Object> map = new HashMap<>();
//设置队列最大的条数10条
map.put("x-max-length",10 );
//设置队列溢出方式保留前10条
map.put("x-overflow","reject-publish" );
channel.queueDeclare(queueName,false,false,false,map);

文档地址:https://www.rabbitmq.com/maxlength.html

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值