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