如何搭建一个只用来做简单延时的服务,要求能抵抗高并发。

首先说明要搭建这个服务的目的:
为了验证验证A服务的QPS值。要在B服务上搭建一个简单的延时程序,要求B服务能够实现:分别延时 600ms、700ms、800ms之后输出一个简单结果,比如 echo ‘ok’。

我自己用php+fpm+nginx 与 swoole 分别搭建了B服务,但在用ab压测之后都失败了。
php+fpm+nginx 代码如下

<?php

$time = 600*1000;

usleep($time);

echo '{"code":200,"message":"ok","data":[]}';

swoole 代码如下

<?php
$http = new swoole_http_server("0.0.0.0", 80);

$http->set(array(
    'worker_num' => 1000,
    'max_request' => 5,
    'max_conn' => 10000,
    'dispatch_mode'=>3,
    'reactor_num'=>8,
    'socket_buffer_size' => 512 * 1024 * 1024,
    'heartbeat_idle_time' => 5,
    'heartbeat_check_interval' => 2, 

));

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://0.0.0.0:80\n";
});

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "application/json");

    $time = 600*1000;
    usleep($time);
    $str = '{"code":200,"msg":"ok","data":[]}';
    $response->end("$str");
});

$http->start();

apache ab 压测工具脚本

ab -t 600 -n200000 -c600 http://192.168.0.101/

失败现象:
B服务响应时间大幅度增加,由0.6s 变成 7s 、20s、甚至120s。最后 Connection timed out
file
file

求助内容
如何搭建B服务,实现简单延时但是不会被并发压垮?

create_xf
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 8

可以使用 Coroutine Yield 实现的 sleep,参考:https://wiki.swoole.com/wiki/page/784.html

5年前 评论
GGGG

swoole的定时器,可以使用。
在每个请求进来的时候,开启一个定时器,定时的时间由入参决定就可以了。
sleep函数swoole官方明确说明不可以用。

5年前 评论
create_xf

@Wi1dcard 谢谢回答。问题已经解决了。不是 sleep 函数本身的问题。导致报错的原因还是 fpm 的数量不够。

5年前 评论

@create_xf 如果你 sleep 的时间很长,fpm 需要起很多子进程。

5年前 评论
create_xf

@Wi1dcard 不是很长,600 ms 就行了。

5年前 评论

@create_xf 行吧,那倒无所谓了,疯狂开一堆 fpm 就好了,或者用其他的非阻塞的延迟。

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!