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

1. 背景
随着公司业务的发展 , 核心服务流量越来越大 , 使用到的资源也越来越多 。 在微服务架构体系中 , 大部分的业务是基于Java 语言实现的 , 受限于Java 的线程实现 , 一个Java 线程映射到一个kernel 线程 , 造成了高并发场景下线程资源的极大浪费 , 线程成为提高系统并发和吞吐量的瓶颈 。
在微服务架构下 , 使用同步编程模式时不仅造成了资源的极大浪费 , 并且在流量发生激增波动的时候 , 受制于系统资源而无法快速的扩容 。 本文将探索服务异步化在并发、吞吐量方面对系统带来的提升 。
2. 如何快速提高服务吞吐量首先 , 以微服务架构中的RPC 服务调用举例 , 测试和探索在微服务架构中 , 异步架构如何提高服务的吞吐量和并发 。 ESA Stack 是OPPO 自研的基础框架技术栈 , ESA RPC 是自研的RPC 框架 。 本节测试服务我们使用ESA RPC 搭建 。
关于ESA RPC的详情 , 可以参考我们之前发布的文章《 Dubbo协议解析及ESA RPC实践 》 。
2.1 服务架构【几品飞车|微服务全链路异步化实践】下图所示为测试环境架构 。 其中Service A 既是服务端也是客户端 , 它模拟了生产环境中大部分服务的角色 。 我们对Service A 分别采用同步模型和纯异步模型进行压测 , 其中纯异步模型包含了客户端、服务端逻辑的异步处理 。 Service B 模拟一个耗时为N ms 的下游服务 , 为Service A 的调用提供固定的延时响应 。
测试服务器的配置为8 核16G , 千兆网卡 。
几品飞车|微服务全链路异步化实践2.2 同步异步模型对比测试场景1:
并发压测客户端200~8000 , 服务耗时50ms , 分别对同步和异步架构进行压测 , 对比TPS、服务耗时、CPU 上下文切换;同步模式下 , 线程数和并发客户端相同;异步模式下 , 使用框架默认的200 线程 。 测试数据如下 。
几品飞车|微服务全链路异步化实践
几品飞车|微服务全链路异步化实践
几品飞车|微服务全链路异步化实践测试场景2:
并发压测客户端8000 , 服务耗时50~500ms , 分别对同步和异步模式进行压测 , 对比TPS、服务耗时、CPU 上下文切换;同步模式下服务端8000 线程;异步模式下 , 使用框架默认的200 线程 。
几品飞车|微服务全链路异步化实践
几品飞车|微服务全链路异步化实践
几品飞车|微服务全链路异步化实践2.3 服务扩展性对比并发指服务瞬时同时处理的任务数(包含处于IO 等待状态的任务) 。 服务端设置业务处理线程200 , 那么同步模式下能提供的并发为200;纯异步模式下服务并发不受线程限制 , IO密集型服务尤其收益 。 在系统流量突增的情景下 , 异步模式具有更强的可扩展性(Scalability) 。
几品飞车|微服务全链路异步化实践2.4 结论根据上面的测试数据可以做出以下对比:


推荐阅读