RabbitMQ 入门之发布订阅模式
前面已经提过了引入 MQ 的优点,解耦、异步和流量削峰,这里不再赘述。
RabbitMQ 的结构
RabbitMQ 有几个个概念:
- RoutingKey 路由键,在发布订阅模型中根据 RoutingKey 可以找到具体队列。
- Publisher 生产者,生产消息发送给 Exchange(如果没有 Exchange 就直接发送发到 Queue)。
- Exchange 交换机,根据与 Queue 绑定的 BindingKey 将消息发送到 Queue(BindingKey 与 RoutingKey 概念相似)。
- Queue 队列,Exchange 将消息发送到 Queue 后,消息暂存在 Queue 内,等待 消费者消费。
- Consumer 消费者,监听具体队列,从队列中获取消息后消费消息。
总结:生产者面向 Exchange 和 Queue 编程。消费者面向Queue 编程。
RabbitMQ 的六种模式
RabbitMQ 有六种模式:
- 简单模式:无交换机,一个队列只能连接一个消费者。
- 工作模式:无交换机,一条队列能有连接多个消费者。
- 广播模式:交换机将接收到的消息路由到每一个跟其绑定的队列。
- 路由模式:交换机将接收的消息根据规则路由到指定的队列。
- 主题模式:交换机将接收到的消息,根据匹配路由到队列。路由键必须是多个单词的列表,使用 ‘.’ 分割。
- RPC 模式:调用远程方法需要等待结果时可用。
发布订阅模式包含了广播模式、路由模式和主题模式。都是多个生产者多个消费者模式,通过 RoutingKey 来进行路由。
SpringAMQP
SpringAMQP 是在 Spring 框架中整合了 AMQP 规则,可以进行队列配置操作。
声明队列和交换机,并将两者进行绑定。有两种方式,第一种 @Bean 进行类配置,第二种 @RabbitListener 进行注解配置。
类配置方式:
// 声明 FanoutExchange 交换机
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("itcast.fanout");
}
// 声明队列
@Bean
public Queue fanoutQueue() {
return new Queue("fanout.queue");
}
// 绑定队列和交换机
@Bean
public Binding bindingQueue1(Queue fanoutQueue1, FanoutExchange fanoutExchange) {
return BindingBuilder.bind(fanoutQueue).to(fanoutExchange);
}
注解方式:
@RabbitListener(bindings = @QueueBinding(
value = @Queue(name = "direct.queue2"), // 监听队列
exchange = @Exchange(name = "itcast.direct"