第三部分:RabbitMQ------企业级消息队列实战
3.1 RabbitMQ核心概念
-
Producer:消息生产者
-
Exchange:消息路由(支持Direct、Topic、Fanout、Headers四种类型)
-
Queue:消息存储队列
-
Consumer:消息消费者
架构示意图:
```mermaid
graph LR
A[Producer] -->|Publish| B[Exchange]
B -->|Bind| C[Queue1]
B -->|Bind| D[Queue2]
C --> E[Consumer1]
D --> F[Consumer2]
```
3.2 Spring Boot整合RabbitMQ
步骤1:添加依赖
```xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
```
步骤2:配置连接
```yaml
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtual-host: /
```
步骤3:发送消息
```java
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendOrderMessage(Order order) {
rabbitTemplate.convertAndSend("order.exchange",
"order.create",
order);
}
```
步骤4:监听消息
```java
@RabbitListener(queues = "order.queue")
public void handleOrder(Order order) {
// 处理订单逻辑
System.out.println("Received order: " + order.getId());
}
```
3.3 高级特性
- 消息确认机制(ACK)
-
生产者确认(publisher confirm)
-
消费者手动ACK(避免消息丢失)
- TTL(Time-To-Live)
设置消息过期时间,防止队列堆积:
```java
MessageProperties props = MessagePropertiesBuilder.newInstance()
.setExpiration("60000") // 60秒过期
.build();
rabbitTemplate.convertAndSend(exchange, routingKey, message, props);
```
- 死信队列(DLX)
处理失败消息的重试机制:
```java
@Bean
public Queue orderQueue() {
return QueueBuilder.durable("order.queue")
.withArgument("x-dead-letter-exchange", "dlx.exchange")
.build();
}
```
第四部分:选型策略与性能优化
4.1 通信方式决策树
```plaintext
是否需要实时响应?
├── 是 → 同步调用(OpenFeign/gRPC)
└── 否 → 异步消息(RabbitMQ/Kafka)
```
4.2 RabbitMQ性能调优
-
提升吞吐量:
-
启用Channel预取(prefetchCount)
-
批量发送消息(Batch Publishing)
-
保障可靠性:
-
持久化队列(durable=true)
-
镜像队列(Mirrored Queues)实现高可用
第五部分:常见问题与解决方案
Q1:消息重复消费怎么办?
- 方案:消费端实现幂等性(如数据库唯一索引)
Q2:如何保证消息顺序性?
- 方案:单个队列单消费者,或使用Kafka分区
Q3:消息堆积如何处理?
- 方案:增加消费者实例,或设置TTL+死信队列
结语:架构设计的平衡之道
同步与异步调用各有利弊,关键在于根据业务场景找到平衡点。对于初创项目,建议优先使用同步调用快速迭代;当系统复杂度上升时,逐步引入RabbitMQ实现关键业务解耦。记住:没有最好的架构,只有最适合的架构。