RabbitMQ——面试问题和解决方案

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6


问题1:

如果在使用MQ的时候,对于发送消息的长度有限制吗?如果是发送长消息会存在什么问题?怎么样解决长消息或者是大消息问题?

问题答案:

消息的大小受服务器内存的限制,如果它是持久的,那么空闲硬盘空间也是如此,在 3.8.0 版本之前,它曾经是 2 GiB:自版本 3.8.0 以来一直是 512 MiB:如果太大的话,连接后将一直负载很重这样容易消耗内存资源。在RabbitMQ中通过tracing 中的Max payload bytes:表示每条消息的最大限制,单位为B。比如设置了了此值为10,那么当有超过10B的消息经过RabbitMQ流转时,在记录到trace文件的时候会被截断。如上text日志格式中“trace test payload.”会被截断成“trace tes          t”。如果消息太大,可能存在消息的截断问题,如果消息超过rabbitmq内存,可能导致mq宕机问题,可以采用定时清理持久化文件方式来实现。

问题2:

消息被截断时候,消费者怎么样消费这个消息?

问题解答:

问题4:

队列和交换的最大数量是多少?

问题解答:

优先级队列支持的最大优先级数默认是255。

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

队列长度也可以通过operator policies进行设置。在所有情况中,只有处于ready状态的消息被计数,未被确认的消息不会被计数受到limit的限制。来自rabbitmqctl list_queues命令或者管理API的两个字段值message_ready和message_bytes_ready显示了消息的限制数量值。

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

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

队列的溢出行为:

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

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

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

  • 为队列声明参数 x-max-length 提供一个非负整数值来设置最大消息条数。
  • 声明参数 x-max-length-bytes 提供一个非负整数值,设置最大字节长度。如果设置了两个参数,那么两个参数都将适用;无论先达到哪个限制,都将强制执行。
  • 溢出行为可以通过向队列声明参数x-overflow提供字符串值来设置。可能的值是:drop-head(默认值):从队列前面丢弃或 dead-letter 消息,保存后n条消息。reject-publish:最近发布的消息将被丢弃,即保存前n条消息。
     
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: RabbitMQ