現(xiàn)在對接了1個第三方接口,他們接口響應很快qps可以支持到2w,他們接口延時是30ms
現(xiàn)在我們對接了他的接口,然后給外部提供了這個接口,接口延時必須在100毫秒內,現(xiàn)在只能做到qps500以內,超過延時就跟大了
中間的邏輯就是,拿到第三方接口的數(shù)據(jù),判斷之后實時返回
現(xiàn)在webman是單機部署,12核24g,50兆帶寬
請問還有什么方案可以提高我接口的qps
走外網有網絡延遲,壓不出來,除非加大并發(fā)。
建議先內網壓,量夠了在外網壓,否則你不好定位問題。
不知道你接口返回數(shù)據(jù)多大,1萬QPS 50M帶寬有可能不夠
如果第三方接口支持keep alive,你就做長連接客戶端,當你自己的服務啟動時就激活;
這樣相當于你只是個gateway向第三方接口發(fā)包而已;
更多的消耗就在網絡層了,因為邏輯層應該你們也沒有什么復雜邏輯。
請求/響應日志發(fā)到隊列,隊列去做異步儲存
$url = '';
$client = new \GuzzleHttp\Client();
$response = $client->post($url, [
'body' => $serializedRequest,
'headers' => ['Content-Type' => 'application/x-protobuf']
]);
$serializedResponse = $response->getBody()->getContents();
現(xiàn)在是這樣寫的
基于http的keep alive,你要先確認對方是否支持keep alive;
然后guzzle帶上頭Connection keep alive;
然后創(chuàng)建的client對象用單例實現(xiàn),具體可自行百度,大概就是靜態(tài)屬性儲存,判斷是否是null,如果是就new,如果不是就拿來直接用
$request = new HEC();
$request->setRequestId($request_id);
$request->setChannel('999');
$request->setRequestTime($request_time);
$device = new PLI();
$device->setImei($imei); 在這個post之前還有這些new 是不是也要改成單列
只需要保證你創(chuàng)建的連接是復用就行了,我不清楚HEC PLI這些地方是否有涉及到連接的創(chuàng)建,但client那里是有涉及到網絡連接的
那這些不必,只需要減少網絡連接的創(chuàng)建和銷毀即可,通常來說網絡連接的創(chuàng)建和銷毀是最耗時的,其他的其實沒太大影響,復用tcp連接就行了
你的這些HEC PLI等對象數(shù)據(jù)內容如果都是通過get set來進行賦值而不是依賴默認值的話,其實也可以做成單例,復用這些對象,畢竟對象是占用php的堆,依賴php自身的GC的,同樣可以提高性能。
這也就是為什么很多框架有DI容器,主要是為了復用所創(chuàng)建出來的對象,避免整體框架過多的創(chuàng)建和銷毀對象,從而給php的gc帶來比較大的清理壓力,這樣的思路同樣適用于java體系。
在底層需要了解那些是分配在堆上,哪些分配在棧上,語言的GC方案是如何的,從而就可以寫出一些性能較高的業(yè)務
請問下還有什么方案可以限制的我對外接口的qps,比如我設置5000,超過的請求我全部丟棄,也不返回數(shù)據(jù),因為返回數(shù)據(jù)也會占用服務器帶寬
先加大進程試試 把cpu 和 內存拉滿試試看 還是不行 在上協(xié)程再試試 ,你這個直接請求第三方沒有其他操作,可以試一下協(xié)程 ,如果還是不行加機器吧