1、RabbitMQ是什么
RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。”(引自百度百科)
常用的消息队列有RabbitMQ、RocketMQ等等,下面是它们的对比图:
图片来源:https://www.cnblogs.com/fanBlog/p/12201472.html
换句话说,RabbitMQ是一个开源的消息队列中间件,它实现了高级消息队列协议(AMQP),可以在分布式系统中进行消息传递、异步通信和解耦。RabbitMQ是一个可靠、高效、可扩展的消息代理,可以用于构建高可用、高性能、可伸缩的应用程序。
官网地址:RabbitMQ: easy to use, flexible messaging and streaming — RabbitMQ
2、RabbitMQ的核心概念
-
消息:RabbitMQ中的消息是指要传递的数据,通常是一个字符串或者二进制数据。消息可以包含一些元数据,例如消息ID、时间戳、优先级等。
-
队列:队列是RabbitMQ中存储消息的地方。生产者将消息发送到队列中,消费者从队列中获取消息并进行处理。
-
消息队列(Message Queue):是将需要传输的数据(消息)与队列进行绑定,用队列先进先出机制来实现消息传递。消息队列由 生产者 和 消费者 两部分构成:
-
生产者主要负责产生消息并把消息放入队列中,再由消费者去处理。
-
消费者可以到指定队列中获取消息,或者订阅相应的队列,最后由MQ服务端进行消息推送。
-
-
交换机:交换机是消息的路由中心,它接收从生产者发来的消息,并根据路由规则将消息发送到一个或多个队列中。RabbitMQ支持多种类型的交换机,例如直连交换机、主题交换机、头交换机和扇形交换机。
-
绑定:绑定是交换机和队列之间的关系,它定义了消息从交换机路由到哪个队列中。一个交换机可以绑定多个队列,一个队列也可以被多个交换机绑定。
-
生产者:生产者是消息的发送方,它将消息发送到交换机或者队列中。
-
消费者:消费者是消息的接收方,它从队列中获取消息并进行处理。
生产者、消费者模型-mq的原理,举例
3、RabbitMQ的工作模型
图片来源:【精选】RabbitMQ(一)、基础篇_rabbitmq 5.7.3_普通人zzz~的博客-CSDN博客
4、RabbitMQ的优缺点
优点:
-
可靠性高:RabbitMQ支持持久化消息,即使在消息代理宕机时也能保证消息不会丢失。
-
灵活的路由:RabbitMQ支持多种类型的交换机和路由规则,可以根据业务需求进行灵活配置。
-
高可用性:RabbitMQ支持集群部署,可以实现高可用性和负载均衡。
-
多语言支持:RabbitMQ提供了多种客户端库,支持多种编程语言,例如Java、Python、Ruby等。
-
易于扩展:RabbitMQ可以通过添加节点和集群扩展来满足不同规模的应用需求。
缺点:
-
性能限制:RabbitMQ虽然支持高并发和高吞吐量的消息传递,但是在处理大量消息时,性能会受到限制。这是因为RabbitMQ需要频繁地进行磁盘IO操作,而磁盘IO是相对较慢的,会影响消息传递的速度。
-
配置复杂:RabbitMQ的配置相对来说比较复杂,需要了解交换机、队列、绑定等多个概念,并进行相应的配置。这对于初学者来说可能会增加一定的学习成本。
-
存储占用空间:由于RabbitMQ支持持久化消息,所以它需要占用一定的存储空间来存储消息。如果消息量很大,存储空间的占用也会相应增加。
-
不支持动态扩容:在RabbitMQ集群中,节点的数量是固定的,无法动态扩容。如果需要扩容,需要手动添加新节点,并进行相应的配置。
-
数据处理一致性问题
5、RabbitMQ的应用场景
-
异步任务处理:当系统需要处理一些耗时的任务时,可以使用RabbitMQ来实现异步任务处理。生产者将任务消息发送到RabbitMQ中,消费者从队列中获取任务消息并进行处理,这样可以避免任务阻塞主线程,提高系统的响应速度和并发能力。
-
分布式系统解耦:在一个复杂的分布式系统中,不同的模块之间可能存在依赖关系,使用RabbitMQ可以实现模块之间的解耦。模块之间通过发送和接收消息进行通信,不直接调用对方的接口,从而降低模块之间的耦合性,提高系统的可维护性和扩展性。
-
日志收集和分发:在分布式系统中,日志的收集和分发是一个重要的任务。通过将日志消息发送到RabbitMQ中,可以实现日志的集中存储和分发。消费者可以订阅感兴趣的日志消息,并将其存储到数据库或者发送到其他系统进行进一步处理。
-
消息通知和推送:当系统需要向用户发送通知或者推送消息时,可以使用RabbitMQ来实现消息的异步发送。生产者将消息发送到RabbitMQ中,消费者从队列中获取消息并进行推送,可以实现高效、可靠的消息通知和推送功能。
-
应用解耦和水平扩展:当系统需要进行水平扩展时,可以使用RabbitMQ来实现应用的解耦和负载均衡。多个相同的消费者可以同时从队列中获取消息进行处理,从而提高系统的吞吐量和可伸缩性。
6、⭐RabbitMQ的作用
6.1 削峰
在高并发场景下,流量突然增加会导致系统负载过高,甚至出现宕机等问题。使用RabbitMQ可以将请求分散到不同的消息队列中,通过设置队列的最大长度、超时时间等参数,实现流量控制和削峰的效果。
6.2 解耦
在分布式系统中,各个模块之间需要进行通信,但是直接依赖会导致系统的耦合度过高。使用RabbitMQ可以将不同模块之间的通信通过消息队列进行解耦,每个模块只需要关注自己需要的消息即可,从而提高了系统的灵活性和可维护性。
6.3 异步
在某些场景下,处理某些任务需要较长的时间,如果采用同步方式,会导致请求阻塞,降低系统的性能。使用RabbitMQ可以将任务放入消息队列中,异步地进行处理,从而提高了系统的并发性和吞吐量。
7、⭐安装RabbitMQ的docker容器
7.1 查询并拉取rabbitmq镜像
docker search rabbitmq
docker pull rabbitmq
7.2 创建rabbitmq数据存储文件夹data
7.3 创建运行容器
7.4 开放防火墙端口
7.5 进入rabbitmq容器
输入以下命令:
7.6 重启rabbitmq容器
7.7 访问浏览器管理页面
7.8 浏览器channel的异常和解决方案
测试,可正常访问
小结
总之,RabbitMQ是一款功能强大、可靠性高、易于使用和扩展的消息队列中间件,适合用于构建分布式系统中的异步通信和解耦。
参考:
https://baijiahao.baidu.com/s?id=1697221448518195951&wfr=spider&for=pc
绝对详细的 RabbitMQ入门,看完本系列就够了(一) - 知乎【精选】RabbitMQ(一)、基础篇_rabbitmq 5.7.3_普通人zzz~的博客-CSDN博客绝对详细的 RabbitMQ入门,看完本系列就够了(一) - 知乎
https://www.cnblogs.com/fanBlog/p/12201472.html
感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!