发送消息一般是需要指定发送到哪个交换器的,但是如果设置为空字符串,则消息会被发送到RabbitMQ默认的交换器中。
消费消息时,需要提供标签来做消费者的区分
优先级队列需要设置两个地方:
队列:将某个队列通过x-max-priority参数来实现优先级的设置。消息:在发送消息时,对消息的属性设置优先级: AMQP.BasicProperties中priority属性。节点类型分为两种: ① 磁盘节点 ② 内存节点
该层由两部分组成: ① 队列索引 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