RabbitMQ学习笔记:基础理论知识

tech2022-08-20  69

环境

发送消息

发送消息一般是需要指定发送到哪个交换器的,但是如果设置为空字符串,则消息会被发送到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

最新回复(0)