一、RabbitMQ相关概念:
支持的语言:
- Java
- Python
- .NET (C#)
- JavaScript (Node.js)
- Ruby
- PHP
- Go
- Erlang
- Elixir
- Rust
核心概念
- 消息(Message):用于在应用程序之间传递的数据单元。
- 生产者(Producer):发送消息的应用程序。
- 消费者(Consumer):接收和处理消息的应用程序。
- 队列(Queue):用于存储消息的缓冲区。
- 交换器(Exchange):接收来自生产者的消息,并将其路由到队列。
- 绑定(Binding):定义交换器和队列之间的关联规则。
工作流程:
- 生产者将消息发送到交换器。
- 交换器根据预定义的路由规则将消息路由到一个或多个队列。
- 消费者订阅并从队列中接收消息。
- 消费者处理消息并发送确认(ACK)给 RabbitMQ。
- RabbitMQ 在收到确认后删除队列中的消息。
特点:
- 可靠性:RabbitMQ 提供持久化消息、消息确认和消息重试等机制,确保消息的可靠传递。
- 高扩展性:RabbitMQ 支持分布式部署,可以通过添加多个节点来实现高吞吐量和可用性。比如 STOMP、MQTT 等等。
- 多种协议支持:RabbitMQ 支持多种消息传递协议,如 AMQP、STOMP、MQTT 等。
- 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
- 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
二、rabbitmq使用场景:
-
异步通信:RabbitMQ 可以作为消息队列在分布式系统中实现异步通信,将耗时的任务从主应用程序解耦出来,提高系统的吞吐量和响应性能。
-
应用解耦:通过使用 RabbitMQ,不同的应用程序可以通过消息传递进行通信,实现解耦和松耦合的架构。这样,一个应用程序的变更不会直接影响其他应用程序的运行。
-
负载均衡:多个消费者可以订阅同一个队列,并共享消息的处理负载。这样可以实现负载均衡和水平扩展,确保系统在高负载时仍然能够高效处理消息。
-
日志处理:RabbitMQ 可以用于日志收集和处理。应用程序可以将日志消息发送到 RabbitMQ 中的队列,然后由消费者进行处理、存储或者进一步处理。
-
微服务架构:RabbitMQ 可以作为微服务架构中的消息总线,用于实现不同微服务之间的通信和协调。
三、rabbitmq的消息确认机制:
消息确认机制是 RabbitMQ 提供的一种保证消息可靠传递的机制。当消费者从队列中接收到消息后,可以通过发送确认(ACK)的方式告知 RabbitMQ 消息已经被成功处理。如果消费者在处理消息时发生错误或失败,消息可以重新放回队列或者交由其他消费者处理,以确保消息不会丢失。
包括发送消息确认和消费消息确认;
RabbitMQ 提供了消息确认机制,用于确保消息在传递过程中的可靠性。这个机制包括两个关键概念:消息确认(ACK)和消息拒绝(NACK)。
当消费者从队列中接收到消息时,它可以向 RabbitMQ 发送确认消息(ACK),表示消息已经成功处理。RabbitMQ 在接收到确认消息后,会将该消息从队列中删除。这样可以确保消息不会被重复处理。
消息确认机制的工作流程如下:
- 消费者从队列中接收到消息。
- 消费者处理消息,确保消息被成功处理。
- 消费者向 RabbitMQ 发送确认消息(ACK)。
- RabbitMQ 收到确认消息后,将消息从队列中删除。
如果消费者在处理消息时发生错误或失败,可以选择拒绝消息。消费者可以向 RabbitMQ 发送拒绝消息(NACK)来表示消息处理失败。RabbitMQ 收到拒绝消息后,可以根据配置的策略将消息重新放回队列,或者将消息发送到备份交换器(备份交换器是一种配置在主交换器之后的交换器,用于处理被拒绝的消息)。
消息确认机制的优点包括:
-
可靠性:通过消息确认机制,消费者可以确保消息被成功处理,避免消息的丢失和重复处理。
-
顺序性:消息确认机制可以确保消息按照正确的顺序进行处理。当消费者确认一条消息后,RabbitMQ 才会将下一条消息发送给该消费者。
要使用消息确认机制,需要注意以下几点:
-
需要手动发送确认消息:在消费者代码中,需要显式地发送确认消息(ACK)或拒绝消息(NACK)给 RabbitMQ。这样可以确保消息的处理状态被正确反馈给 RabbitMQ。
-
手动确认模式和自动确认模式:RabbitMQ 提供了手动确认模式和自动确认模式两种选择。在手动确认模式下,消费者需要显式地发送确认消息;而在自动确认模式下,RabbitMQ 会自动将消息视为已确认,不需要消费者发送确认消息。在需要精确控制消息确认的情况下,手动确认模式更为常用。
四、消息丢失问题
消息丢失问题是指在消息传递过程中可能发生的消息丢失情况。为了尽量避免消息丢失,可以采取以下措施:
-
持久化:将消息和队列设置为持久化,以确保在 RabbitMQ 服务器出现故障时消息不会丢失。
-
消息确认:消费者在处理完消息后发送确认(ACK)给 RabbitMQ,告知消息已经成功处理,避免消息重复传递。
-
发送方重试:发送方可以在发送消息时实现重试机制,以确保消息能够成功到达 RabbitMQ。
-
正确的消息路由:通过合理的交换器和绑定规则,将消息正确地路由到目标队列,避免消息被丢弃或者传递到错误的位置。
尽管 RabbitMQ 提供了这些机制来尽量避免消息丢失,但在极端情况下,仍然存在消息丢失的可能性。因此,在设计应用程序时,需要综合考虑消息的可靠性要求,并采取适当的措施来最小化消息丢失的风险。
五、RabbitMQ交换器类型
RabbitMQ 提供了不同类型的交换器(Exchange),用于定义消息的路由规则和分发策略。下面是 RabbitMQ 中常见的交换器类型:
-
直连(定向)交换器(Direct Exchange):直连交换器是最简单的交换器类型。它根据消息的路由键(Routing Key)将消息直接发送到绑定了相同路由键的队列中。
-
主题交换器(Topic Exchange):主题交换器根据消息的路由键进行模式匹配,并将消息发送到符合匹配规则的队列中。主题交换器使用通配符进行匹配,可以实现更灵活的消息路由。
-
扇形(广播)交换器(Fanout Exchange):扇形交换器将消息广播到所有绑定到该交换器的队列中。它忽略了消息的路由键,只需关注交换器和队列的绑定关系。
-
头交换器(Headers Exchange):头交换器使用消息的头部属性(Header)进行匹配,并将消息发送到匹配成功的队列中。头交换器不依赖于路由键,而是根据消息头部属性的匹配情况进行路由。
-
扩展交换器(Custom Exchanges):RabbitMQ 还允许自定义交换器类型。通过自定义交换器类型,可以实现更加灵活和复杂的消息路由策略。
在创建交换器时,需要指定交换器的名称、类型和其他可选参数。然后,将交换器绑定到队列上,以建立消息的路由规则。消费者可以根据需要绑定到指定的交换器和队列上,以接收和处理消息。
交换器类型的选择取决于具体的应用场景和消息路由的需求。不同的交换器;
六、配置服务端
在RabbitMQ的gitHub项目中,下载window版本的服务端安装包。
接着到双击安装,一直点下一步安装即可,安装完成后,找到安装目录;
在此目录下打开cmd命令,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件:
然后双击rabbitmq-server.bat启动脚本,然后打开服务管理可以看到RabbitMQ正在运行:
打开浏览器输入http://localhost:15672,账号密码默认是:guest/guest