RabbitMQ是一个开源的消息代理和队列服务器,基于AMQP协议实现。其核心架构包含以下组件:
graph LR
P[Producer] -->|发布消息| E[Exchange]
E -->|路由消息| Q[Queue]
Q -->|存储消息| C[Consumer]
B[Broker] -->|管理| E
B -->|管理| Q
生产者核心流程:
Java实现代码片段:
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
// 建立连接和信道
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 声明交换机
channel.exchangeDeclare(EXCHANGE_NAME, "direct", true);
// 发布消息
channel.basicPublish(EXCHANGE_NAME, ROUTING_KEY,
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes(StandardCharsets.UTF_8));
}
消费者核心流程:
Java实现代码片段:
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
// 建立连接和信道
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
// 声明队列
channel.queueDeclare(QUEUE_NAME, true, false, false, null);
// 绑定队列到交换机
channel.queueBind(QUEUE_NAME, EXCHANGE_NAME, ROUTING_KEY);
// 消费消息
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), StandardCharsets.UTF_8);
System.out.println("Received: " + message);
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
}
org.springframework.boot
spring-boot-starter-amqp
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
publisher-confirm-type: correlated
publisher-returns: true
@Service
public class RabbitMQProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(String exchange, String routingKey, String message) {
rabbitTemplate.convertAndSend(exchange, routingKey, message, m -> {
m.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT);
return m;
});
}
}
@Configuration
public class RabbitMQConfig {
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(
ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setConcurrentConsumers(3);
factory.setMaxConcurrentConsumers(10);
return factory;
}
}
@Component
public class RabbitMQConsumer {
@RabbitListener(queues = "${rabbitmq.queue.name}")
public void receiveMessage(String message) {
System.out.println("Received message: " + message);
}
}
| 参数 | 说明 | 示例值 |
|------|------|--------|
| publisher-confirms | 是否启用发布确认 | true |
| publisher-returns | 是否启用返回机制 | true |
| connection-timeout | 连接超时时间(ms) | 30000 |
| template.mandatory | 消息必须路由到队列 | true |
| template.retry.enabled | 发送失败是否重试 | true |
| 参数 | 说明 | 示例值 |
|------|------|--------|
| prefetchCount | 预取消息数量 | 10 |
| acknowledge-mode | 确认模式(AUTO/MANUAL/NONE) | AUTO |
| concurrency | 最小消费者数量 | 3 |
| max-concurrency | 最大消费者数量 | 10 |
| default-requeue-rejected | 拒绝消息是否重新入队 | false |
docker run -d \
--name rabbitmq \
-p 5672:5672 \
-p 15672:15672 \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=password \
rabbitmq:management
# 安装Erlang
sudo apt-get install erlang
# 安装RabbitMQ
sudo apt-get install rabbitmq-server
# 启动服务
sudo systemctl start rabbitmq-server
# 启用管理插件
sudo rabbitmq-plugins enable rabbitmq_management
本文全面介绍了RabbitMQ的核心架构、实现原理、SpringBoot集成方式以及生产环境配置建议。通过合理的参数配置和架构设计,RabbitMQ可以成为分布式系统中可靠的消息中间件解决方案。