RabbitMQ各种模式的含义与Spring Boot实例详解
RabbitMQ是一款强大的消息中间件,支持多种消息传递模式。在这篇文章中,我们将详细解释RabbitMQ的几种常见模式,并通过Spring Boot实例代码进行演示,让读者更好地理解每种模式的含义。
1. Direct Exchange(直连交换机)
含义: Direct Exchange 是一种简单的消息路由模式。在这个模式下,消息的路由键与绑定时指定的路由键完全匹配,消息才会被发送到相应的队列。
比喻: 想象你有一个快递服务,每个包裹都有一个独一无二的编号。直连交换机就像你把包裹按照编号直接送到对应的收件人手中。
Spring Boot实例:
@RestController public class DirectExchangeController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendDirectMessage") public String sendDirectMessage() { String message = "Hello Direct Exchange!"; rabbitTemplate.convertAndSend("directExchange", "directRoutingKey", message); return "Message sent: " + message; } }
2. Fanout Exchange(扇形交换机)
含义: Fanout Exchange 将消息广播到所有绑定到它的队列,忽略 Routing Key。无论消息的 Routing Key 是什么,所有绑定到该交换机的队列都会收到相同的消息。
比喻: 想象你有一个广播电台,无论听众在哪个频道,只要打开收音机就能收到相同的音乐。Fanout Exchange 就像这个广播电台。
Spring Boot实例:
@RestController public class FanoutExchangeController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendFanoutMessage") public String sendFanoutMessage() { String message = "Hello Fanout Exchange!"; rabbitTemplate.convertAndSend("fanoutExchange", "", message); return "Message sent: " + message; } }
3. Topic Exchange(主题交换机)
含义: Topic Exchange 允许队列通过通配符匹配的方式来绑定 Routing Key,更灵活地进行消息过滤。生产者将消息发送到主题交换机,同时指定一个与消息相关的 Routing Key。
比喻: 想象你有一个新闻站,用户可以根据自己的兴趣订阅不同的主题。Topic Exchange 就像用户订阅不同主题的新闻。
Spring Boot实例:
@RestController public class TopicExchangeController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendTopicMessage") public String sendTopicMessage() { String message = "Hello Topic Exchange!"; rabbitTemplate.convertAndSend("topicExchange", "topic.routing.key", message); return "Message sent: " + message; } }
4. Headers Exchange(头交换机)
含义: Headers Exchange 使用消息头的属性来进行匹配,而不是使用 Routing Key。生产者在发送消息时可以设置消息头的键值对,消费者在绑定队列时指定一组键值对。
比喻: 想象你有一个私人飞机,只有在天气晴朗的情况下才会飞行。Headers Exchange 就像你设置一组天气条件,只有满足条件的时候才会起飞。
Spring Boot实例:
@RestController public class HeadersExchangeController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendHeadersMessage") public String sendHeadersMessage() { String message = "Hello Headers Exchange!"; MessageHeaders headers = MessageHeadersBuilder .withDefault() .setHeader("header1", "value1") .setHeader("header2", "value2") .build(); Message<String> rabbitMessage = MessageBuilder.createMessage(message, headers); rabbitTemplate.send("headersExchange", "", rabbitMessage); return "Message sent: " + message; } }
5. Default Exchange(默认交换机)
含义: Default Exchange 是一个 Direct Exchange,它允许使用队列的名称作为 Routing Key。当消息发送到 Exchange 时,会根据 Routing Key 直接路由到与之同名的队列。
比喻: 想象你有一个小邮局,每个邮箱的名字就是收信人的名字。Default Exchange 就像你直接把信件放到相应的邮箱。
Spring Boot实例:
@RestController public class DefaultExchangeController { @Autowired private RabbitTemplate rabbitTemplate; @GetMapping("/sendDefaultMessage") public String sendDefaultMessage() { String message = "Hello Default Exchange!"; rabbitTemplate.convertAndSend("", "defaultQueue", message); return "Message sent: " + message; } }