现在对接了1个第三方接口,他们接口响应很快qps可以支持到2w,他们接口延时是30ms
现在我们对接了他的接口,然后给外部提供了这个接口,接口延时必须在100毫秒内,现在只能做到qps500以内,超过延时就跟大了
中间的逻辑就是,拿到第三方接口的数据,判断之后实时返回
现在webman是单机部署,12核24g,50兆带宽 请问还有什么方案可以提高我接口的qps
走外网有网络延迟,压不出来,除非加大并发。 建议先内网压,量够了在外网压,否则你不好定位问题。 不知道你接口返回数据多大,1万QPS 50M带宽有可能不够
接口返回数据是124b
现在你的服务器ab压测第三方接口,看下能压到多少,先不走webman
第三方接口只能从代码程序端发起他们接口是这个protobuf协议,不能直接发起请求
第三方接口不是http协议?
协程
如果第三方接口支持keep alive,你就做长连接客户端,当你自己的服务启动时就激活; 这样相当于你只是个gateway向第三方接口发包而已; 更多的消耗就在网络层了,因为逻辑层应该你们也没有什么复杂逻辑。
请求/响应日志发到队列,队列去做异步储存
1台多高的服务器能抗住还是要负载均衡部署下
$url = ''; $client = new \GuzzleHttp\Client(); $response = $client->post($url, [ 'body' => $serializedRequest, 'headers' => ['Content-Type' => 'application/x-protobuf'] ]); $serializedResponse = $response->getBody()->getContents(); 现在是这样写的
如果对方支持keep alive,那你的客户端每次都不要new,做单例长连接,避免每次都要建立连接
要怎么写一下
基于http的keep alive,你要先确认对方是否支持keep alive; 然后guzzle带上头Connection keep alive; 然后创建的client对象用单例实现,具体可自行百度,大概就是静态属性储存,判断是否是null,如果是就new,如果不是就拿来直接用
支持的keep alive;
$request = new HEC(); $request->setRequestId($request_id); $request->setChannel('999'); $request->setRequestTime($request_time); $device = new PLI(); $device->setImei($imei); 在这个post之前还有这些new 是不是也要改成单列
只需要保证你创建的连接是复用就行了,我不清楚HEC PLI这些地方是否有涉及到连接的创建,但client那里是有涉及到网络连接的
HEC PLI 这些实例化 就是刚刚设置那些字段设置参数值
那这些不必,只需要减少网络连接的创建和销毁即可,通常来说网络连接的创建和销毁是最耗时的,其他的其实没太大影响,复用tcp连接就行了
厉害了大佬 改成单例,配置没变性能提高了40%呀
非常感谢
你的这些HEC PLI等对象数据内容如果都是通过get set来进行赋值而不是依赖默认值的话,其实也可以做成单例,复用这些对象,毕竟对象是占用php的堆,依赖php自身的GC的,同样可以提高性能。
这也就是为什么很多框架有DI容器,主要是为了复用所创建出来的对象,避免整体框架过多的创建和销毁对象,从而给php的gc带来比较大的清理压力,这样的思路同样适用于java体系。
在底层需要了解那些是分配在堆上,哪些分配在栈上,语言的GC方案是如何的,从而就可以写出一些性能较高的业务
学习
请问下还有什么方案可以限制的我对外接口的qps,比如我设置5000,超过的请求我全部丢弃,也不返回数据,因为返回数据也会占用服务器带宽
限制所有人不是单ip,所有请求1秒内不能超过5000,超过就全部丢弃,也不返回数据
令牌桶
多起几个pod
先加大进程试试 把cpu 和 内存拉满试试看 还是不行 在上协程再试试 ,你这个直接请求第三方没有其他操作,可以试一下协程 ,如果还是不行加机器吧
走外网有网络延迟,压不出来,除非加大并发。
建议先内网压,量够了在外网压,否则你不好定位问题。
不知道你接口返回数据多大,1万QPS 50M带宽有可能不够
接口返回数据是124b
现在你的服务器ab压测第三方接口,看下能压到多少,先不走webman
第三方接口只能从代码程序端发起他们接口是这个protobuf协议,不能直接发起请求
第三方接口不是http协议?
协程
如果第三方接口支持keep alive,你就做长连接客户端,当你自己的服务启动时就激活;
这样相当于你只是个gateway向第三方接口发包而已;
更多的消耗就在网络层了,因为逻辑层应该你们也没有什么复杂逻辑。
请求/响应日志发到队列,队列去做异步储存
1台多高的服务器能抗住还是要负载均衡部署下
$url = '';
$client = new \GuzzleHttp\Client();
$response = $client->post($url, [
'body' => $serializedRequest,
'headers' => ['Content-Type' => 'application/x-protobuf']
]);
$serializedResponse = $response->getBody()->getContents();
现在是这样写的
如果对方支持keep alive,那你的客户端每次都不要new,做单例长连接,避免每次都要建立连接
要怎么写一下
基于http的keep alive,你要先确认对方是否支持keep alive;
然后guzzle带上头Connection keep alive;
然后创建的client对象用单例实现,具体可自行百度,大概就是静态属性储存,判断是否是null,如果是就new,如果不是就拿来直接用
支持的keep alive;
只需要保证你创建的连接是复用就行了,我不清楚HEC PLI这些地方是否有涉及到连接的创建,但client那里是有涉及到网络连接的
HEC PLI 这些实例化 就是刚刚设置那些字段设置参数值
那这些不必,只需要减少网络连接的创建和销毁即可,通常来说网络连接的创建和销毁是最耗时的,其他的其实没太大影响,复用tcp连接就行了
厉害了大佬 改成单例,配置没变性能提高了40%呀
非常感谢
你的这些HEC PLI等对象数据内容如果都是通过get set来进行赋值而不是依赖默认值的话,其实也可以做成单例,复用这些对象,毕竟对象是占用php的堆,依赖php自身的GC的,同样可以提高性能。
这也就是为什么很多框架有DI容器,主要是为了复用所创建出来的对象,避免整体框架过多的创建和销毁对象,从而给php的gc带来比较大的清理压力,这样的思路同样适用于java体系。
在底层需要了解那些是分配在堆上,哪些分配在栈上,语言的GC方案是如何的,从而就可以写出一些性能较高的业务
学习
请问下还有什么方案可以限制的我对外接口的qps,比如我设置5000,超过的请求我全部丢弃,也不返回数据,因为返回数据也会占用服务器带宽
限制所有人不是单ip,所有请求1秒内不能超过5000,超过就全部丢弃,也不返回数据
令牌桶
多起几个pod
先加大进程试试 把cpu 和 内存拉满试试看 还是不行 在上协程再试试 ,你这个直接请求第三方没有其他操作,可以试一下协程 ,如果还是不行加机器吧