Queue(队列)是RabbitMQ的内部对象,用于存储消息队列,并将它们转发给消费者;
RabbitMQ中的Queue(队列)是消息的缓冲区,用于存储待处理的消息。它是RabbitMQ中最基本的消息传递模型。Queue具有以下特点:
- 队列是消息的容器:队列用于存储待处理的消息,消息按照先进先出(FIFO)的顺序进行处理。
- 队列是有界的:队列具有最大容量限制,当队列已满时,新的消息将无法进入队列,直到队列中的消息被消费或被手动删除。
- 队列是持久化的:队列中的消息可以被持久化到磁盘上,以防止消息丢失。当RabbitMQ服务器重启时,持久化的消息将被恢复。
- 队列是可配置的:队列可以通过设置不同的属性进行配置,例如队列的名称、是否持久化、是否自动删除等。
主要可配置的属性如下:
Type:队列类型Name:队列名称,就是一个字符串,随便一个字符串就可以;
Durability:声明队列是否持久化,代表队列在服务器重启后是否还存在;
Auto delete: 是否自动删除,如果为true,当没有消费者连接到这个队列的时候,队列会自动删除;
Exclusive:exclusive属性的队列只对首次声明它的连接可见,并且在连接断开时自动删除;基本上不设置它,设置成false
Arguments:队列的其他属性,例如指定DLX(死信交换机等);
1、x-expires:Number
当Queue(队列)在指定的时间未被访问,则队列将被自动删除;
2、x-message-ttl:Number
发布的消息在队列中存在多长时间后被取消(单位毫秒);
3、x-overflow:String
设置队列溢出行为,当达到队列的最大长度时,消息会发生什么,有效值为Drop Head或Reject Publish;
4、x-max-length:Number
队列所能容下消息的最大长度,当超出长度后,新消息将会覆盖最前面的消息,类似于Redis的LRU算法;
5、 x-single-active-consumer:默认为false
激活单一的消费者,也就是该队列只能有一个消息者消费消息;
6、x-max-length-bytes:Number
限定队列的最大占用空间,当超出后也使用类似于Redis的LRU算法;
7、x-dead-letter-exchange:String
指定队列关联的死信交换机,有时候我们希望当队列的消息达到上限后溢出的消息不会被删除掉,而是走到另一个队列中保存起来;
8.x-dead-letter-routing-key:String
指定死信交换机的路由键,一般和6一起定义;
9.x-max-priority:Number
如果将一个队列加上优先级参数,那么该队列为优先级队列;
(1)、给队列加上优先级参数使其成为优先级队列 x-max-priority=10【0-255取值范围】 (2)、给消息加上优先级属性 通过优先级特性,将一个队列实现插队消费;
MessageProperties messageProperties=new MessageProperties(); messageProperties.setPriority(8);
10、x-queue-mode:String(理解下即可)
队列类型x-queue-mode=lazy懒队列,在磁盘上尽可能多地保留消息以减少RAM使用,如果未设置,则队列将保留内存缓存以尽可能快地传递消息;
11、x-queue-master-locator:String(用的较少,不讲)
在集群模式下设置队列分配到的主节点位置信息;
每个queue都有一个master节点,所有对于queue的操作都是事先在master上完成,之后再slave上进行相同的操作;
每个不同的queue可以坐落在不同的集群节点上,这些queue如果配置了镜像队列,那么会有1个master和多个slave。
基本上所有的操作都落在master上,那么如果这些queues的master都落在个别的服务节点上,而其他的节点又很空闲,这样就无法做到负载均衡,那么势必会影响性能;
关于master queue host 的分配有几种策略,可以在queue声明的时候使用x-queue-master-locator参数,或者在policy上设置queue-master-locator,或者直接在rabbitmq的配置文件中定义queue_master_locator,有三种可供选择的策略:
- (1)min-masters:选择master queue数最少的那个服务节点host;
- (2)client-local:选择与client相连接的那个服务节点host;
- (3)random:随机分配;