簡體   English   中英

如何防止node.js中的競爭狀況?

[英]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”的所有用戶。 如何解決此(或其他類似)比賽條件?

  1. 如果每個用戶都有自己的文件/數據庫記錄,該如何解決該問題?

  2. 如果我有一個必須讀取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM