几品飞车|微服务全链路异步化实践( 四 )


接口定义返回CompletableFuture 来实现异步调用:
几品飞车|微服务全链路异步化实践
几品飞车|微服务全链路异步化实践普通接口通过ESARpcContext::startAsync 开启服务端异步:
几品飞车|微服务全链路异步化实践
几品飞车|微服务全链路异步化实践4.5 存储层异步化数据操作是每个请求调用链的 终点 , 纯异步的架构必须使用异步存储层客户端 , 目前OPPO 没有自研的存储层异步客户端 , 但业界开源方案欣欣向荣:

  • 数据库:Vert.x JDBC 客户端
  • Redis:Redisson、Lettuce
  • Queue:基本都支持异步调用

几品飞车|微服务全链路异步化实践4.6 纯异步与伪异步异步调用目的在于防止当前业务线程被阻塞 。 伪异步将任务包装为Runnable 放入另一个线程执行并等待 , 当前Biz 线程不阻塞;纯异步为响应式编程模型 , 通过IO 实践驱动任务完成 。 他们的区别不在于是否将请求放入另一个线程池执行 , 而在于是否有线程阻塞等待Response 。
几品飞车|微服务全链路异步化实践5. 异步化未来发展5.1 异步化带来的问题相比于同步模型 , 异步模型存在以下问题:
  • 代码可读性和可维护性较差 , 可能出现Callback Hell
  • 框架SDK 变得复杂 , 使用门槛增加
  • 业务可能不清楚代码逻辑执行线程
  • 大量的ThreadLocal 需要手动export/import
简单来说 , 异步编程就是以编程的简单性(simplity)来交换性能(performance) 。
5.2 使用协程实现异步非阻塞目前在其他语言中 , Erlang、Go、Kotlin 等都支持了协程 , 使用协程的好处是在语言层面支持了异步调用 , 业务代码可以使用同步的写法达到异步的效果 , 线程不被阻塞 , 避免大量的CPU 上下文切换 , 提升系统的性能 。
目前Java 对协程的支持也在进行中 ,Project Loom 就是Java 的协程项目:。
主要有以下几个概念:
  • Fiber , 轻量级线程(用户态线程) , 基于Continuation 实现
  • Continuation , 指令执行单元 ,阻塞时调用Continuation::yield,恢复时调用Continuation::run
  • Scheduler , 用户态Fiber 调度器(ForkJoinPool) , 使用有限Workers 线程执行任意数量Fibers
开发者可以使用 Fiber 来执行业务代码块 , 当遇到LockSupport::park、socket io 等阻塞调用时 , Fiber 中的代码单元执行会被阻塞 , 但是底层的线程并不会被阻塞 。 由此达到了开发同步模式代码 , 运行时达到异步执行的目的 。
未来 , ESAStack服务框架会支持协程 。 目前 Restlight框架已经支持协程并在内部开始试用 , ESARPC也有支持协程的计划 。 框架提供的服务线程使用 Fiber 执行业务逻辑 , 业务实现中数据库请求、下游服务调用均在 Fiber 之中执行 ,其包含的 IO 等阻塞调用只挂起 Fiber 而不阻塞所在线程 , 从而避免了过多的上下文切换提升 了吞吐量 , 达到了和异步模式一样的效果 。


推荐阅读