最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

10倍提升API性能的8種方式

2023-08-17 21:21 作者:我要吃那朵棉花糖  | 我要投稿

提起API,作為程序員來說并不陌生,很多程序員的大部分工作都是圍繞著它, 然而很容易被大家忽略,API的性能會(huì)直接影響產(chǎn)品的用戶體驗(yàn),比如,一個(gè)視頻軟件,播放1s后需要加載5s,還有人會(huì)用它嗎?API背后隱藏了很多復(fù)雜的業(yè)務(wù)邏輯,如何保證API的性能,直接體現(xiàn)了一個(gè)程序員的綜合能力。今天我們就來聊聊8種提升API性能的常用方法。

一、什么是API??

在講解方法之前,先對API做個(gè)簡單的介紹。API,Application Programming Interface,翻譯為:應(yīng)用程序接口,它是一種允許兩個(gè)軟件組件使用一組定義和協(xié)議相互通信的機(jī)制。比如,手機(jī)上的天氣預(yù)報(bào)軟件,它通過 API 與遠(yuǎn)程氣象系統(tǒng)“交互”,獲取天氣相關(guān)數(shù)據(jù),最后再將數(shù)據(jù)展示在手機(jī)上。如下圖:軟件A通過API與軟件B進(jìn)行交互

二、API性能提升方法?

1. 緩存

緩存,應(yīng)該是最容易被大家使用,提升API性能的方法,如下圖:

在日常的業(yè)務(wù)開發(fā)中,通常會(huì)包含對數(shù)據(jù)庫的CRUD,但是數(shù)據(jù)庫的讀寫性能是有限的,比如在一些場景中,需要對某些數(shù)據(jù)進(jìn)行頻繁的讀取,這時(shí)候,可以考慮將這些數(shù)據(jù)緩存起來,下次讀取時(shí),直接從緩存中讀取,減少對數(shù)據(jù)庫的訪問,提升API性能。舉個(gè)例子:假如訪問 DB的耗時(shí)是 100ms,訪問緩存的耗時(shí)是10ms,那么整個(gè)API的性能就提升 10倍。常用的緩存工具有 Redis 和 Google Guava cache(本地緩存)。

可能有些小伙伴會(huì)問:一個(gè) API的響應(yīng)數(shù)據(jù),100ms 和 10ms 對于用戶來說,似乎沒有很大的差異?

假如把時(shí)間放大 10倍,100倍,就能發(fā)現(xiàn),這個(gè)差異非常明顯,比如,一個(gè) API的響應(yīng)時(shí)間是 10s, 如果能夠通過緩存將響應(yīng)時(shí)間降低到 1ms,那么整個(gè)系統(tǒng)的吞吐量就提升了 10倍,性能提升相當(dāng)可觀,對于用戶的體驗(yàn)來說也是天壤之別。

2. 連接池

連接池,是一種數(shù)據(jù)庫連接管理技術(shù),它可以在系統(tǒng)初始化時(shí),創(chuàng)建一定數(shù)量的數(shù)據(jù)庫連接,當(dāng)有請求時(shí),直接從連接池中獲取連接,使用完畢后 ,再將連接放回連接池中,這樣就可以避免頻繁的創(chuàng)建和銷毀數(shù)據(jù)庫連接,提升API的性能。如下圖:

服務(wù)器和數(shù)據(jù)庫建立連接是基于 TCP協(xié)議,而TCP 需要3次握手,這個(gè)過程比較耗時(shí),如果每次請求都需要?jiǎng)?chuàng)建一個(gè)連接,那么就會(huì)頻繁的進(jìn)行3次握手,從而影響 API的性能。所以在日常開發(fā)中,和數(shù)據(jù)庫連接時(shí),通常都會(huì)使用一些三方的池化工具,以達(dá)到復(fù)用連接的目的。常用的池化工具有:JDBC,HikariCP,Druid,C3P0,DBCP,BoneCP等。

3. 異步

異步,是一種編程模型,它可以在一個(gè)線程中執(zhí)行多個(gè)任務(wù),如下圖:?

在日常的業(yè)務(wù)開發(fā)中,通常包含核心鏈路和非核心鏈路,比如:訂單支付中,支付是核心鏈路,支付后郵件通知是非核心鏈路,因此,可以把這些非核心鏈路的操作,改成異步實(shí)現(xiàn),這樣就可以提升API的性能。常用的異步方式有:線程池,消息隊(duì)列,事件總線等。比如:上面的郵件發(fā)送,當(dāng)用戶支付完之后,可以使用線程池去實(shí)現(xiàn)郵件發(fā)送,也可以往消息隊(duì)列中發(fā)送一條消息,由消費(fèi)服務(wù)去消費(fèi),實(shí)現(xiàn)郵件發(fā)送。

4. N + 1問題

“N+1 問題” 是一個(gè)在數(shù)據(jù)庫查詢性能優(yōu)化領(lǐng)域常見的概念,指的是在進(jìn)行關(guān)聯(lián)查詢時(shí),當(dāng)你需要獲取主表中的 N 條記錄以及每條記錄關(guān)聯(lián)的另一個(gè)表中的相關(guān)信息時(shí),會(huì)導(dǎo)致在獲取相關(guān)信息時(shí)產(chǎn)生額外的查詢操作,從而造成額外的負(fù)擔(dān)和性能問題。如下圖:?

舉個(gè)例子:假如有兩張表,文章 “post”表 和文章評論”comment”表,現(xiàn)在要統(tǒng)計(jì)每篇文章的評論數(shù),通常SQL語句寫法如下:

sql復(fù)制代碼SELECT id FROM post; ? // 1 ? //for each post ?SELECT count(*) FROM comment WHERE post_id = ? ?// N ?

如上文的例子,查詢 1次 post表,假如 post中有 N條數(shù)據(jù),這樣就需要額外查詢 N次 comment表,因此,產(chǎn)生了 N + 1次查詢。

解決”N+1 問題”的通常方法為:使用 JOIN 進(jìn)行關(guān)聯(lián)查詢,如下SQL:

sql復(fù)制代碼SELECT post.id, count(comment.id) FROM post ? ? LEFT JOIN comment ON post.id = comment.post_id GROUP BY post.id; ?

但是,在一些分庫分表的情況下,無法進(jìn)行 JOIN查詢,該如何解決這種 N+1問題?

通常的做法有:數(shù)據(jù)冗余,說白了就是空間換時(shí)間。比如:在 post表中,增加一個(gè) comment_count字段,用于存儲(chǔ)評論數(shù),這樣就可以避免 N+1問題,但是會(huì)造成數(shù)據(jù)冗余,增加了存儲(chǔ)空間。

因此,在程序員的世界,很多時(shí)候都是在時(shí)間和空間上的權(quán)衡(trade off)。

5. 分頁

分頁(Pagination),是一種常見的數(shù)據(jù)查詢方式,它可以將大量的數(shù)據(jù),分成多個(gè)頁面進(jìn)行展示,如下圖:

分頁也是業(yè)務(wù)開發(fā)中比較常見的一種方式,當(dāng)數(shù)據(jù)量比較大時(shí),通常會(huì)使用分頁的方式進(jìn)行查詢,這樣可以避免一次性查詢大量的數(shù)據(jù),造成內(nèi)存溢出的問題。

6. JSON 序列化

JSON(JavaScript Object Notation)序列化是將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換為JSON格式的字符串的過程,以便在網(wǎng)絡(luò)傳輸、存儲(chǔ)或與其他程序交互時(shí)進(jìn)行數(shù)據(jù)交換。JSON是一種輕量級的數(shù)據(jù)交換格式,易于人類閱讀和編寫,同時(shí)也易于解析和生成。在各種編程語言中,可以使用庫或內(nèi)置函數(shù)來進(jìn)行JSON序列化和反序列化操作。如下圖:

