RabbitMQ消息队列怎样做到服务宕机或重启消息不丢失
RabbitMQ确保持久性消息能从服务器重启中恢复的方式是,将它们写入磁盘上的一个持久化日志文件。当发布一个持久性消息到持久交换机上时,Rabbit会在消息提交到日志文件后才发送响应。记住,之后这条消息如果路由到了非持久队列的话,它会自动从持久性日志中移除,并且无法从服务器重启中恢复。如果你使用持久性消息的话,则确保之前提到的持久性消息的那三点都必须做到位。一旦你从持久性队列中消费了一个持久性消息的话(并且确认了它),RabbitMQ会在持久化日志中把这条消息标记为等待垃圾收集。在你消费持久性消息前,如果RabbitMQ重启的话,服务器会自动重建交换机和队列(以及绑定),重播持久性日志文件的消息到合适的队列或者交换机上(取决于Rabbit服务器宕机的时候,消息处在路由过程的哪个环节)。
虽然持久化消息可以做到消息的不丢失,但持久化的消息在进入队列前会被写到磁盘,这个过程比写到内存慢得多,所以会严重的影响性能,可能导致消息的吞吐量降低10倍不止。所以,在做消息持久化前,一定要认真考虑性能和需求之间的平衡关系。
关键两点:
1,docker volume 或者本地数据目录映射到/var/lib/rabbitmq;
2,设定hostname
rabbitmq:
image: rabbitmq:3.8.3-management
container_name: rabbitmq
restart: always
hostname: rabbitmq_host
ports:
- 15672:15672 # web UI 管理接口
- 5672:5672 # 生产者和消费者连接使用的接口
volumes:
- ./log:/var/log/rabbitmq #挂载 RabbitMQ日志
- ./data:/var/lib/rabbitmq #挂载 RabbitMQ数据
environment:
- RABBITMQ_DEFAULT_USER=root
- RABBITMQ_DEFAULT_PASS=123456
标签:持久,RabbitMQ,rabbitmq,持久性,docker,日志,消息
From: https://www.cnblogs.com/drivertobolin/p/17131326.html