告別緩慢的GraphQL查詢:使用Graphpinator Persisted Queries提升性能

最近,我負(fù)責(zé)維護(hù)一個(gè)使用graphql的api,隨著用戶數(shù)量的增加,api的響應(yīng)速度逐漸變慢。分析后發(fā)現(xiàn),許多用戶都在重復(fù)發(fā)送相同的查詢,導(dǎo)致服務(wù)器在解析和驗(yàn)證這些查詢上浪費(fèi)了大量資源。雖然我的解析器函數(shù)本身效率很高,但graphql本身的解析和驗(yàn)證過程卻成為了瓶頸。為了解決這個(gè)問題,我嘗試了多種方法,最終找到了infinityloop-dev/graphpinator-persisted-queries這個(gè)庫。

這個(gè)庫的核心思想是緩存已驗(yàn)證的GraphQL查詢。通過緩存,服務(wù)器可以避免重復(fù)進(jìn)行解析和驗(yàn)證,從而顯著減少服務(wù)器負(fù)載并提升響應(yīng)速度。 這就像在數(shù)據(jù)庫中使用緩存一樣,可以極大地提升效率。

首先,你需要一個(gè)實(shí)現(xiàn)了PsrSimpleCacheCacheInterface的緩存實(shí)現(xiàn)。你可以選擇redis、memcached或者其他符合 PSR-16 標(biāo)準(zhǔn)的緩存系統(tǒng)。我個(gè)人使用了redis,因?yàn)樗峁┝烁咝阅芎涂煽啃浴? (當(dāng)然,你也可以選擇其他更簡(jiǎn)單的本地緩存方案,以滿足你的需求)

接下來,使用composer安裝這個(gè)庫:

composer require infinityloop-dev/graphpinator-persisted-queries

安裝完成后,你需要將PersistedQueriesModule注冊(cè)到你的Graphpinator實(shí)例中:

立即學(xué)習(xí)PHP免費(fèi)學(xué)習(xí)筆記(深入)”;

$cacheImpl = new YourCacheImplementation(); // 替換成你的緩存實(shí)現(xiàn)$persistModule = new GraphpinatorPersistedQueriesModulePersistedQueriesModule($schema, $cacheImpl);$graphpinator = new GraphpinatorGraphpinator(    $schema,    $catchExceptions,    new GraphpinatorModuleModuleSet([$persistModule, /<em> possibly other modules </em>/]),    $logger,);

就這么簡(jiǎn)單!現(xiàn)在,你的Graphpinator實(shí)例已經(jīng)可以緩存查詢了。 第一次請(qǐng)求一個(gè)查詢時(shí),它會(huì)被解析、驗(yàn)證并存儲(chǔ)到緩存中;后續(xù)的相同查詢將直接從緩存中讀取,從而避免重復(fù)處理。

官方提供的基準(zhǔn)測(cè)試顯示,該庫可以將GraphQL的開銷減少大約80%。在我的實(shí)際應(yīng)用中,API的響應(yīng)速度得到了顯著提升,服務(wù)器負(fù)載也明顯降低。 這使得我的API能夠更好地應(yīng)對(duì)日益增長(zhǎng)的用戶流量。

總而言之,infinityloop-dev/graphpinator-persisted-queries是一個(gè)非常高效的庫,可以輕松地集成到你的Graphpinator項(xiàng)目中,顯著提升GraphQL API的性能。如果你正在尋找一種優(yōu)化GraphQL性能的方法,強(qiáng)烈推薦你嘗試一下這個(gè)庫。 當(dāng)然,學(xué)習(xí)Composer的使用可以幫助你更好地管理和使用PHP項(xiàng)目中的各種依賴庫,你可以參考這個(gè)Composer在線學(xué)習(xí)地址:學(xué)習(xí)地址來了解更多信息。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊6 分享