线程与消息队列异步场景与区别
前言
看到消息队列,你脑子里面就要想到异步、消峰,解耦,条件反射的那种。为什么写到这篇文章,是因为目前所在项目中,使用异步线程新增一些流程时候的代码,看着又长又臭的很不爽,哈哈。所以这篇文章主要总结下使用线程与消息队列异步场景与区别。
在项目开发中你有没有遇到过这样的场景?
某个功能中很多步骤需要在一个流程里面完成,就比如下单系统,本来业务很简单,下单了付了钱就好了,流程就走完了。
某天老板说,我们搞个优惠卷系统,ok,问题不大,我们在下单流程里面加个优惠劵流程,去扣减优惠劵花个100ms。
后来老板又一激灵,我们还可以搞个积分系统,也行吧,流程里面再加个增减积分流程,再花个200ms。
再后来后来,老板说:下单成功了,我们要短信通知下用户吧,也将就吧,100ms去发个短信。
再后来。。。(你有完没完!!)
最后流程变成了这样 ↓
可以看到这里才加了三个,真正下单的流程涉及的系统绝对在10个以上(主流电商),越大越多。
这个链路下去,一个下单流程被无限拉长。买个东西要个几十秒,垃圾电商,我不在你这里买了。
这个时候有同学就发现这些流程其实可以同时做呀,你支付成功后,我去校验优惠劵的同时我可以去增减优惠劵,还可以同时发个短信。这个时候就用到了异步。
既然说到了异步,我们用线程,线程池去做呀,不一样的吗?
用线程去做,你是不是每新加一个流程,你得在原下单逻辑代码里面新调用一个接口,然后还要重新发布系统,写一次两次还好,写多了你就说:老子不干了。而且还有代码严重耦合,出问题排查也麻烦。搞不好你单个流程随便一个地方出现问题,还会影响其他的点。
如果我们引入了消息队列,就变成了下面这样 ↓
你下单了,你就把支付成功的消息告诉别的系统,他们收到了去处理就好了,你只用走完自己的流程,把自己的消息发出去,那后面要接入什么新的系统,直接订阅你发送的支付成功消息,你支付成功了,我监听就好了。
ps:
这里主要说明了消息队列的异步与解耦特性,至于同学们实际开发过程中,引不引入消息队列,还是根据自己实际情况考虑啊。