请问下webman怎么做能让接口qps做到1W

晚安。

问题描述

现在对接了1个第三方接口,他们接口响应很快qps可以支持到2w,他们接口延时是30ms

现在我们对接了他的接口,然后给外部提供了这个接口,接口延时必须在100毫秒内,现在只能做到qps500以内,超过延时就跟大了

中间的逻辑就是,拿到第三方接口的数据,判断之后实时返回

现在webman是单机部署,12核24g,50兆带宽
请问还有什么方案可以提高我接口的qps

1215 5 3
5个回答

six

走外网有网络延迟,压不出来,除非加大并发。
建议先内网压,量够了在外网压,否则你不好定位问题。
不知道你接口返回数据多大,1万QPS 50M带宽有可能不够

  • 晚安。 2023-12-06

    接口返回数据是124b

  • six 2023-12-06

    现在你的服务器ab压测第三方接口,看下能压到多少,先不走webman

  • 晚安。 2023-12-06

    第三方接口只能从代码程序端发起他们接口是这个protobuf协议,不能直接发起请求

  • six 2023-12-06

    第三方接口不是http协议?

胡桃

协程

  • 暂无评论
chaz6chez

如果第三方接口支持keep alive,你就做长连接客户端,当你自己的服务启动时就激活;
这样相当于你只是个gateway向第三方接口发包而已;
更多的消耗就在网络层了,因为逻辑层应该你们也没有什么复杂逻辑。

请求/响应日志发到队列,队列去做异步储存

  • 晚安。 2023-12-06

    1台多高的服务器能抗住还是要负载均衡部署下

  • 晚安。 2023-12-06

    $url = '';
    $client = new \GuzzleHttp\Client();
    $response = $client->post($url, [
    'body' => $serializedRequest,
    'headers' => ['Content-Type' => 'application/x-protobuf']
    ]);
    $serializedResponse = $response->getBody()->getContents();
    现在是这样写的

  • chaz6chez 2023-12-06

    如果对方支持keep alive,那你的客户端每次都不要new,做单例长连接,避免每次都要建立连接

  • 晚安。 2023-12-06

    要怎么写一下

  • chaz6chez 2023-12-06

    基于http的keep alive,你要先确认对方是否支持keep alive;
    然后guzzle带上头Connection keep alive;
    然后创建的client对象用单例实现,具体可自行百度,大概就是静态属性储存,判断是否是null,如果是就new,如果不是就拿来直接用

  • 晚安。 2023-12-06

    支持的keep alive;

  • 晚安。 2023-12-06
        $request = new HEC();
        $request->setRequestId($request_id);
        $request->setChannel('999');
        $request->setRequestTime($request_time);
        $device = new PLI();
        $device->setImei($imei); 在这个post之前还有这些new 是不是也要改成单列
  • chaz6chez 2023-12-06

    只需要保证你创建的连接是复用就行了,我不清楚HEC PLI这些地方是否有涉及到连接的创建,但client那里是有涉及到网络连接的

  • 晚安。 2023-12-06

    HEC PLI 这些实例化 就是刚刚设置那些字段设置参数值

  • chaz6chez 2023-12-06

    那这些不必,只需要减少网络连接的创建和销毁即可,通常来说网络连接的创建和销毁是最耗时的,其他的其实没太大影响,复用tcp连接就行了

  • 晚安。 2023-12-06

    厉害了大佬 改成单例,配置没变性能提高了40%呀

  • 晚安。 2023-12-06

    非常感谢

  • chaz6chez 2023-12-06

    你的这些HEC PLI等对象数据内容如果都是通过get set来进行赋值而不是依赖默认值的话,其实也可以做成单例,复用这些对象,毕竟对象是占用php的堆,依赖php自身的GC的,同样可以提高性能。

    这也就是为什么很多框架有DI容器,主要是为了复用所创建出来的对象,避免整体框架过多的创建和销毁对象,从而给php的gc带来比较大的清理压力,这样的思路同样适用于java体系。

    在底层需要了解那些是分配在堆上,哪些分配在栈上,语言的GC方案是如何的,从而就可以写出一些性能较高的业务

  • TM 2023-12-07

    学习

  • 晚安。 2023-12-11

    请问下还有什么方案可以限制的我对外接口的qps,比如我设置5000,超过的请求我全部丢弃,也不返回数据,因为返回数据也会占用服务器带宽

  • 晚安。 2023-12-11

    限制所有人不是单ip,所有请求1秒内不能超过5000,超过就全部丢弃,也不返回数据

  • nitron 2023-12-11

    令牌桶

smile1

多起几个pod

  • 暂无评论
tanhongbin

先加大进程试试 把cpu 和 内存拉满试试看 还是不行 在上协程再试试 ,你这个直接请求第三方没有其他操作,可以试一下协程 ,如果还是不行加机器吧

  • 暂无评论
×
🔝