zoukankan      html  css  js  c++  java
  • 同步、异步的使用场景及好处

    异步的使用场景:

    1、不涉及共享资源,或对共享资源只读,即非互斥操作

    2、没有时序上的严格关系

    3、不需要原子操作,或可以通过其他方式控制原子性

    4、常用于IO操作等耗时操作,因为比较影响客户体验和使用性能

    5、不影响主线程逻辑

    同步的使用场景:不使用异步的时候

    同步的好处:

    1、同步流程对结果处理通常更为简单,可以就近处理。

    2、同步流程对结果的处理始终和前文保持在一个上下文内。

    3、同步流程可以很容易捕获、处理异常。

    4、同步流程是最天然的控制过程顺序执行的方式。

    异步的好处:

    1、异步流程可以立即给调用方返回初步的结果。

    2、异步流程可以延迟给调用方最终的结果数据,在此期间可以做更多额外的工作,例如结果记录等等。

    3、异步流程在执行的过程中,可以释放占用的线程等资源,避免阻塞,等到结果产生再重新获取线程处理。

    4、异步流程可以等多次调用的结果出来后,再统一返回一次结果集合,提高响应效率
    ---------------------

    典型的用户场景

    在公众号的运营过程中,典型的事件包括:

    • 发送短信验证码

    • 购买成功或者抽奖成功短信通知

    • 卡券或优惠券发放

    • 发放微信红包

    • 微信消息通知

    • 订单流程处理

    • 定时批处理(比如数据同步)

    • 工作流性质的异步任务(未完成异步任务补偿)

    面详细说明不同场景能够异步的原因:

    1. 不同场景(用户注册,用户购买产品等)下的短信验证码发送,可以使用异步方式发送: 一方面是因为客户这个时效性要求没有那样高,另一方面在特定时间范围内用户没有收到验证码,用户可以点击再次发送验证码。

    2. 购买成功或者抽奖成功后短信或者邮件通知,可以通过异步的方式进行。 因为涉及用户的利益,要谨慎对待。一方面一定要把数据先存到数据库或者日志里面(注意信息安全^-^,别存敏感明文信息或者加密存储),然后再放入到异步队列中执行。

      另一个方面,要考虑到应用服务意外停止时,没有发送成功数据的补偿机制。 这种情况不常见,并且为了减少耦合和当前异步程序的复杂度。我们使用单独的服务上部署异步任务补偿程序,来扫描未完成的任务,并且进行重放(一定要注意严谨性)。

    3. 优惠券和卡券的发放,跟购买成功或抽奖成功的方式类似。u000b可以在当前活动高峰后延时发放,并且使用异步的方式进行。

    4. 微信红包,因为需要跟微信进行交互,并且微信会通知客户红包的情况,可以使用异步的方式进行。 当涉及资金或者礼品时,一定要谨慎对待设计,并且需要有方便进行异步任务停止和启动的功能。

    5. 微信消息通知,因为跟微信进行交互,成功后微信进行通知,可以使用异步。 这个跟短信验证码类似。

    6. 订单流程处理,可以使用异步,因为涉及到后续步骤可以使用简单工作流来完成。有几个开源的框架可以参考。

    7. 数据同步或者异步任务补偿,因为是延时处理,可以使用异步进行处理。在使用时,可以配合定时任务,比如cron4j来周期性的进行补偿。适合后面总-分-总的任务处理模式。

    使用异步后的烦恼

    烦恼一: 数据丢失的风险

    解决方式:先写日志或数据库,后放入异步队列.

    烦恼二:对其他系统的压力变大

    解决方式:使用一定的限流和熔断,对其他系统进行保护。

    烦恼三:数据保存后异步任务未执行

    解决方式:使用异步任务补偿的方式,定期从数据库中获取数据,放到队列中进行执行,执行后更新数据状态位。

    烦恼四:怎样队列长设置和消费者数量

    解决方式:使用实际的压力测试来获得队列长度。或者使用排队论的数学公式得到初步的值,然后进行实际压测。

    最后介绍一下项目中的经验:

      • 量力而行:根据业务特点进行技术选型,业务量小尽量避免使用异步。有所为,有所不为

      • 数据说话:异步时一定要进行必要的压力测试

      • 先找出系统的关键点:优化单体系统内的性能,再通过整体系统分解来全局优化

      • 根据团队和项目的特点选择框架。

  • 相关阅读:
    K-Means++ 聚类之数据可视化:使用gnuplot
    QQ设计第1-5步
    QQ设计第1-5步
    为什么有很深的windows基础还是不能动摇linux半步
    常用命令
    在线会计_金蝶友商网
    XP使用VNC远程桌面CentOS 6
    Fatal error: Call to undefined function mb_substr()
    如何汉化 po 文件及编译成 mo 文件
    idoerp
  • 原文地址:https://www.cnblogs.com/h-c-g/p/10717535.html
Copyright © 2011-2022 走看看