电商系统引发的思考:
优势一:服务解耦 个业务需要多个模块共同实现,或者一条消息有多个系统需要对应处理,只需要主业务完成以后,发送一条MQ,其余模块消费MQ消息,即可实现业务,降低模块之间的耦合。
优势二:性能提升。通过异步调用,主业务执行结束后,从属业务可以通过MQ进行异步执行,降低了业务的响应时间,提高了系统的吞吐量和整体性能。这样能够有效解决因调用链过长导致的响应时间过长问题,提升了用户体验。
三:由于异步调用的实现,服务之间没有强依赖关系,一个服务的故障不会立即影响其他服务,降低了级联失败的风险。这有助于增强系统的稳定性和容错能力。
优势四:流量削峰。在高并发情况下,通过异步处理业务,可以有效地分散和平衡系统负载,避免服务提供者因高并发请求而瘫痪。同时,这也有助于系统应对突发的流量峰值,提高系统的整体稳定性和容错能力。
MQ(Message Queue)
MQ(Message Queue)消息队列,是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。 我们把要传输的数据(消息)放在队列中,用队列机制来实现消息传递——生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由MQ服务端给其推送消息。用于上下游传递消息。 在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。
实现MQ的大致有两种主流方式:AMQP
、JMS
该服务接口限定了必须使用Java语言,并定义了统一的接口来进行消息操作的统一管理。
由于AMQP仅仅是一个协议,并不规定具体的实现方式,因此它具有跨语言的特性。
消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统。
出身:诞生于金融行业的消息队列
开发语言:erlang
协议:AMQP
(Advanced Message Queuing Protocol 高级消息队列协议)
官网:
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,该消息队列在分布式系统开发中应用非常广泛
● 由于 erlang 语言的高并发特性,性能较好;吞吐量到万级,
● MQ 功能比较完备,健壮、稳定、易用、跨平台、支持多种语言 如:Python、Ruby、.NET
、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持 AJAX
● 文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高;
拉取最新的rabbitmq的镜像
docker pull rabbitmq
拉取指定版本的rabbitmq镜像
docker pull rabbitmq:版本号
创建容器
docker run -d -p 5672:5672 -p 15672:15672 --restart=always --name env_rabbitmq
打开浏览器,输入 虚拟机ip:15672 ,是可以看到一个后台管理界面 ,默认用户名和密码为: guest
创建SpringBoot项目为demo-rabbitmq修改pom.xml,导入依赖
修改全局配置文件application.yml文件
只有一个生产者、一个消费者和一个队列。生产者和消费者在发送和接收消息时,只需要指定队列名,而不需要指定发送到哪个 Exchange,RabbitMQ服务器会自动使用Virtual host的默认的Exchange,默认Exchange的type为direct。
在simple模式下只有一个生产者和消费者,当生产者生产消息的速度大于消费者的消费速度时,我们可以添加一个或多个消费者来加快消费速度,这种在simple模式下增加消费者的模式,称为work模式,可以有多个消费者,但一条消息只能被一个消费者获取。
如下图所示:
work模式可以将消息转到多个消费者,但每条消息只能由一个消费者获取,如果我们想一条消息可以同时给多个消费者消费呢?这时候就需要发布/订阅模式,其示意图如下所示:
生产者将消息不是直接发送到队列,而是发送到X交换机,然后由交换机发送给两个队列,两个消费者各自监听一个队列,来消费消息
发布/订阅模式中,Echange的type为fanout。相关场景:邮件群发,群聊天,广播(广告)
前面几种模式,消息的目标队列无法由生产者指定,而在路由模式下,消息的目标队列,可以由生产者指定,其示意图如下所示:
路由模式下Exchange的type为direct。
消息的目标队列可以由生产者按照RoutingKey规则指定。
消费者通过Binding Key绑定自己所关心的队列。
条消息队可以被多个消息者获取。
只有Routing Key与Biding Key相匹配的队列才会收到消息
RoutingKey用于生产者指定Exchange最终将消息路由到哪个队列,BindingKey用于消费者绑定到某个队列
主题模式是在路由模式的基础上,将路由键和某模式进行匹配。示意图如下所示:
其中#表示匹配多个词
主题模式Exchange的type取值为topic.
"表示匹配一个词
消费者可以通过某种模式的BindKey来达到订阅某个主题消息的目的
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有