RabbitMQ 是一个功能强大的开源消息中间件,采用 AMQP(Advanced Message Queuing Protocol)协议来实现可靠的消息传递。它提供了可靠性、灵活性和可扩展性,被广泛应用于分布式系统、微服务架构和异步通信等场景。本文将介绍 RabbitMQ 的概念、特性和原理,帮助读者全面了解这一强大的消息中间件。
以下是官网上消息模式:
总结一下可以分为生产者直接发送到Queue与生产者通过路由再到Queue。
在 RabbitMQ 中,有几种不同类型的交换器可用,包括直接交换器(direct exchange)、主题交换器(topic exchange)和扇形交换器(fanout exchange)不同类型的交换器使用不同的路由规则。
以下是 RabbitMQ 中常见的几种路由机制:
直接交换器(Direct Exchange): 直接交换器是最简单的交换器类型,它将消息路由到与消息中的路由键(routing key)完全匹配的队列。在创建绑定时,需要指定队列和交换器之间的路由键。
主题交换器(Topic Exchange): 主题交换器根据通配符匹配规则将消息路由到一个或多个队列。通配符可以使用 *(匹配一个单词)和 #(匹配零个或多个单词)。生产者在发送消息时指定一个路由键,交换器根据绑定的路由键和主题规则将消息路由到相应的队列。
扇形交换器(Fanout Exchange): 扇形交换器将消息广播到所有绑定到该交换器的队列中。它忽略路由键,只需将消息发送到与交换器绑定的所有队列即可。Fanout Exchange也就是我们通常说的广播或者发布与订阅模式。
路由机制的选择取决于应用程序的需求和消息的路由策略。通过合理使用交换器和绑定,可以灵活地进行消息路由和分发。
在 RabbitMQ 中,消息的应答(acknowledgment)机制用于确保消息的可靠传递和处理。应答机制涉及两个角色:生产者和消费者。
生产者发布消息到 RabbitMQ 之后,可以选择等待消费者的应答来确认消息是否被成功接收和处理。消费者在接收和处理消息后,会发送一个应答给 RabbitMQ,告知消息已经被处理完成。
// 手动发送应答
channel.basicAck(envelope.getDeliveryTag(), false);
System.out.println("Acknowledged message: " + message);
在 RabbitMQ 中,消息的有序性是相对于每个队列而言的,而不是整个 RabbitMQ 的消息流。RabbitMQ 保证在单个队列中消息的有序性,即按照消息的顺序进行投递和消费。
当生产者将消息发送到队列时,RabbitMQ 会按照先进先出(FIFO)的顺序进行排列。消费者从队列中获取消息时,也会按照相同的顺序接收消息。
在 RabbitMQ 中,可以使用事务来确保消息的可靠性传递。事务提供了一种机制,可以将一组操作作为一个原子单元进行提交或回滚,从而保证消息的完整性。
使用事务的步骤如下:
在 RabbitMQ 中,消息持久化是一种机制,确保消息在发生异常或服务器故障时不会丢失。通过将消息和队列设置为持久化,可以在 RabbitMQ 重新启动后仍然保留消息。
要实现消息持久化,需要考虑以下两个方面:
队列持久化: 在声明队列时,通过设置 durable 参数为 true 来将队列标记为持久化队列。例如:
channel.queueDeclare("my_queue", true, false, false, null);
消息持久化: 在发布消息时,通过设置 BasicProperties 的 deliveryMode 属性为 2,将消息标记为持久化消息。例如:
AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()
.deliveryMode(2) // 持久化消息
.build();
channel.basicPublish("", "my_queue", properties, message.getBytes());
安装指南:
https://www.rabbitmq.com/download.html