RabbitMQ
概念
- 消息:两个应用之间传输的数据
- 消息队列:消息传输过程中保存消息的容器。两个应用分别是生产者和消费者,生产者只负责将消息放到队列中,不控制是哪个消费者取得消息。
功能
- 解耦:生产者只负责生产消息,将消息传入消息队列即可,不负责消息的分配,所以不需要添加多余的代码控制。消费者的增加和减少并不影响生产者的工作,只需要从队列中取对应的信息,从而减低了强耦合
- 异步:消息的发送者发送消息到队列中后可以直接返回,不需要等待接收者的处理。接收者可以自由的从队列中获取消息,处理结束后可以将结果从另一个队列传递,便于其他服务继续处理。
- 削峰:在系统中,如果突然出现高流量,可能会导致某些服务瘫痪。增加消息队列可以将对应的请求放到队列中,通过控制队列中的未处理消息和消费速率可控制系统处理速度和负载,直到高峰过去,将积压的消息逐渐消费
特点
- 可靠性高:采用多种方式保证消息的可靠性,例如持久化、消息确认机制
- 灵活性强:采用多种消息传递方式,例如点对点、发布订阅等
- 高扩展性:可以通过更多的结点提高系统的性能和容量
- 多语言支持:Java、python、c#等
- 易于部署和管理:安装和部署很简单,提供管理工具监控和管理整个消息队列
初体验
安装成功后可以在http://localhost:15672查看
代码案例
- 引入RabbitMQ的依赖:在Spring Boot应用程序的pom.xml文件中添加RabbitMQ的依赖,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
- 配置RabbitMQ连接信息:在Spring Boot应用程序的application.properties文件中添加RabbitMQ的连接信息,例如:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=user
spring.rabbitmq.password=pass
- 定义消息队列:在Spring Boot应用程序中定义消息队列,例如:
@Configuration
public class RabbitConfig {
public static final String QUEUE_NAME = "myQueue";
@Bean
public Queue myQueue() {
return new Queue(QUEUE_NAME, true);
}
}
- 发送消息:在Spring Boot应用程序中发送消息,例如:
@RestController
public class MyController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public String sendMessage() {
rabbitTemplate.convertAndSend(RabbitConfig.QUEUE_NAME, "Hello, RabbitMQ!");
return "Message sent";
}
}
- 接收消息:在Spring Boot应用程序中接收消息,例如:
@RestController
public class MyController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public String sendMessage() {
rabbitTemplate.convertAndSend(RabbitConfig.QUEUE_NAME, "Hello, RabbitMQ!");
return "Message sent";
}
}
组成
消息:在RabbitMQ中,消息是指传递的数据,可以是文本、JSON、XML等格式。
生产者:生产者是指将消息发送到RabbitMQ的应用程序或服务,可以是任何支持AMQP协议的客户端。
Exchange(交换机):交换机是RabbitMQ的核心组件之一,它负责接收来自生产者的消息并将其路由到相应的队列中。RabbitMQ提供了四种类型的交换机,分别是Direct、Fanout、Topic和Headers。
Queue(队列):队列是RabbitMQ的另一个核心组件,它是存储消息的地方。在RabbitMQ中,生产者将消息发送到交换机,然后交换机将消息路由到相应的队列中,消费者从队列中接收并处理消息。
绑定(Binding):绑定是将交换机和队列连接起来的过程,它定义了消息从交换机到队列的路由规则。
消费者:消费者是从RabbitMQ中接收并处理消息的应用程序或服务。消费者通过订阅队列中的消息来接收消息,可以是任何支持AMQP协议的客户端。
Exchange交换机
在RabbitMQ中,交换机(Exchange)是消息路由的核心组件之一,它接收生产者发送的消息并将消息路由到一个或多个队列中。RabbitMQ提供了四种类型的交换机:Direct、Fanout、Topic和Headers。
-
Direct交换机:Direct交换机是最简单的一种交换机,它根据消息的Routing Key将消息路由到一个或多个队列中。在Direct交换机中,Routing Key必须完全匹配,否则消息将被丢弃。
-
Fanout交换机:Fanout交换机将消息广播到所有与其绑定的队列中,不考虑Routing Key的值。在Fanout交换机中,Routing Key被忽略,所有的消息都会被发送到所有绑定的队列中。
-
Topic交换机:Topic交换机根据消息的Routing Key和绑定的队列的模式将消息路由到一个或多个队列中。在Topic交换机中,Routing Key可以使用通配符和#,其中匹配一个单词,#匹配零个或多个单词。
-
Headers交换机:Headers交换机根据消息的Headers信息将消息路由到一个或多个队列中,与Routing Key无关。在Headers交换机中,Routing Key被忽略,而是根据消息中的Headers信息来决定将消息发送到哪个队列中。