RabbitMQ的AMQP协议是什么
AMQP(Advanced Message Queuing Protocol),高级消息队列协议,提供统一消息服务的开放标准,其核心目标是实现客户端与消息服务之前的高效、安全异步通信,并且在传递的时候不受客户端和开发语言的限制。
RabbitMQ消息的工作模式
简单模式:一个生产者一个队列一个消费者,先进先出,一般都是自己实验的时候玩。
队列模式:一个生产者一个队列多个消费者,消费者之间竞争消息,实现了消费者的均衡,一个消息只能被一个消费者消费。
交换机模式:
直连交换机(Direct Exchange):根据指定的路由键完全匹配路由到队列。若路由键不匹配,消息不会被分发。例如,若队列绑定键为 "dog",则仅匹配路由键为 "dog" 的消息。
@Component public class DirectConfig {@Beanpublic DirectExchange directExchangeOne(){ // name:交换机名称,用于标识该交换机在RabbitMQ中的唯一性。 // durable:持久化标志,true表示交换机会被持久化存储(重启后不丢失),false表示临时交换机(重启后消失)。默认值为true。 // autoDelete:自动删除标志,true表示当所有绑定的队列解绑后自动删除该交换机,false表示手动删除return new DirectExchange("directExchangeOne",true,false);}@Beanpublic Queue directQueueOne(){//name:交换机名称,用于标识该交换机在RabbitMQ中的唯一性。 //durable:持久化标志,true表示交换机会被持久化存储(重启后不丢失),false表示临时交换机(重启后消失)。默认值为true。return new Queue("directQueueOne", true);}@Beanpublic Queue directQueueTwo(){return new Queue("directQueueTwo");}@Beanpublic Binding directBindingOne(){return BindingBuilder.bind(directQueueOne()).to(directExchangeOne()).with("directKey1");}@Beanpublic Binding directBindingTwo(){return BindingBuilder.bind(directQueueTwo()).to(directExchangeOne()).with("directKey2");}}
扇型交换机(Fanout Exchange):将消息广播到所有绑定的队列,不依赖路由键。适用于需要消息被多个队列接收的场景。
@Component public class FanoutConfig {@Beanpublic FanoutExchange fanoutExchange1(){return new FanoutExchange("fanoutExchange1");}@Beanpublic Queue fanoutQuery1(){return new Queue("fanout_queue1");}@Beanpublic Queue fanoutQuery2(){return new Queue("fanout_queue2");}@Beanpublic Binding fanoutBinding1(){return BindingBuilder.bind(fanoutQuery1()).to(fanoutExchange1());}@Beanpublic Binding fanoutBinding2(){return BindingBuilder.bind(fanoutQuery2()).to(fanoutExchange1());} }
主题交换机(Topic Exchange):支持路由键使用通配符 *(匹配单个词)和 #(匹配多个词)。例如,绑定模式为 audit.# 可接收 audit.irs.corporate 类型的消息。
MQ如何保证消息不丢失
消息丢失分为四个场景
1.生产者到队列过程中
2.交换机到队列的过程
3.队列到消费者的过程
4.交换机未持久化
5.队列未持久化
解决办法
1.生产者到队列过程中防止消息丢失