获得与后期表现

Dav*_*eso 4 rest post get

我正在构建一个 REST 服务,我期待很多请求(甚至是 DoS 攻击)。那么考虑网络和 CPU 消耗,哪种 HTTP 方法更适合我的服务器(接受 POST 或 GET)?

我做了一些测试......使用 VM Ubuntu 14.04(1 核)作为服务器,使用 apache 和 php

获取.php:

$s = "G: ";
foreach ( $_GET as $key => $val){
    $s .= $val . ", ";
}
echo $s;
Run Code Online (Sandbox Code Playgroud)

后.php:

$s = "P: ";
foreach ( $_POST as $key => $val){
    $s .= $val . ", ";
}
echo $s;
Run Code Online (Sandbox Code Playgroud)

测试 #1(使用 ab):

ab -n 10000 'http://10.0.0.112/get.php?key1=val1&key2=val2&key3=val3'
Concurrency Level:      1
Time taken for tests:   9.080 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2080000 bytes
HTML transferred:       210000 bytes
Requests per second:    1101.33 [#/sec] (mean)
Time per request:       0.908 [ms] (mean)
Time per request:       0.908 [ms] (mean, across all concurrent requests)
Transfer rate:          223.71 [Kbytes/sec] received

ab -n 10000 -p post.data -T application/x-www-form-urlencoded 'http://10.0.0.112/post.php'
Concurrency Level:      1
Time taken for tests:   9.526 seconds
Complete requests:      10000
Failed requests:        0
Total transferred:      2090000 bytes
Total body sent:        1860000
HTML transferred:       220000 bytes
Requests per second:    1049.72 [#/sec] (mean)
Time per request:       0.953 [ms] (mean)
Time per request:       0.953 [ms] (mean, across all concurrent requests)
Transfer rate:          214.25 [Kbytes/sec] received
Run Code Online (Sandbox Code Playgroud)

我多次运行 AB 测试,结果相同:POST 更快,但 GET 更轻。所以我在第二次测试中想到(更真实的东西)。

测试 #2(使用 wget):

TIME_POST=0
TIME_GET=0
X1=100
X2=10

function fpost {
        START=$(date +%s.%N)
        i=0
        while [ $i -lt $X1 ]
        do
                wget -q -O out.file 'http://10.0.0.112/post.php' --post-data 'key1=val1&key2=val2&key3=val3'
                rm -rf out.file
                i=$[$i+1]
        done
        END=$(date +%s.%N)
        T=$(echo "$END - $START" | bc)
        echo "POST: $T"
        TIME_POST=$(echo "$TIME_POST + $T" | bc)
}

function fget {
        START=$(date +%s.%N)
        i=0
        while [ $i -lt $X1 ]
        do
                wget -q -O out.file 'http://10.0.0.112/get.php?key1=val1&key2=val2&key3=val3'
                rm -rf out.file
                i=$[$i+1]
        done
        END=$(date +%s.%N)
        T=$(echo "$END - $START" | bc)
        echo "GET:  $T"
        TIME_GET=$(echo "$TIME_GET + $T" | bc)
}

j=0
while [ $j -lt $X2 ]
do
        echo "#"$[$j+1]
        fpost
        fget
        echo
        j=$[$j+1]
done
echo "TIME POST: $TIME_POST"
echo "TIME GET: $TIME_GET"
Run Code Online (Sandbox Code Playgroud)

mmmmm 与 wget 测试.... GET 更快:

...
TIME POST: 54.707362313
TIME GET: 53.049255400
Run Code Online (Sandbox Code Playgroud)

哪种 HTTP 方法的性能更好?

我应该关心它吗?

我应该期待 nginx 或 nodejs (expess) 的不同结果吗?

小智 5

在处理 api 时,我认为现在大多数开发人员都习惯于使用 RESTful 接口。所以这不是什么更快的问题,而是请求的目的是什么。因此,当您说您正在构建 RESTful api 时,有一些规则会取代您提出的问题。也就是说,速度问题无关紧要。

http://en.wikipedia.org/wiki/Representational_state_transfer

就您发布的结果而言,GET 移动的数据较少,并且应该总是更快一些。