消息持久化配置
消息持久化一般分为两重:
- 瞬时消息
- 持久消息
持久消息就是当消息一经队列,就会将这个消息存储在磁盘中,顺带也存储在了内存中。而瞬时消息于持久消息不同,只存在磁盘中。所以当队列中内存吃紧时,就会自动把内存中的持久消息删除掉来存放最新的持久消息。
持久层其实由两个部分组成:队列索引(queue index)和消息仓库(message storage)。
队列索引主要是负责消息所在队列的具体位置,以及表明是否被传递和确认的,所以这就是说每个队列都有一个队列索引。
消息仓库是用来存储消息的 key-value 对的,主要用来分享队列公用的数据。
消息既可以存储在队列索引中也可以存储在消息仓库里。而消息仓库有有两种技术上的说法:瞬时,持久(这两者一起被称为消息仓库)。
关于内存消耗
就像前面说的,持久层尽量会让消息移除内存存储到磁盘,但是还是要注意有些是必须要消耗内存的。
- 每个队列维护未经确认的消息元数据,这个是需要消耗内存的。如果这个消息持久消息,那么就会从内存中移除到磁盘中。
- 消息存储索引这个是需要消耗内存的。
消息是可以存储到队列索引上,这里有一些好处和弊端:
好处:
- 消息以一个操作写入磁盘而不是两个;对于很小的消息来说,就能获取更大的收益
- 消息写进队列索引中不要求消息的条目存储到索引中,因此当移除的时候这是不会有内存消耗的。
弊端:
- 队列索引固定了大量的记录的内存;如果是很大的消息写到队列索引中,内存的使用是巨大的。
- 当消息被交换机路由到多个队列时,它们就会被写到多个队列索引中。如果这个消息时存储到消息仓库中,那么就只需要拷贝一次副本即可。
- 那些目标对象是队列索引的未经确认的消息始终会占据着内存。
https://www.rabbitmq.com/persistence-conf.html