作者:kg9854997 | 来源:互联网 | 2023-07-20 14:05
消息队列是分布式系统中重要的组件,主要实现了:异步消息,应用解耦,流量控制等功能。
应用场景
1.异步处理
以注册用户为例,
假设用户注册需要发送注册邮件,发送短信及数据入库
用户注册后 首先进行数据入库,入库后的两个操作通常有并行与串行两种执行方
式
1.串行:两个功能顺序执行,先发邮件后发短信,或先发短信后发邮件
2.并行:发短信和发邮箱两个功能同时异步执行,以上三个任务完成后,返回给客户端。
假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。
优化:
引入消息队列,将不是必须要的业务逻辑,入消息队列异步处理

优化后用户请求的响应时间降低为55ms
2.应用解耦
以电商下单为例
用户下单后,订单系统通知库存系统,对库存进行操作,传统的做法是订单系统调用库存系统的接口完成操作

传统做法的缺点:
1)两系统之间存在耦合
2)若库存系统出现异常,将会导致订单系统同时出现异常,导致本次订单失效
引入消息队列

此时订单系统工作为:订单系统完成本职功能后,将此消息写入消息队列,即可返回下单成功
此时库存系统工作:订阅下单的消息信道,从信道中获取下单消息,进行库存操作
此时若库存系统发生故障,将不会影响到订单系统功能,订单系统照样可以接受用户下单,因为系统的解耦,订单系统只关心自己的业务,订单写入消息队列后的后续操作订单系统就不用再关心了
3.削峰填谷
以秒杀活动为例
秒杀活动的特点是短时流量暴增,导致服务器无法处理大量请求,引发响应过慢或服务宕机(一般影响最大的是mysql)
引入消息队列
1)缓解数据库压力,可将大量数据库的写操作入消息队列,消息队列再以数据库能接受的流量控制访问数据库(假设数据库每秒能处理100条SQL,秒杀期间每秒进入1000条SQL,活动期间的SQL请求大量堆积在消息队列中(削峰),消息队列再以100条每秒的流量访问数据库,待秒杀结束后流量恢复正常每秒10条,此时消息队列仍以每秒100条的流量向数据库请求(填谷))
2)控制请求数量

用户的请求被接收后,先入消息队列,假设请求数量达到预设最大值,则抛弃掉后续进来的请求