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