我发现一旦计算机没了互联网,我就无所事事。大多数时候,我们都使用笔记本电脑和智能手机访问其他地方存储或生成的信息。我们很难想象如果没有了网络通信,不面向用户的应用还有什么用处。尽管I/O操作与数据处理的比例可能有所不同,但此类操作可能会引发服务延迟。
实现后端服务的编程语言有许多。因此,人们对于比较这些语言的性能有着一种天然的好奇心,而比较的基准也各种各样。例如,有一个基准可以比较不同语言在解决不同的离线任务时的性能。还有一个基准TechEmpower,可以衡量Web框架的性能。这些度量非常实用,我们可以通过它们大致了解语言的性能。然而,一般这些基准都有特定的使用场合和特定的操作,所以不一定具有代表性。
因此,我对各个平台上基本I/O的不可降低的成本非常好奇。对TCP代理进行基准测试可能是最简单的情况。其中不涉及数据处理,只处理传入/传出连接,并中继原始的字节数据。微服务的速度基本上不可能比TCP代理更快,因为微服务所需做的处理不可能少于TCP代理,它的功能只会更多,比如在此基础上构建的其他功能:解析、验证、遍历、打包、计算等等。
在本文中,我们将比较以下解决方案:
HAProxy:TCP代理模式。这是一个使用C语言编写的成熟解决方案。http://www.haproxy.org/
draft-http-tunnel:一个使用C++的解决方案(以TCP模式运行),只有最基本的功能(trantor):https://github.com/cmello/draft-http-tunnel/(
http-tunnel:使用Rust(tokio)编写的简单的HTTP隧道 / TCP代理(在TCP模式下运行):https://github.com/xnuter/http-tunnel/
tcp-proxy:Golang解决方案:https://github.com/jpillora/go-tcp-proxy
NetCrusher:Java解决方案(Java NIO)。使用G1在JDK 11上运行基准测试:https://github.com/NetCrusherOrg/NetCrusher-java/
pproxy:基于asyncio的Python解决方案(以TCP代理模式运行):https://pypi.org/project/pproxy/
以上所有的解决方案均使用非阻塞I / O。
注意:我尽力挑选了Golang、Java和Python的最佳解决方案,如果你知道更好的解决方案,请在下方留言。
实际的后端是Nginx,具体配置为:以HTTP模式发送10kb的数据。
基准结果分为两组:
没错,两组中都包含Rust。
方法的简要说明
我们比较的统计数据包括: