錯誤1:查詢不變的信息
當我構建 Avalara AvaTax REST API 時,我必須允許用戶發送地址。由于他們的數據很亂,有時他們會發送 ISO 國家代碼,或者可能是國家名稱,也可能是別名。我可以處理這個問題,因為 GitHub 上有很多具有寬松許可證的 國家數據源 ,但最終我選擇付費購買 官方 ISO 3166 國家代碼列表 。
下一步是讓我的 API 服務器在啟動時加載這些數據。代碼不必太復雜——這里有一些類似 C# 的偽代碼,大致顯示了如何使其工作:
private static Task<List<Country>>? _cachedQuery = null ;
private Task<List<Country>> GetCachedCountries()
{
// 將承諾保存到靜態變量
if (_cache == null ) {
_cache = Database.Countries.ToListAsync();
}
// 所有調用者加入同一個承諾
return _cache;
}
為什么要這樣做?幸運的是,新國家/地區并不經常創建。如果國家/地區列表要更改,我們會在每月的應用程序部署期間發送 SQL 腳本來添加新記錄。
我的 C# API 服務器不是查詢數據庫中的表,而是將這些數據保存在單例中。它會在輸入或輸出時查找正確的名稱。數據只占用幾千字節,為了方便起見,我有多個散列的不區分大小寫的字典。
您可能有幾十個這樣的靜態數據集。查找數據集、原因代碼、配置標志 — 將它們存儲在靜態單例中!如果您忘記了,您可能會發現您的系統每秒對永遠不會改變的數據進行數千次不必要的查詢。
錯誤2:過度使用數據庫的狀態頁面檢查
您的 API 服務器需要一個健康檢查系統。它可以是一個頁面或一個 API,但它應該執行一系列基本功能測試,以確保機器能夠正常工作。典型的測試包括:
我有正確的配置文件嗎?
我是否可以聯系我需要的外部服務,或者是否有防火墻阻止我?
我的服務器是否以正確的憑據和權限運行?
我的數據庫連接字符串有效嗎?
這些類型的狀態檢查對于啟動作為自動擴展組一部分的服務器或使用容器化啟動模板是必不可少的。在部署服務器之前,徹底測試所有內容非常重要——啟動缺少數據庫連接字符串的機器會很糟糕。
這些狀態檢查的一個副作用是,它們通常也用于監控部署后的服務器整體健康狀況。一些云服務會每分鐘多次調用此狀態頁面,如果服務器無法響應,則會從負載平衡器中移除該服務器。如果您的狀態頁面在此測試中執行查詢,這可能會迅速消耗您的數據庫。
可以想象,在啟動時測試數據庫連接至關重要。但是,一旦服務器成功部署,有效的數據庫連接以后突然變為無效的可能性就很小。我發現最好將成功的結果緩存一小段時間,比如 30 秒。這意味著我的健康檢查仍然可以將有問題的服務器排除在輪換之外,但不會使數據庫過載:
public static DateTime LastCheckTime = DateTime.MinValue;
public const int SECONDS_FOR_RETEST = 30 ;
public static bool Status ()
{
var now = DateTime.UtcNow;
var timeSinceLastCheck = now - LastCheckTime;
if (timeSinceLastCheck.TotalSeconds > SECONDS_FOR_RETEST) {
...在這里做一些數據庫健康檢查 ...
LastCheckTime = now;
}
return true ;
}
錯誤3:使用過多查詢進行 API 驗證
大多數重度 API 用戶會迅速發出大量請求。對于每個請求,服務器需要檢查用戶是否經過身份驗證,以及他們是否有權執行他們請求的工作。許多這些檢查都需要從數據庫中提取數據:
檢索用戶和賬戶的狀態
檢查用戶的權限
檢索配置或首選項
對每個請求都這樣做似乎很自然,但這些信息可能會浪費大量時間。幸運的是,有一種 方法可以解決緩慢的身份驗證數據庫查詢問題 :如果調用者發出請求,您可以在短時間內緩存他們的憑據。
緩存授權可能看起來很可怕,因為更改不是即時的,但在實踐中,“即時”很難定義。如果在撤銷訪問權限之前 API 調用正在進行中,則用戶可能會或可能不會根據隨機運氣發出請求 — 無論 API 調用是否在撤銷之前到達。
如果我們更新文檔,說“更改用戶權限后,請等待 5 分鐘,所有服務器才會更新新權限”——那么您就可以規劃性能了!這里的技巧是對 API 調用的承載令牌及其 IP 地址進行哈希處理,然后在緩存中查找所有身份驗證和授權數據:
首先檢查服務器內存中的哈希表。實際上,這將花費 10-20 微秒 。
如果持有者令牌不在服務器的內存緩存中,請檢查 REDIS 或其他等效的鍵值對服務器。這將需要 1-2 毫秒。
如果在任一緩存中都找不到該值,則創建一個承諾來獲取必要的數據。如果該承諾已存在,則加入該承諾,這樣您就不會同時發出多個請求。
如果身份驗證數據超過特定年齡,則啟動一個新的承諾來再次重新獲取數據,以便在舊數據從緩存中過期時數據就可以準備就緒。
錯誤4:循環查詢的對象關系映射器
Entity Framework 等現代技術使得訪問數據庫變得極其簡單。事實上,這非常容易,以至于我們經常可以編寫一個方法來執行數據庫調用 — 然后發現人們在使用這個方法時并沒有意識到它接觸了數據庫。
一個簡單的例子可能是這樣的:
公共 異步任務 < int > GetNumberOfUsers ( int id ) {
var count = 0 ;
var items = await _database.GetRecords(id);
foreach ( var item in records) {
count += CountUsersPerItem(item);
}
返回count;
}
這段代碼可能看起來微不足道,但如果該方法 CountUsersPerItem 聯系數據庫,可能是為了獲取一個標志或查詢一個子表,您可能會發現看似一個查詢變成了數百或數千個查詢。
更糟糕的是,此功能的性能在開發人員的桌面上可能看起來不錯,但當現實世界的客戶面臨同樣的情況時,可能會突然下降。
我發現了一些有助于追蹤此問題的技巧:
在當前 API 調用堆棧上增加一個計數器,該計數器用于計算每個 API 請求的數據庫調用次數。記錄此信息,然后追蹤執行異常大量查詢的 API 調用。
使用活動監視器等工具監控數據庫性能 ,并留意成千上萬個快速查詢的突然激增。然后通過將嵌套查詢替換為返回所有必要數據的單個查詢來優化它們。
標準化命名策略,其中接觸數據庫的每種方法的 Query 名稱中都必須包含該單詞,例如, CheckStatusQuery() 接觸數據庫的方法會 CheckStatus() 執行相同的操作但沒有查詢。
錯誤5:因為速度快而忽略查詢
這個問題非常隱蔽。現代數據庫技術非常強大,簡單的數據庫查詢通常可以與查詢 REDIS 一樣快甚至更快。在本地工作的開發人員通常會看到非常好的性能,因為他們的應用程序和數據庫服務器之間沒有延遲,兩者都在筆記本電腦上的容器中運行。
即使您的 SQL Server 或 Postgres 實例可以在一毫秒內做出響應,這些毫秒也會累積起來。如果您的 API 請求發出十個一毫秒的查詢,則可能會使您的 API 延遲增加十毫秒 – 當平均預期時間少于一百毫秒時,這是一個不可忽略的量。
這里的關鍵經驗是,在應用程序接口設計中,每個數據庫查詢都很重要。關注它們,你的應用程序接口就會變得快速而實用。
原文鏈接:https://medium.com/tedspence-com/five-common-database-performance-mistakes-in-api-development-06d99c001bb2
熱門推薦
一個賬號試用1000+ API
助力AI無縫鏈接物理世界 · 無需多次注冊
免費開始試用 →
3000+提示詞助力AI大模型
和專業工程師共享工作效率翻倍的秘密
国内精品久久久久影院日本,日本中文字幕视频,99久久精品99999久久,又粗又大又黄又硬又爽毛片
99久久99久久精品免费观看 |
日本最新不卡在线 |
亚洲国产乱码最新视频 |
国产三级一区二区 |
色综合av在线 |
久久综合九色综合欧美98 |
亚洲视频在线观看三级 |
国产精品国产三级国产 |
青草国产精品久久久久久 |
九色综合国产一区二区三区 |
91在线精品一区二区三区 |
国产日韩欧美a |
精品国产一区二区三区久久久蜜月 |
欧美日韩视频在线一区二区 |
一区二区三区四区激情 |
欧美精品自拍偷拍 |
精品系列免费在线观看 |
99精品国产91久久久久久 |
久久精品国产亚洲高清剧情介绍 |
国产精品全国免费观看高清 |
国产高清一区日本 |
国产精品青草综合久久久久99 |
美女一区二区在线观看 |
日韩视频一区二区三区在线播放 |
日韩黄色片在线观看 |
欧美丰满少妇xxxxx高潮对白 |
国产精品亚洲一区二区三区妖精 |
精品伦理精品一区 |
成人av在线资源网站 |
亚洲成人精品影院 |
日本一区二区视频在线观看 |
91福利在线导航 |
狠狠狠色丁香婷婷综合久久五月 |
亚洲伦理在线精品 |
久久精品综合网 |
91麻豆精品91久久久久同性 |
成人理论电影网 |
精品一区二区三区久久久 |
亚洲妇熟xx妇色黄 |
中文字幕亚洲综合久久菠萝蜜 |
3d动漫精品啪啪 |
91蝌蚪porny成人天涯 |
国产高清精品久久久久 |
免费成人美女在线观看. |
亚洲成av人影院 |
18欧美乱大交hd1984 |
国产日韩v精品一区二区 |
欧美tickling挠脚心丨vk |
91 com成人网 |
日韩欧美一区电影 |
欧美日韩久久不卡 |
欧美日韩久久久一区 |
欧美婷婷六月丁香综合色 |
色94色欧美sute亚洲线路二 |
91亚洲国产成人精品一区二区三 |
国产成人亚洲综合a∨猫咪 |
精品综合免费视频观看 |
蜜桃视频在线观看一区 |
久久精品国产亚洲5555 |
国内精品国产三级国产a久久 |
免费的成人av |
精品午夜一区二区三区在线观看
|
国产日韩欧美制服另类 |
精品福利一二区 |
久久久久青草大香线综合精品 |
久久先锋资源网 |
中文字幕亚洲成人 |
一二三区精品福利视频 |
男人操女人的视频在线观看欧美 |
精品一区二区久久 |
成人动漫中文字幕 |
色婷婷久久久亚洲一区二区三区 |
在线观看不卡视频 |
久久综合网色—综合色88 |
国产精品网曝门 |
无吗不卡中文字幕 |
国产精品18久久久久久久久久久久 |
zzijzzij亚洲日本少妇熟睡 |
6080yy午夜一二三区久久 |
久久精品一区二区三区不卡 |
亚洲乱码国产乱码精品精小说
|
中文字幕av一区二区三区 |
亚洲一区av在线 |
国内精品写真在线观看 |
99国产精品国产精品久久 |
欧美二区三区的天堂 |
国产日产精品一区 |
午夜影院久久久 |
成人h动漫精品 |
精品久久五月天 |
亚洲国产乱码最新视频 |
成人免费毛片app |
日韩一本二本av |
亚洲一区二区三区爽爽爽爽爽 |
麻豆精品在线播放 |
91成人免费在线 |
国产精品久久久久久亚洲伦 |
久久er精品视频 |
在线不卡免费av |
亚洲综合网站在线观看 |
不卡影院免费观看 |
精品对白一区国产伦 |
青娱乐精品视频 |
91精品国产综合久久久久久漫画 |
亚洲欧美日韩精品久久久久 |
国产99久久久国产精品 |
精品国产乱码久久久久久蜜臀 |
午夜精品久久久 |
欧美日本国产视频 |
天天av天天翘天天综合网 |
在线精品国精品国产尤物884a |
国产精品久久久久aaaa |
波多野结衣在线一区 |
国产精品美女一区二区三区 |
不卡在线观看av |
亚洲一区二区偷拍精品 |
欧美色中文字幕 |
日韩精品一区第一页 |
欧美刺激脚交jootjob |
国产酒店精品激情 |
国产精品婷婷午夜在线观看 |
9色porny自拍视频一区二区 |
亚洲欧美福利一区二区 |
欧美日韩亚洲综合一区
|
国产欧美一区二区在线 |
www.亚洲在线 |
亚洲资源中文字幕 |
日韩欧美一卡二卡 |
国产91在线观看丝袜 |
亚洲欧美二区三区 |
555夜色666亚洲国产免 |
国产伦精品一区二区三区免费
|
成人高清免费观看 |
久久伊人中文字幕 |
丰满亚洲少妇av |
一区二区三区色 |
欧美成人aa大片 |
成人激情图片网 |
亚洲一区二区三区四区在线 |
精品日本一线二线三线不卡 |
成人av午夜电影 |
日本女人一区二区三区 |
国产精品伦理在线 |
6080国产精品一区二区 |
成人激情图片网 |
美女视频黄久久 |
亚洲国产精品久久不卡毛片 |
欧美成人乱码一区二区三区 |
色偷偷久久一区二区三区 |
久久99精品久久久久久国产越南 |
亚洲人成人一区二区在线观看
|
成人精品高清在线 |
亚洲高清视频的网址 |
17c精品麻豆一区二区免费 |
欧美成人激情免费网 |
欧美精品粉嫩高潮一区二区 |
97久久精品人人澡人人爽 |
激情六月婷婷久久 |
秋霞电影一区二区 |
偷窥少妇高潮呻吟av久久免费 |
自拍av一区二区三区 |
国产精品色婷婷久久58 |
国产日韩欧美a |
久久久久久久久99精品 |
欧美大胆一级视频 |
欧美一区二区三区免费视频 |
欧美日韩mp4 |
欧美精品日日鲁夜夜添 |
日本精品一区二区三区四区的功能 |
成人av影视在线观看 |
thepron国产精品 |
成人午夜精品一区二区三区 |
国产精品一区二区在线播放 |
国产激情一区二区三区桃花岛亚洲 |
国产在线一区观看 |
国产中文字幕一区 |
精品亚洲成av人在线观看 |
激情六月婷婷综合 |
国产成人丝袜美腿 |
成人高清免费观看 |
色老综合老女人久久久 |
在线播放91灌醉迷j高跟美女 |
91精品国产免费 |
久久久久久久综合色一本 |
国产精品乱人伦 |
亚洲啪啪综合av一区二区三区 |
亚洲一级二级三级 |
日韩—二三区免费观看av |
久久精品99久久久 |
成人短视频下载 |
在线观看视频欧美 |
91精品国产综合久久久久久 |
精品国产一区二区亚洲人成毛片 |
精品国产乱码久久久久久1区2区
|
欧美一区二区三区播放老司机 |
欧美一区二区三区免费大片 |
久久久久久久av麻豆果冻 |
日韩美女视频一区 |
亚洲综合激情小说 |
精品无码三级在线观看视频 |