环境
发送消息
发送消息一般是需要指定发送到哪个交换器的,但是如果设置为空字符串,则消息会被发送到RabbitMQ默认的交换器中。
消费者
消费消息时,需要提供标签来做消费者的区分
高阶知识
mandatory | |
---|---|
取值 | 描述 |
true: | 消息至少投递到一个队列中,否则就返回给生产者。 |
false: | 消息至少投递到一个队列中,否则就丢弃掉。 |
优先级队列
优先级队列需要设置两个地方:
- 队列:将某个队列通过
x-max-priority
参数来实现优先级的设置。 - 消息:在发送消息时,对消息的属性设置优先级:
AMQP.BasicProperties中priority属性。
集群节点
节点类型分为两种:
① 磁盘节点
② 内存节点
节点元数据
- 队列元数据:队列的名称及属性
- 交换器:交换器的名称及属性
- 绑定关系元数据:交换器与队列或者交换器直接的绑定关系
- vhost元数据:为vhost内的队列,交换器和绑定提供命名空间及安全属性。
持久层
该层由两部分组成:
① 队列索引 rabbit_queue_index
② 消息存储 rabbit_msg_store
rabbit_queue_index
是以顺序(文件名从0开始累加)的段文件进行存储,后缀“.idx",每个段文件中包含固定的 segment_entry_count
条记录,其默认值为16384.
解决消息堆积方法
① 增加prefetch_count
的值,即一次发送多条消息给消费者,加快消息被消费的速度。
channel.basicQos(int prefetchCount)
② 采用multiple ack
即通过批量确认的方式来减低处理单个ack带来的开销;
③ 流量控制
惰性队列
Q:今天看书时,看到这么一句话:注意如果惰性队列中存储的是非持久化的消息,内存的使用率会一直很稳定,但是重启之后消息一样会丢失。
书中一开始是说到,不管是持久化,还是非持久化,惰性队列会将收到的消息直接存入到文件系统中;后面又说如果存储的是非持久的消息,重启后依然会丢失;
这就奇怪了,不是都会存入到文件系统中吗?为什么重启后,依然会丢失?
是不是rabbmitMQ 重启后,会判断消息是不是持久化的,如果是非持久话的就把文件系统中的消息进行删除?
A: 在微信上问了下书的作者,他的回答是:可以想象成临时存一下
。
内存及磁盘告警
连接状态(State)
blocking
对应于并不试图发送消息的connection
,即消费者关联的connection
,这种状态下的connection
可以继续运行。blocked
对应于一直有消息发送的connection
,这种状态下的connection
会被停止发送消息。
镜像队列
除发送消息(Basic.Publish
)外的所有动作都只会向master
发送。比如消费者获取到的消息,都是由master上获取到的。
网络分区的判断
ticktime
默认值为60s。
从图中我们可以知道,最小经历0.75*ticktime
秒的时间间隔,可以得到连续4次的tick
。
所以,假设我们把连续4次的tick的时间记为:T
,
那么T
的取值范围:0.75*net_ticktime < T < 1.25*net_ticktime
;
默认情况下:45s < T < 60s