简单地向下游服务发出几个请求并将响应组合在一起的服务器并不是闻所未闻的。事实上,你可能会发现数十家创业公司巧妙地整合了几个可用的数据源,并提供了一个很有价值的服务。现在的Api大都是RESTful的,SOAP的角色越来越少,但它们都是基于始终流行的HTTP。
即使是单一的阻塞请求也会导致服务器崩溃,性能显著下降。幸运的是,有很多成熟的HTTP客户端(客户机)是非阻塞的,我们已经遇到了第一个:Netty。非阻塞HTTP客户端试图解决的问题有两类:
大量独立并发请求,每个请求都需要一些客户端调用第三方APIs。这是典型的面向服务的体系结构,其中一个请求跨越多个服务。
服务器正在生成大量HTTP客户端请求,可能是在做批处理操作。考虑一下web爬虫或索引服务,它们经常保持数千个连接的打开。
不管服务器的性质如何,问题仍然是一样的:保持大量的(数以万计的)打开的HTTP连接会带来巨大的开销。当我们连接到的服务(此时,我们的服务器是作为客户端角色)很慢时,这尤其令人痛苦,因此需要我们长期持有资源。
相反,TCP / IP连接实际上很轻量级。操作系统必须为每个打开的连接保留一个套接字描述符(大约1千字节),这是相当多的。当一个包(消息)到达时,内核将它发送到适当的进程,比如JVM。相比于在套接字上阻塞的线程的堆栈所消费的1M字节而言,1千字节是一个相当小的内存占用了。话虽如此,在高性能服务器的情况下,典型的一个连接一个线程的模型不具有可拓展性,我们需要拥抱底层的网络模型,而不是试图用阻塞代码来抽象它。好消息是,RxJava + Netty提供了一个更好的抽象,但也只是接近于基于底层硬件编码的软件。