RabbitMQ本身是一个消息队列,先介绍下消息队列。
什么是消息队列
消息队列(Message Queue)是在消息的传输过程中保存消息的容器。消息队列提供了一种在应用之间异步通信的方法。这意味着发送者和接收者不需要同时处理消息。发送者可以将消息添加到队列中,然后继续处理其他任务,而不需要等待接收者收到并处理消息。
当然,消息队列也提供了一种消息持久性的工具,即使处理消息的进程崩溃,消息也不会丢失,因为它存储在队列中,直到接收者明确的通知消息队列,该消息已被处理和删除。此外,消息队列也可以处理大流量的请求,通过消息队列作为缓冲,可以平衡系统的处理负载。一些常见的消息队列软件有RabbitMQ、Kafka等。
为什么使用消息队列
-
解耦:在系统设计中,各个微服务之间通过消息队列进行通信,可以减少直接的依赖关系,使各个微服务能够独立开发和部署。
-
异步性:消息队列提供了异步处理机制,可以将非即时性的任务(比如发送短信,发送邮件等等)放入消息队列,提高系统的响应速度。
-
削峰填谷:在高并发的业务情况下,直接让所有请求打到服务器上可能会让服务器崩溃,通过消息队列可以平滑处理这些请求,达到削峰填谷的效果。
-
可恢复性:当处理消息的任务失败时,可以将消息再次放回队列中,等待再次处理。
-
顺序保证:在大多数消息队列中,消息是按到达顺序处理的。这对于需要保证顺序的操作非常有用。
-
缓冲:可以将消息队列用作缓冲区,处理来自其他服务的数据,以便在需要时使用。
-
扩展性:添加到队列中的工作项可以由任何数量的接收者处理,允许动态增加处理资源来处理队列中的工作负载。
-
数据安全:大部分消息队列提供了数据持久化的功能,即使系统崩溃,数据也不会丢失。
RabbitMQ与ActiveMQ对比
RabbitMQ | ActiveMQ | |
消息模型 | RabbitMQ的核心概念是 "exchanges" 和 "bindings"。生产者将消息发送到exchange,然后exchange根据规则将消息路由到一个或多个队列。这种模型提供了非常灵活的路由规则。 | ActiveMQ的模型相对要简单些,有两种模式:队列模式和主题模式。前者是点对点的模型,后者是发布/订阅的模型。 |
消息协议 | RabbitMQ最初是实现AMQP(高级消息队列协议)的,后来也支持STOMP, MQTT和HTTP等其他协议。 | ActiveMQ主要支持JMS(Java消息服务)协议,也支持STOMP和AMQP。 |
可靠性 | RabbitMQ和ActiveMQ都提供了消息持久化、消息确认、高可用(集群)等机制来确保消息的可靠性。 | |
性能 | RabbitMQ和ActiveMQ的性能都非常优秀,具有很高的吞吐量和低延迟。但在大多数常见的使用场景下,RabbitMQ的性能通常可能会优于ActiveMQ。 | |
社区支持 | RabbitMQ由Pivotal(Spring的母公司)支持,社区活跃,更新迭代频繁。 | ActiveMQ是Apache的项目,社区也相对活跃,但近几年更新迭代不如RabbitMQ频繁。 |
语言支持 | RabbitMQ客户端支持多种语言,如Java,.NET,Erlang等。 | ActiveMQ主要面向Java语言,但也有.NET,python等语言的客户端。 |
易用性 | RabbitMQ的安装和配置相对简单,管理界面友好,方便进行操作和监控。 | ActiveMQ的配置相对较为复杂,但提供了JMX来进行远程管理和监控。 |
总体来说,RabbitMQ更强大和灵活。
RabbitMQ的组成部分
- Broker:消息队列服务进程。此进程包括两个部分:Exchange和Queue。
- Exchange:消息队列交换机。按一定的规则将消息路由转发到某个队列。
- Queue:消息队列,存储消息的队列。
- Producer:消息生产者。生产方客户端将消息同交换机路由发送到队列中。
- Consumer:消息消费者。消费队列中存储的消息。
RabbitMQ的工作流程
- 消息生产者连接到RabbitMQ Broker,创建connection,开启channel。
- 生产者声明交换机类型、名称、是否持久化等。
- 生产者发送消息,并指定消息是否持久化等属性和routing key。
- exchange收到消息之后,根据routing key路由到跟当前交换机绑定的相匹配的队列里面。
- 消费者监听接收到消息之后开始业务处理。
参考:
超详细的RabbitMQ入门,看这篇就够了!-阿里云开发者社区 (aliyun.com) (基本都是这里的内容,文本为个人学习笔记,所以Ctrl+C、V的比较多,大佬们勿喷)