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

环境

发送消息

发送消息一般是需要指定发送到哪个交换器的,但是如果设置为空字符串,则消息会被发送到RabbitMQ默认的交换器中。

消费者

消费消息时,需要提供标签来做消费者的区分

高阶知识

mandatory
取值描述
true:消息至少投递到一个队列中,否则就返回给生产者。
false:消息至少投递到一个队列中,否则就丢弃掉。

优先级队列

优先级队列需要设置两个地方:

  1. 队列:将某个队列通过x-max-priority参数来实现优先级的设置。
  2. 消息:在发送消息时,对消息的属性设置优先级:
    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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山鬼谣me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值