RabbitMQ是一个开源的消息代理和队列服务器,基于**AMQP(Advanced Message Querying Protocol)**协议实现。它通过异步消息传递机制实现应用程序之间的解耦,广泛应用于分布式系统、微服务架构、任务队列等场景。
核心特性:
可靠性:支持持久化、传输确认和发布确认
灵活的路由:通过交换机实现多种消息路由策略
集群扩展:支持高可用性和横向扩展
多协议支持:STOMP、MQTT等
跨语言:提供Java/Python/Go/.NET等客户端库
组件 | 说明 |
---|---|
Producer | 消息生产者,发送消息到Exchange |
Consumer | 消息消费者,从队列接收消息 |
Exchange | 接收生产者消息,根据规则路由到队列(四种类型:direct/fanout/topic/headers) |
Queue | 存储消息的缓冲区 |
Binding | Exchange与Queue之间的绑定规则 |
Producer → Exchange → Binding → Queue → Consumer
Ubuntu/Debian
bash
sudo apt-get install erlang
sudo apt-get install rabbitmq-server
sudo systemctl start rabbitmq-server
CentOS
bash
sudo yum install erlang
sudo yum install rabbitmq-server
sudo systemctl start rabbitmq-server
Docker
bash
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:management
启用Web管理插件:
bash
rabbitmq-plugins enable rabbitmq_management
访问 http://server-ip:15672
使用默认账号guest/guest
登录
bash
pip install pika
python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='', routing_key='hello', body='Hello RabbitMQ!')
connection.close()
python
import pika
def callback(ch, method, properties, body):
print(f"Received {body}")
connection = pika.BlockingConnection(...)
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True)
channel.start_consuming()
xml
com.rabbitmq
amqp-client
5.16.0
运行 HTML
java
public class Producer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare("java_queue", false, false, false, null);
channel.basicPublish("", "java_queue", null, "Hello Java!".getBytes());
}
}
}
java
public class Consumer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
DeliverCallback callback = (tag, delivery) -> {
System.out.println("Received: " + new String(delivery.getBody()));
};
channel.basicConsume("java_queue", true, callback, consumerTag -> {});
}
}
Python
python
channel.exchange_declare(exchange='direct_logs', type='direct')
Java
java
channel.exchangeDeclare("direct_logs", "direct");
Python
python
channel.exchange_declare(exchange='fanout_logs', type='fanout')
Java
java
channel.exchangeDeclare("fanout_logs", "fanout");
Python
python
channel.queue_bind(exchange='topic_logs', routing_key='*.error')
Java
java
channel.queueBind("queueName", "topic_logs", "*.error");
Python
python
channel.queue_declare(queue='durable_queue', durable=True)
properties=pika.BasicProperties(delivery_mode=2)
Java
java
channel.queueDeclare("durable_queue", true, false, false, null);
channel.basicPublish("", "durable_queue",
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
Python手动确认
python
channel.basic_consume(..., auto_ack=False)
ch.basic_ack(delivery_tag=method.delivery_tag)
Java手动确认
java
channel.basicConsume(queueName, false, (tag, delivery) -> {
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
}, tag -> {});
bash
# 通用集群配置
rabbitmqctl join_cluster rabbit@node1
Web管理界面实时查看队列状态
使用rabbitmqctl list_queues
命令
关键指标:
消息积压数(Ready/Unacked)
内存使用率(mem_used)
磁盘水位(disk_free_limit)
生产级配置:
始终启用持久化(队列+消息)
设置合理的TTL(x-message-ttl)
使用确认机制保证可靠性
错误处理:
实现死信队列(Dead Letter Exchange)
添加重试机制
监控消费者异常
安全建议:
禁用默认guest账户
启用SSL加密通信
使用VPN保护管理端口
功能 | Python(pika) | Java(amqp-client) |
---|---|---|
连接管理 | BlockingConnection/SelectConnection | ConnectionFactory/Connection |
异常处理 | 捕获ConnectionClosed异常 | 需要处理IOException/ShutdownSignal |
异步消费 | basic_consume+回调 | 使用DeliverCallback接口 |
性能优化 | 使用多个Channel并发 | 利用Channel池化技术 |
附录:常用命令
bash
复制
# 查看队列列表 rabbitmqctl list_queues # 清除队列数据 rabbitmqctl purge_queue my_queue # 查看集群状态 rabbitmqctl cluster_status
整合说明:
采用双语对照结构,在关键章节同时展示Python和Java实现
保留独立的快速入门章节,便于不同语言开发者快速上手
增加跨语言对比表格,突出不同客户端的差异点
统一配置示例的命名规范(如统一使用hello
队列)
优化代码示例的异常处理(Java使用try-with-resources)
增加生产环境安全建议和性能优化提示
建议在实际部署时:
Python项目使用pika>=1.2.0
Java项目使用amqp-client>=5.16.0
启用消息确认和持久化机制
配置合理的QoS参数(prefetch_count)