[英]How to prevent race condition in node.js?
有人可以向我解釋如何通過Express防止node.js中的競爭狀況嗎?
例如,有以下兩種方法:
router.get('/addUser/:department', function(req, res) { ...})
router.get('/deleteUser/:department', function(req, res) { ...})
這兩個功能都使用無阻塞的I / O操作(例如寫入文件或數據庫)。
現在有人用部門“ A”調用“ addUser”,有人試圖刪除部門“ A”的所有用戶。 如何解決此(或其他類似)比賽條件?
如果每個用戶都有自己的文件/數據庫記錄,該如何解決該問題?
如果我有一個必須讀取alter並再次寫入的單個用戶(文件系統)文件,該如何解決該問題?
注意:這只是一個理解的示例。 這里不需要優化技巧。
(這是一個非常廣泛的問題。)
通常,將使用數據庫(而不是常規文本文件)並利用其內置的鎖定機制。
Postgres
數據庫管理系統中的鎖定機制示例: https : //www.postgresql.org/docs/10/static/explicit-locking.html
要歸檔此目標,您需要在兩個服務中實現通信。
這可以通過簡單的操作隊列來按順序處理每個請求來完成。 反作用是等待隊列的請求將具有延遲的響應(並且可能會發生超時)。
一個簡單的“元”實現是:
const operationQueue = new Map();
const eventEmitter = new events.EventEmitter();
router.get('/addUser/:department', function(req, res) {
const customEvent = `addUser-${new Date().getTime()}`;
const done = () => {
res.send('done');
operationQueue.delete(customEvent);
};
eventEmitter.once(customEvent, done);
operationQueue.set(customEvent, () => addUser(customEvent, req));
})
router.get('/deleteUser/:department', function(req, res) {
const customEvent = `deleteUser-${new Date().getTime()}`;
const done = () => {
res.send('done');
operationQueue.delete(customEvent);
};
eventEmitter.once(customEvent, done);
operationQueue.set(customEvent, () => deleteUser(customEvent, req));
})
function addUser(customEvent, req){
// do the logic
eventEmitter.emit(customEvent, {done: true});
}
function deleteUser(customEvent, req){
// do the logic
eventEmitter.emit(customEvent, {done: true});
}
// not the best performance
setInterval(()=>{
const process = operationQueue.shift();
if(process) {
process();
}
}, 1);
當然,如果您將使用數據庫或Redis隊列之類的工具,那么就健壯性和故障轉移而言,它可能比該解決方案更適合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.