几品飞车|微服务全链路异步化实践( 四 )
接口定义返回CompletableFuture 来实现异步调用:
普通接口通过ESARpcContext::startAsync 开启服务端异步:
4.5 存储层异步化数据操作是每个请求调用链的 终点 , 纯异步的架构必须使用异步存储层客户端 , 目前OPPO 没有自研的存储层异步客户端 , 但业界开源方案欣欣向荣:
- 数据库:Vert.x JDBC 客户端
- Redis:Redisson、Lettuce
- Queue:基本都支持异步调用
- 代码可读性和可维护性较差 , 可能出现Callback Hell
- 框架SDK 变得复杂 , 使用门槛增加
- 业务可能不清楚代码逻辑执行线程
- 大量的ThreadLocal 需要手动export/import
5.2 使用协程实现异步非阻塞目前在其他语言中 , Erlang、Go、Kotlin 等都支持了协程 , 使用协程的好处是在语言层面支持了异步调用 , 业务代码可以使用同步的写法达到异步的效果 , 线程不被阻塞 , 避免大量的CPU 上下文切换 , 提升系统的性能 。
目前Java 对协程的支持也在进行中 ,Project Loom 就是Java 的协程项目:。
主要有以下几个概念:
- Fiber , 轻量级线程(用户态线程) , 基于Continuation 实现
- Continuation , 指令执行单元 ,阻塞时调用Continuation::yield,恢复时调用Continuation::run
- Scheduler , 用户态Fiber 调度器(ForkJoinPool) , 使用有限Workers 线程执行任意数量Fibers
未来 , ESAStack服务框架会支持协程 。 目前 Restlight框架已经支持协程并在内部开始试用 , ESARPC也有支持协程的计划 。 框架提供的服务线程使用 Fiber 执行业务逻辑 , 业务实现中数据库请求、下游服务调用均在 Fiber 之中执行 ,其包含的 IO 等阻塞调用只挂起 Fiber 而不阻塞所在线程 , 从而避免了过多的上下文切换提升 了吞吐量 , 达到了和异步模式一样的效果 。
推荐阅读
- 智通财经|| 远洋服务向港交所递表 在管面积约4230万平方米,新股消息
- 【】淄博这家税务局主动服务 助一湖北籍纳税人退税近40万
- 央视新闻客户端|田间地头到跨境物流,China服务安排上了
- 第一财经|住建部:房地产经纪机构应对住房租赁服务项目实行明码标价
- 央视网|直通服贸会 | 加强“一带一路”服贸合作 促进服务转型升级
- 央视网|带你逛服贸 | 文化服务专题展 规模大、颜值高、创意多
- 9月7日|远洋集团拟分拆远洋服务赴港上市 持股份额将不低于五成
- 物业|远洋集团拟分拆远洋服务赴港上市 持股份额将不低于五成
- 服务|快看 | 58同城特别股东大会通过私有化协议,获75%得票比例
- 央视新闻|第三届“一带一路”服务贸易合作论坛举行
