RabbitMQ是一个开源的消息队列中间件,基于AMQP(Advanced Message Queuing Protocol)协议实现。它作为一个消息代理(Message Broker),可以接收、存储和转发消息数据,用于解耦系统组件、实现异步通信、流量削峰等场景。
消息队列是一种异步通信模式,允许应用程序通过发送和接收消息进行通信:
AMQP(Advanced Message Queuing Protocol)是一个开放标准的应用层协议,专为面向消息的中间件设计。
AMQP 0-9-1模型(RabbitMQ采用的版本)包含以下核心组件:
RabbitMQ支持多种Exchange类型,决定消息如何路由:
+----------------+
Producer ------→ | Exchange | -----→ Queue -----→ Consumer
+----------------+
↓
+----------------+
| Binding |
+----------------+
RabbitMQ提供了多种确认机制确保消息可靠传递:
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 声明队列
channel.queueDeclare("simple-queue", true, false, false, null);
// 发布消息
String message = "Hello RabbitMQ!";
channel.basicPublish("", "simple-queue",
MessageProperties.PERSISTENT_TEXT_PLAIN,
message.getBytes());
// 声明队列
channel.queueDeclare("simple-queue", true, false, false, null);
// 创建消费者
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println("Received: " + message);
// 手动确认消息
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
};
// 开始消费消息
channel.basicConsume("simple-queue", false, deliverCallback, consumerTag -> {});
// 声明交换机
channel.exchangeDeclare("logs", BuiltinExchangeType.FANOUT);
// 创建临时队列
String queueName = channel.queueDeclare().getQueue();
// 绑定队列到交换机
channel.queueBind(queueName, "logs", "");
// 发布消息到交换机
String message = "Info: This is a log message";
channel.basicPublish("logs", "", null, message.getBytes());
Map<String, Object> args = new HashMap<>();
args.put("x-max-priority", 10);
channel.queueDeclare("priority-queue", true, false, false, args);
// 发送优先级消息
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.priority(8)
.build();
channel.basicPublish("", "priority-queue", properties, message.getBytes());
// 设置队列消息TTL
Map<String, Object> args = new HashMap<>();
args.put("x-message-ttl", 60000); // 60秒
channel.queueDeclare("ttl-queue", true, false, false, args);
// 设置单个消息TTL
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.expiration("10000") // 10秒
.build();
// 声明死信交换机
channel.exchangeDeclare("dlx", BuiltinExchangeType.DIRECT);
// 声明正常队列,并指定死信设置
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", "dlx");
args.put("x-dead-letter-routing-key", "dead");
channel.queueDeclare("normal-queue", true, false, false, args);
AMQP是一个二进制协议,由帧(frames)组成:
AMQP主要帧类型:
RabbitMQ作为实现AMQP协议的成熟消息中间件,提供了丰富的功能特性满足各种场景需求。AMQP协议的开放标准特性确保了系统的互操作性和可靠性。通过理解RabbitMQ和AMQP的核心概念,可以更好地设计和实现分布式系统中的消息通信模式。
在实际应用中,合理利用RabbitMQ的Exchange类型、队列特性和消息确认机制,可以构建高可用、高可靠的消息系统,实现系统解耦、负载均衡和流量削峰等目标。