7. 壓縮 payload

在API開發(fā)中有個(gè)默認(rèn)的約定:參數(shù)要盡量的少。因?yàn)閰?shù)越多,API的復(fù)雜度就越高,維護(hù)成本也就越高。因此,通常我們會(huì)對參數(shù)進(jìn)行壓縮。如下圖:

比如:上傳文件,通常會(huì)對文件進(jìn)行壓縮,以減少文件的大小,提升上傳速度。

8.?精簡Log或者異步log

在業(yè)務(wù)流程中,通常會(huì)增加 log來標(biāo)記一些核心的流程,以及記錄錯(cuò)誤信息,方便排查問題。但是,log通常是磁盤操作,如果log過多,就會(huì)影響API的性能。因此,通常會(huì)對log進(jìn)行精簡,或者異步log。如下圖:

異步日志(Asynchronous Logging)是一種在計(jì)算機(jī)程序中進(jìn)行日志記錄的技術(shù)。與傳統(tǒng)的同步日志記錄不同,異步日志記錄允許程序在記錄日志時(shí)不必等待日志寫入磁盤或其他存儲(chǔ)介質(zhì)完成,而是將日志數(shù)據(jù)放入隊(duì)列或緩沖區(qū)中,然后由另一個(gè)線程或進(jìn)程負(fù)責(zé)將日志異步地寫入存儲(chǔ)介質(zhì)。異步日志記錄通常會(huì)涉及以下一些組件:

  • 日志緩沖區(qū)或隊(duì)列:程序?qū)⒁涗浀娜罩拘畔⒎湃刖彌_區(qū)或隊(duì)列中,然后可以繼續(xù)執(zhí)行其他任務(wù)。

  • 日志寫入線程:另一個(gè)線程負(fù)責(zé)從緩沖區(qū)或隊(duì)列中獲取日志數(shù)據(jù),并將其寫入實(shí)際的存儲(chǔ)介質(zhì)(如磁盤)中。這個(gè)過程是異步的,不會(huì)阻塞主程序的執(zhí)行。

  • 同步機(jī)制:由于異步操作涉及多線程,可能需要適當(dāng)?shù)耐綑C(jī)制來確保線程之間的安全性,避免競態(tài)條件等問題。

異步日志的優(yōu)點(diǎn)可以減少主程序的延遲和性能損失的同時(shí),提升性能。需要注意的是,在實(shí)現(xiàn)異步日志時(shí),要小心處理緩沖區(qū)溢出、數(shù)據(jù)丟失以及確保正確的日志順序等問題。

三、總結(jié)?

本文分別了介紹了API的性能優(yōu)化方案,包括:

  1. 緩存

  2. 連接池

  3. 異步

  4. N+1問題

  5. 分頁

  6. JSON序列化

  7. 壓縮payload

  8. 精簡log等

當(dāng)然,這些方案并不是一定要使用,而是根據(jù)實(shí)際的業(yè)務(wù)場景,具體問題具體分析,選擇合適的方案。

另外,在API的開發(fā)中我們通常需要關(guān)注三個(gè)最常見的問題:

  1. 性能

  2. 安全性

  3. 健壯性


10倍提升API性能的8種方式的評論 (共 條)

分享到微博請遵守國家法律
饶平县| 渝北区| 特克斯县| 宣化县| 高碑店市| 日照市| 惠水县| 西乌珠穆沁旗| 乡宁县| 陆良县| 东至县| 淮安市| 吴桥县| 华池县| 昂仁县| 盐城市| 宜黄县| 于田县| 武乡县| 新平| 台北市| 麦盖提县| 乌恰县| 含山县| 山东省| 海门市| 南和县| 临高县| 仙居县| 竹北市| 德保县| 肇州县| 策勒县| 五原县| 临潭县| 平泉县| 镇坪县| 永丰县| 嘉峪关市| 平遥县| 拉萨市|