面试题答案
一键面试消息持久化的实现方式
- 队列持久化:
- 在声明队列时,将
durable
参数设置为true
。例如,在Java中使用Spring AMQP声明队列:
@Bean public Queue myQueue() { return QueueBuilder.durable("myQueue").build(); }
- 这样设置后,RabbitMQ服务器在重启后,该队列依然存在。
- 在声明队列时,将
- 消息持久化:
- 在发送消息时,将消息的
deliveryMode
属性设置为2。以Java为例,使用Spring AMQP发送持久化消息:
MessageProperties messageProperties = new MessageProperties(); messageProperties.setDeliveryMode(MessageDeliveryMode.PERSISTENT); Message message = new Message("Hello, RabbitMQ!".getBytes(), messageProperties); rabbitTemplate.send("myQueue", message);
- 这使得消息在被投递到队列时,会被写入磁盘,即使RabbitMQ服务器重启,该消息也不会丢失。
- 在发送消息时,将消息的
对系统可靠性的影响
- 提高可靠性:
- 队列持久化确保了即使RabbitMQ服务器重启,队列结构依然存在,不会丢失已声明的队列,为消息的接收提供了基本保障。
- 消息持久化使得消息在服务器重启或故障时不会丢失,保证了消息的可靠性传递,特别是对于一些重要的业务消息,如订单消息等,确保其不丢失对业务的完整性至关重要。
- 性能开销:
- 消息持久化和队列持久化都会带来一定的性能开销。因为需要将数据写入磁盘,相比内存操作,磁盘I/O的速度较慢。所以在高并发场景下,过多的持久化操作可能会影响系统的整体性能,需要在可靠性和性能之间进行权衡。例如,可以对不同重要程度的消息采取不同的持久化策略,对于关键业务消息进行持久化,对于一些非关键的监控等消息不进行持久化以提升性能。