什么是消息队列?
消息队列是一种用来存储消息的队列。
消息队列能用来做什么?
1、消息或任务的延迟处理。
2、在复杂的业务场景下给系统减压。
3、提示用户体验感,增强用户体验。
4、敏感操作高安全环境处理。
场景举例1:用户注册
有一个用户注册场景,要求用户注册成功后会主动为用户推送 注册成功的欢迎短信 和 注册成功的欢迎邮件信息。
分析业务场景,用户注册成功后,针对用户来说,给的欢迎短信和欢迎邮件,是不用立即给用户推送的。能达到做延迟推送的处理
现架构师这样设计
用户注册接口由 用户中心 实现,
消息推送由 消息中心 实现
当用户注册成功后,由 用户中心 会在系统发起一个事件 - 用户注册成功事件。而在系统设计时,设计 消息中心 监听 用户中心 关于用户注册成功事件 的发生,当 用户注册成功事件 发生后,消息中心从事件对象中捕获用户对象,执行消息推送工作,即是短信和邮件信息推送。
因网站 qps 指标较高(单位时间内访问的流量很大),所以要在全局做性能优化处理。考虑到用户注册流程中短信推送和邮件信息推送比较耗时(第三方 接口使用),且满足延迟推送的业务场景。
之后改流程设计,将注册成功的 短信 和 邮箱 欢迎信息推送改为队列推送,减少接口即时处理的工作压力。达到性能提升的目的。
队列运行原理图
由上图可知,当程序执行到相关位置后 消息中心 向队列消息模型推送消息队列任务(发起者推送),等待 消费者 的执行处理
场景举例2 :银行资金流转
银行提现业务场景,我们常见微信提现,支付宝提现,银行卡互相转账。均会给你提示“2小时以内到账”,其中的核心技术即是采用了 消息队列 以及 分布式事务技术
为什么银行也需要采用消息队列来处理转账?
1、银行内部需要完全保证核心数据库的压力。使用消息队列后可以为数据库减压,避免即时转账因高迸发导致的数据库 死锁,内存溢出,连接数耗尽,iops性能指标耗尽 等
2、跨行转账 或是 系统设计为分布式系统时,分布式事务的使用有足够的时间进行事务补偿(转账失败时的资金回滚)
3、转账操作是复杂的,流程上 数据通信 加密/解密,安全效验,账户效验,账户加锁互相转账,日志流水,消息通知等等一系列的流程,平均耗时一次转账请求耗时2-5秒,如果不做队列消息,一旦遇到 cc攻击、ddos攻击等 会直接把服务器的稳定性压垮,从而导致 雪崩效应 其它服务 因转账业务占满了系统资源也无法正常提供访问。
消息队列的特性
1、消息队列的本质是线性执行,先进先出,后进后出。
2、消费的性能优化:在设计上我们也可以参考食堂打饭的流程,开启一个消息消费进程,就相当于开启了一个打饭窗口。一个打饭窗口的处理速度不行时,我们就多开几个消息消费进程,就相当于多开了几个打饭窗口,这样处理速度就起来了。
3、需要注意的点,消息队列在设计时应考虑到加入任务失败重试的机制(举例:因某刻数据库连接超时,导致无法进行的任务回滚,此时此任务应加入到重试队列,可配置反复3次均是失败时才删掉该队列的执行)。所以在制作消息队列对象时,要考虑任务执行时的 幂等性
总结
消息队列是一个很好的设计,为我们提供了更多的方案去处理不同的业务场景,追求用户体验。还有其它很多的场景案例不一一举例,掌握消息队列的核心就行。