我正在构建一个简单的REST-API,它有一个端点,它将被大量渗透.我们称之为POST /message
.我必须决定使用Node还是PHP.数据库是MySQL.
在此路由中发生的事情: - 通过HTTP-Auth的凭据将通过从数据库中读取来检查. - 请求另一个REST-API. - 将执行另一个写入数据库操作.
因此,有2个数据库连接和另一个REST-API的http请求.路线应该都是关于速度的.我会选择PHP,因为当前的系统基于PHP,但是路由中的请求让我感到害怕,因为在使用PHP时它不是异步的.我不关心这个请求的结果,在节点中我可以只检查凭据并返回success
,异步发送请求并在请求返回后执行数据库写入性能.我不认为我可以在PHP中这样做,因为当我返回REST调用时success
,一切都必须在之前完成,对吧?
去PHP还是节点?
你写了:
因为使用PHP时不会异步
你确定不可能吗?甚至没有Guzzle Async Requests?
无论如何,我用几种语言实现了相同的REST API服务器,并在同一台机器(Ubuntu Linux 16.04,i7 Intel NUC,16GB RAM)上进行了测试,并发现:
Java,14000 req/sec (源代码)
Go,12000 req/sec (源代码)
PHP 7,6500 req/sec (源代码)
C#(.net Core),5000 req/sec (源代码)
Node.js,4200 req/sec (源代码)
(资源)
请注意,Node.js是唯一无法有效使用多个核心的平台.
为了模拟您的要求,我尝试将一个15ms的usleep添加到PHP,并将一个15ms的setTimeout添加到Node.js,发现当用2000个并发请求命中它时Node.js的吞吐量更高(4300 vs 1800 req /秒),但也有更高的延迟(450 vs 130 ms/req).可能是因为它只使用一个核心并且必须响应许多事件.使用事件循环可能导致具有更高吞吐量的更高延迟.使用Apache(pre)fork可能更昂贵,但能够实现更高的并发性.
我不确定这一切对你有什么帮助,但它可能会为你自己的研究提供一个起点.玩得开心!