消息队列 原理剖析

什么是消息队列?

​​消息队列是一种用来存储消息的队列。

消息队列能用来做什么?

1、消息或任务的延迟处理。

2、在复杂的业务场景下给系统减压。

3、提示用户体验感,增强用户体验。

4、敏感操作高安全环境处理。

场景举例1:用户注册

有一个用户注册场景,要求用户注册成功后会主动为用户推送  注册成功的欢迎短信  和  注册成功的欢迎邮件信息。

分析业务场景,用户注册成功后,针对用户来说,给的欢迎短信和欢迎邮件,是不用立即给用户推送的。能达到做延迟推送的处理

现架构师这样设计

用户注册接口由  用户中心  实现,

消息推送由 消息中心 实现

当用户注册成功后,由 用户中心 会在系统发起一个事件 - 用户注册成功事件。而在系统设计时,设计 消息中心 监听 用户中心 关于用户注册成功事件 的发生,当 用户注册成功事件 发生后,消息中心从事件对象中捕获用户对象,执行消息推送工作,即是短信和邮件信息推送。

因网站 qps 指标较高(单位时间内访问的流量很大),所以要在全局做性能优化处理。考虑到用户注册流程中短信推送和邮件信息推送比较耗时(第三方 接口使用),且满足延迟推送的业务场景。

之后改流程设计,将注册成功的  短信 和 邮箱 欢迎信息推送改为队列推送,减少接口即时处理的工作压力。达到性能提升的目的。

队列运行原理图

 

由上图可知,当程序执行到相关位置后 消息中心 向队列消息模型推送消息队列任务(发起者推送),等待 消费者 的执行处理

场景举例2 :银行资金流转

银行提现业务场景,我们常见微信提现,支付宝提现,银行卡互相转账。均会给你提示“2小时以内到账”,其中的核心技术即是采用了 消息队列 以及 分布式事务技术

为什么银行也需要采用消息队列来处理转账?

1、银行内部需要完全保证核心数据库的压力。使用消息队列后可以为数据库减压,避免即时转账因高迸发导致的数据库 死锁,内存溢出,连接数耗尽,iops性能指标耗尽 等

2、跨行转账 或是 系统设计为分布式系统时,分布式事务的使用有足够的时间进行事务补偿(转账失败时的资金回滚)

3、转账操作是复杂的,流程上  数据通信 加密/解密,安全效验,账户效验,账户加锁互相转账,日志流水,消息通知等等一系列的流程,平均耗时一次转账请求耗时2-5秒,如果不做队列消息,一旦遇到 cc攻击、ddos攻击等 会直接把服务器的稳定性压垮,从而导致 雪崩效应 其它服务 因转账业务占满了系统资源也无法正常提供访问。

消息队列的特性

1、消息队列的本质是线性执行,先进先出,后进后出。

2、消费的性能优化:在设计上我们也可以参考食堂打饭的流程,开启一个消息消费进程,就相当于开启了一个打饭窗口。一个打饭窗口的处理速度不行时,我们就多开几个消息消费进程,就相当于多开了几个打饭窗口,这样处理速度就起来了。

3、需要注意的点,消息队列在设计时应考虑到加入任务失败重试的机制(举例:因某刻数据库连接超时,导致无法进行的任务回滚,此时此任务应加入到重试队列,可配置反复3次均是失败时才删掉该队列的执行)。所以在制作消息队列对象时,要考虑任务执行时的 幂等性

总结

消息队列是一个很好的设计,为我们提供了更多的方案去处理不同的业务场景,追求用户体验。还有其它很多的场景案例不一一举例,掌握消息队列的核心就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值