RabbitMQ

第三部分:RabbitMQ------企业级消息队列实战

3.1 RabbitMQ核心概念

  • Producer:消息生产者

  • Exchange:消息路由(支持Direct、Topic、Fanout、Headers四种类型)

  • Queue:消息存储队列

  • Consumer:消息消费者

架构示意图:

```mermaid

graph LR

AProducer -->|Publish| BExchange

B -->|Bind| CQueue1

B -->|Bind| DQueue2

C --> EConsumer1

D --> FConsumer2

```

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 高级特性

  1. 消息确认机制(ACK)
  • 生产者确认(publisher confirm)

  • 消费者手动ACK(避免消息丢失)

  1. TTL(Time-To-Live)

设置消息过期时间,防止队列堆积:

```java

MessageProperties props = MessagePropertiesBuilder.newInstance()

.setExpiration("60000") // 60秒过期

.build();

rabbitTemplate.convertAndSend(exchange, routingKey, message, props);

```

  1. 死信队列(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实现关键业务解耦。记住:没有最好的架构,只有最适合的架构。

相关推荐
码兄科技3 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研4 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe184 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_4 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff5 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯5 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
爱笑的源码基地6 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
我命由我123456 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime
万亿少女的梦1686 小时前
基于Python的高考志愿填报辅助系统设计与实现
java·spring boot·python·mysql·vue
微信开发api-视频号协议7 小时前
企业微信外部群开发自动化实践过程
java·前端·微信·自动化·企业微信·ipad