vertx入门:为什么同步API是垃圾(1)

verx系列教程:
vertx入门:为什么同步API是垃圾(1)
vertx入门:使用NIO进行异步编程(2)
vertx入门:什么是Event Loop(3)


一个应用需要接受很多请求或者请求别的资源。在很多其他地方比如servlet、spring、Rails、Flask都是针对每个一链接生成一个线程。这个模型因为是同步的,所以非常简单。但是在于每一个线程的开销并不低。生成更多的线程就需要更多的内存以及cpu时间进行调度。

同步线程模型

如上图所示,3个线程分别对应处理了3个链接,随着时间的推移,readlinewrite会阻塞当前线程。这通常的原因是:

  • 操作需要等待网络中的数据到达本机。
  • 操作可能必须等到缓冲区被前一个写操作填满后才被清空。

这个模型可以轻易的处理上百个并发的访问,这对大部分系统来说已经足够了。但是当我们谈到数万个并发时,这个模型看起来就显得无力招架了。

同样我们必须要注意的是当处理一个请求我们可能需要更多的线程。例如我们有一个询价的接口,内部需要调用其他的4个应用进行询价,把最低的价格返回给客户。

询价

如果按照顺序请求对每个一应用进行询价那么将会花费很长的时间。最好的办法是开启4个线程同时询价,最后把结果汇总再返回给用户。那么这么做的话线程数直接翻了4倍,每处理1000个请求将需要5000个线程。

最重要的一点是我们的应用通常部署再虚拟机或者容器内。这意味着应用得不到足够多的CPU资源,内存也遭到了限制。所以当有大量线程时,可能会遇到内存瓶颈。例如当你和其他应用共享cpu资源时,其他的应用都使用阻塞的API,那么可能会产生大量线程,到时候cpu都会无暇顾及,导致流量又进一步暴涨。

原文链接:https://www.jdkdownload.com/vertx/blocking_api_is_garbage.html