发布网友 发布时间:2023-09-14 06:40
共1个回答
热心网友 时间:2024-11-07 08:42
随着业务的复杂,一个用户请求的处理过程,涉及多个对后端远程服务的调用。为了实现的简单,目前都是使用同步方式完成的,也就是在一个请求的处理过程中,会占用一个容器线程进行逻辑运算和同步远程调用。
解决方案异步化编程中闻名的CallbackHell,让不少同学望而止步。当业务复杂的时候,各种callback互相嵌套,使代码变得更加容易出错和不易理解。业内也有有不少框架提供了异步化编程支持,有以下三个思路:
纤程
纤程可以认为是轻量级的用户线程,脱离了OS的调度机制,在应用级别进行调度管理。由于它只维护了基本的执行栈信息,并不立即分配执行资源,因此,它可以轻松创建成千上万的纤程(受内存大小的*),通过极少的线程完成对纤程的调度执行。这个方向的代表有微信团队开源的libco,以及在语言层面上支持的Go语言等。libcohook了底层IO相关的系统函数,通过底层IO事件驱动纤程的调度执行。
当遇到同步调用网络请求时,libco自动注册回调*,并让出CPU。而在IO事件完成或者超时候,自动恢复纤程,然后调度执行。它的实现机制决定了它非常适合依赖耗时IO服务的实现。承载了微信千万级调用的一个基石。不过遗憾的是,libco是一个高效的c/c++协程库,并没有在JVM上实现。
Quasar是在JVM之上实现了纤程机制,基本可以在Quasar的类库基础上,以同步的模式来编写异步的代码。在真正执行代码前,通过编译或者InstrumentAgent的形式织入相关的字节码。从头起步引入纤程还是一个不错的选择。对现有项目的改造,需要对现有的线程类修改成纤程类,这需要改动我们底层非常多的中间件。另外业内公布的使用经验较少,后续可以持续关注它的发展。
以上就是小编对于HTTP服务异步化如何实现的解答。