持久化的消息和非持久化的消息均可以被写入到磁盘。
持久化的消息一开始就会写入磁盘,若是能够,也会在内存中保存一部分以提升性能,当内存吃紧时会从内存中清楚。
非持久化的消息通常存储在内存中,内存吃紧时会换入到磁盘中,以节省内存空间。
这两种类型的消息的落盘处理都在RabbitMQ的”持久层“完成。算法
持久层是一个逻辑概念,包含队列索引和消息存储。性能
消息能够存储在rabbit_queue_index中,也能够存储在在rabbit_msg_store中。最佳的配备是较小的消息存储在 rabbit queue index 中而较大的消息存储在rabbit_msg_store 中。索引
队列一般由rabbit_amqqueue_process和backing_queue两部分组成队列
尽量地将消息存入磁盘中,在消费者消费到相应消息时才被加载到内存中。进程
内存或者磁盘低于配置的阈值时,RabbitMQ会暂时阻塞客户端的链接直至恢复正常。blocking:对应消费者关联的connection,这时候并不阻塞。blocked:对应发送消息的Connection,这时候阻塞。内存
RabbitMQ从2.8版本之后还引入了流控来保证系统的稳定性。内存和磁盘告警至关于全局流控,一旦触发会阻塞集群中全部Connection,本流控是针对单个Connection的。
RabbitMQ 使用了一种基于信用证算法 (credit-based algorithm) 的流控机制来限制发送消息的速率以解决前面所提出的问题。
流控做用于Connection,出现邮件饱和时会阻塞。流控做用于Channel,出现性能瓶颈时会阻塞。it
综上,瓶颈每每发生在rabbit_amqqueue_process 中,用多个rabbit_amqqueue_process代替单个rabbit_amqqueue_process,能够充分利用上被流控的性能(声明交换器、队列、绑定关系;封装消费者;封装生产者)。io
避免单点问题,集群中某个节点崩溃,虽然交换器和绑定关系还能保存,队列和其上存储的消息却不能幸免于难,这是由于队列进程及其内容仅仅维持在
单个节点之上,因此一个节点的失效表现为其对应的队列不可用。
引入镜像队列的机制,能够将队列镜像到集群中的其余 Broker 节点之上,若是集群中的一个节点失效了,队列能自动地切换到镜像中的另外一个节点上以保证服务的可用性。集群