什么是异步

同步很好理解,我们每一个操作都是等待上一个操作完成之后,才继续执行。但是有些操作没有必要等待完成之后才进行下一步操作。举个例子,你在12306买票,当你提交订单并且支付完成之后,是会有短信通知和邮件通知的,但是这两个通知并不是完成之后你才看到支付成功,而是有时候很慢才收到信息。这就是异步处理,把非强依赖的操作独立队列慢慢处理。

异步使用场景

当业务要求短时间响应的时候就需要异步,就像今年初和野熊一起创业那会,遇上一个需求,就是点击然后生成一张海报,但是生成海报是一个耗时数秒的任务,但是由于业务关系,不能让用户等待这么久,所以弄了一个中间页面,然后后台异步生成海报,这样子也避免了并发导致系统崩溃。

异步的实现

异步一般来说就是有独立的进程来处理一些操作,那么这些进程怎么去拿任务呢?

  • web服务把任务信息放入redis的队列,然后独立进程往redis里面拿任务,这种做法优点是门槛比较低,不需要额外学习成本,但是redis毕竟不是专门的做任务队列的,所以在海量数据下表现可能比不上专业的软件。
  • web服务把消息压入rabbitmq,然后独立进程消费里面的数据。rabbitmq是专业的消息中间件,所以来做消息队列比较强悍,当然要深入还是有一定的技术门槛的。
  • web服务使用kafka存储消息,优点同上,但是kafka基于java,当然别的语言也有sdk。
异步的风险
  • 执行异步操作的时候出现错误,这个时候我们能做的就是重试和记录错误。
  • 任务队列信息丢失,所以消息队列要做好持久化。
  • 消息队列存储的信息来不及消费而导致的溢出,所以要做特殊处理。
异步不是银弹
  • 一旦使用异步,代码可读性大部分情况下都不如同步的情况
  • 异步处理出错的情况比同步复杂
  • 异步需要引入更多的架构
一点点想说的

此文章是2016年最后一篇文章,我会记住这一年和野熊他们创业的日子,这段时间真的很开心。然后非常感激老大经常教导我一些人生道理,是他让我知道很多不足。当然还有与各位大小朋友的愉快经历。2017年,继续努力,取得更大的成就吧。