鍍金池/ 問(wèn)答/HTML/ nodejs請(qǐng)求進(jìn)來(lái)我把請(qǐng)求放入隊(duì)列,如何一個(gè)一個(gè)取出來(lái)?

nodejs請(qǐng)求進(jìn)來(lái)我把請(qǐng)求放入隊(duì)列,如何一個(gè)一個(gè)取出來(lái)?

用scoket做聊天程序,請(qǐng)求進(jìn)來(lái),我把請(qǐng)求放入了隊(duì)列,代碼如下:

  rob_vest: async function (data, socket, io) {
        console.log(type, '------------------------------------------')
        var queue = new Queue();//創(chuàng)建隊(duì)列
        queue.push(data)//往隊(duì)列里放入請(qǐng)求數(shù)據(jù)
        get_vetst(queue,socket, io)//這是從隊(duì)列取出數(shù)據(jù)


    },
async function get_vetst(queue,socket, io) {
    // let sequlize = await db
    let len = queue.size()
    if (len !== 0) {
        let data = queue.pop() //從對(duì)列取出數(shù)據(jù)
        //下面是一些對(duì)數(shù)據(jù)的處理以及存庫(kù)操作
        ...
        }
    }

想上面這樣寫如果下一次的請(qǐng)求依賴上一次的操作表的結(jié)果會(huì)導(dǎo)致出現(xiàn)預(yù)想之外的結(jié)果,雖然是放入到了隊(duì)列中,但是如果兩次請(qǐng)求同時(shí)進(jìn)來(lái),還是會(huì)同時(shí)讀取兩次對(duì)列中的數(shù)據(jù),然后同時(shí)對(duì)表進(jìn)行操作,導(dǎo)致第二次的請(qǐng)求,沒(méi)有得到第一次的結(jié)果,理想的流程是,兩次請(qǐng)求進(jìn)來(lái),把兩次的請(qǐng)求放入隊(duì)列,然后會(huì)觸發(fā)一個(gè)方法,這個(gè)方法讀取隊(duì)列中的數(shù)據(jù),當(dāng)?shù)谝淮巫x取并且執(zhí)行完一系列的操作后,在讀取下一個(gè)數(shù)據(jù)再進(jìn)行操作
get_vetst方法不應(yīng)該依賴rob_vest
我該如何操作??各位大佬們

回答
編輯回答
寫榮

你應(yīng)該擔(dān)心的是并發(fā)情況下的數(shù)據(jù)更新問(wèn)題,建議你了解下數(shù)據(jù)庫(kù)相關(guān)的鎖,比如悲觀鎖、樂(lè)觀鎖、事務(wù)等。

2018年3月27日 22:25
編輯回答
下墜

需要callback回傳ack確認(rèn)消息,參考amqp協(xié)議的消息確認(rèn)機(jī)制

2018年2月27日 03:32