扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
首先来聊一聊什么是消息中间件,以及消息中间件能帮助我们解决什么问题。 消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统,简单来说,消息中间件能够为我们的系统提供异步处理能力。 举个例子,某个系统在使用之前需要用户进行注册,用户在完成注册后需要发送短信和邮件提醒用户注册成功,如果按照同步的流程走,它应该是这样的:
凭借整站使用H5高端网站建设的创新体验、定制设计、设计团队积累与透明式的服务过程,符合行业特点,专属顾问根据企业产品,消费群体属性,准确定位;设计师以目标客户为中心,以突出品牌官网特性为宗旨,定制专属网站建设设计方案。但这样有一个问题,当用户注册成功后,我们需要等待系统发送完短信和邮件后再让用户执行下一个流程吗?其实是不需要的,用户注册成功后完全可以让其直接进入下一个流程,而发送短信和发送邮件的操作可以进行异步处理:
将这两个操作分为两个异步任务去执行,虽然提高了整体的执行效率,但用户仍然要等待两个操作中耗时最长的那个操作结束,因此,我们可以引入消息中间件:
此时用户只需要等待系统将消息放入消息中间件,至于发送短信和邮件,将由消息中间件自动完成,这样将大大提高注册的效率,提升用户体验。 消息中间件的功能远不止如此,它还能够实现应用解耦,举个例子,某电商系统在用户提交了一份订单后,订单服务会调用库存服务提供的接口进行减库存的操作,如下所示:
那么这两个服务就存在着耦合性,当库存服务的接口发生了变化,则订单服务就必须立马修改代码,否则程序都不能正常运行了,若想解决这个问题,就可以在服务中间加一个消息中间件,订单服务只需将消息写入中间件,并由库存服务去订阅这个消息即可,如下所示:
消息中间件还能够用来实现流量控制,比如非常熟悉的秒杀业务,当秒杀活动开始时的流量是非常巨大的,为了防止大量的请求直接压垮系统,可以将它们按顺序写入消息队列,再由系统慢慢地去获取请求进行处理:
什么是RabbitMQ?为什么使用RabbitMQ?
采用AMQP高级消息队列协议的一种消息队列技术,大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦
可以用它来:解耦、异步、削峰。
为什么要使用rabbitmq?
在分布式系统下具备异步,削峰,负载均衡等一系列高级功能
拥有持久化的机制,进程消息,队列中的信息也可以保存下来
实现消费者和生产者之间的解耦
对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定量的限流,利于数据库的操作
可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单
使用rabbitmq的场景
服务间异步通信
顺序消费
定时任务
请求削峰
组件介绍
Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线,保证数据能按照指定的方式进行传输,
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息的载体,每个消息都会被投到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序.
Consumer:消息消费者,就是接受消息的程序.
Channel:消息通道,在客户端的每个连接里,可建立多个channel.
消息发布和接收流程
如何发送消息
生产者和Broker建立TCP连接
生产者和Broker建立通道
生产者通过通道消息发送给Broker,由Exchange将消息进行转发
Exchange将消息转发到止跌那个的Queue(队列)
如何接收消息
消费者和Broker建立TCP连接
消费者和Broker建立通道
消费者监听制定的Queue(队列)
当有消息到达Queue时Broker默认将消息推送给消费者
消费者接受到消
七种模式介绍与应用场景
1.简单模式
做最简单的事情,一个生产者对应一个消费者,RabbitMQ相当于一个消息代理,负责将A的消息转发给B 。
应用场景: 将发送的电子邮件放到消息队列,然后邮件服务在队列中获取邮件并发送给收件人
2.工作队列模式
在多个消费者之间分配任务(竞争的消费者模式),一个生产者对应多个消费者,一般适用于执行资源密集型任务,单个消费者处理不过来,需要多个消费者进行处理 应用场景: 一个订单的处理需要10s,有多个订单可以同时放到消息队列,然后让多个消费者同时处理,这样就是并行了,而不是单个消费者的串行情况
3.订阅模式
一次向许多消费者发送消息,一个生产者发送的消息会被多个消费者获取,也就是将消息将广播到所有的消费者中。
应用场景: 更新商品库存后需要通知多个缓存和多个数据库,这里的结构应该是:
一个fanout类型交换机扇出两个个消息队列,分别为缓存消息队列、数据库消息队列
一个缓存消息队列对应着多个缓存消费者
一个数据库消息队列对应着多个数据库消费者
4.路由模式
有选择地(Routing key)接收消息,发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key,仅消费指定路由key的消息
应用场景: 如在商品库存中增加了1台iphone12,iphone12促销活动消费者指定routing key为iphone12,只有此促销活动会接收到消息,其它促销活动不关心也不会消费此routing key的消息
5.主题模式
根据主题(Topics)来接收消息,将路由key和某模式进行匹配,此时队列需要绑定在一个模式上,#匹配一个词或多个词,*只匹配一个词。
应用场景: 同上,iphone促销活动可以接收主题为iphone的消息,如iphone12、iphone13等
6.远程过程调用
如果我们需要在远程计算机上运行功能并等待结果就可以使用RPC,具体流程可以看图。应用场景:需要等待接口返回数据,如订单支付 7.发布者确认
与发布者进行可靠的发布确认,发布者确认是RabbitMQ扩展,可以实现可靠的发布。在通道上启用发布者确认后,RabbitMQ将异步确认发送者发布的消息,这意味着它们已在服务器端处理。(搜索公众号Java知音,回复“2021”,送你一份Java面试题宝典)
应用场景: 对于消息可靠性要求较高,比如钱包扣款
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流