所以我需要實作一個“昂貴”的 API 端點。基本上,用戶/客戶端需要能夠創建現有用戶的“組”。
所以這個“創建組”API 需要檢查每個用戶是否滿足標準,即同一組中的所有用戶都需要來自同一地區、同一性別、同一年齡組等。此操作可能非常昂貴,特別是因為對一個組中有多少用戶沒有限制,所以客戶端可能會請求 1000 個用戶的組。
我的想法是端點只會在資料庫中創建條目并將“組”標記為待處理,而檢查程序仍在進行中,然后在完成后,它將組狀態更新為“已完成”或“錯誤”并出現錯誤訊息,然后客戶端將需要定期獲取狀態,如果它仍然掛起。
我的實作想法是沿著這條線
const createGroup = async (req, res) => {
const { ownerUserId, userIds } = req.body;
// This will create database entry of group with "pending" status and return the primary key
const groupId = await insertGroup(ownerUserId, 'pending');
// This is an expensive function which will do checking over the network, and would take 0.5s per user id for example
// I would like this to keep running after this API endpoint send the response to client
checkUser(userIds)
.then((isUserIdsValid) => {
if (isUserIdsValid) {
updateGroup(groupId, 'success');
} else {
updateGroup(groupId, 'error');
}
})
.catch((err) => {
console.error(err);
updateGroup(groupId, 'error');
});
// The client will receive a groupId to check periodically whether its ready via separate API
res.status(200).json({ groupId });
};
我的問題是,這樣做是個好主意嗎?我是否遺漏了一些我應該考慮的重要事項?
uj5u.com熱心網友回復:
是的,這是長期運行的標準方法。與其提供createGroup創建和回傳組的 API,不如將其視為具有addGroupCreationJob創建和回傳作業的 API。
您可以使用通知 API(通過 websocket、SSE、webhooks 等進行的事件),甚至訂閱處理進度,而不是輪詢(定期獲取狀態以檢查它是否仍處于掛起狀態)。但可以肯定的是,檢查狀態 API(通過對作業識別符號的 GET 請求)是所有型別的客戶端都能夠使用的最低公分母。
我沒有考慮一些重要的事情嗎?
故障處理變得越來越復雜。由于您不再在單個事務中創建組,您可能會發現您的應用程式處于某種中間狀態,例如在checkUser()呼叫期間服務崩潰(由于不相關的事情)時。您需要一些東西來確保您的資料庫中沒有待處理的組,這些組沒有運行實際的創建程序。您需要賦予用戶重試作業的能力 -insertGroup如果該error州已經有一個具有相同識別符號的組,是否可以作業?如果您將組和作業分成獨立的物體,您是否需要確保沒有兩個掛起的作業試圖創建同一個組?最后但并非最不重要的一點是,您可能希望允許用戶取消當前正在運行的作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453609.html
標籤:javascript 节点.js 异步
