避免与nodejs的竞争条件

我正在使用nodeJS 6.3.0和aws DynamoDB编写一个应用程序。

dynamodb拥有从10个不同的function(10种不同的统计量度)中被添加到dynamodb的统计信息。 间隔时间设置为10秒,这意味着每10秒钟,10次调用我的function正在添加所有的相关信息。

putItem函数:

function putItem(tableName,itemData,callback) { var params = { TableName: tableName, Item: itemData }; docClient.put(params, function(err, data) { if (err) { logger.error(params,"putItem failed in dynamodb"); callback(err,null); } else { callback(null,data); } }); 

现在…我创build了一个队列。

 var queue = require('./dynamoDbQueue').queue; 

它实现了一个固定大小的简单队列,我使用http://www.bennadel.com/blog/2308-creating-a-fixed-length-queue-in-javascript-using-arrays.htm 。

这个想法是,如果有networking问题..让我们说一分钟。 我希望所有的事件都被推送到队列中,当问题解决后,发送队列信息给dynamodb并释放队列。

所以我将我的原始function修改为以下代码:

 function putItem(tableName,itemData,callback) { var params = { TableName: tableName, Item: itemData }; if (queue.length>0) { queue.push(params); callback(null,null); } else { docClient.put(params, function (err, data) { if (err) { queue.push(params); logger.error(params, "putItem failed in dynamodb"); handleErroredQueue(); // imaginary function that i need to implement callback(err, null); } else { callback(null, data); } }); } } 

但由于我有10个插入函数在同一秒运行,有一个竞争条件的机会。 意思就是 …

execute1 – 一个函数validation队列是空的,并且即将执行docClient.put()函数。

execute2 – 同时从docClient.put()返回的另一个函数返回一个错误,结果它添加到队列的第一行。

execute1 – 在调用docClient.put()的第一个函数的时候,问题已经解决了,并成功地将数据插入到dynamodb中,这使得队列中的数据会在下一次迭代中释放。

所以例如,如果我插入4行ID为1,2,3,4 ,将插入到dynamodb行的顺序是1,2,4,3

有没有办法解决这个问题?

谢谢!

我认为你在正确的轨道上,而不是检查一个错误,然后添加到队列中,我build议将每个操作添加到队列中,然后每次从队列中读取数据。

例如,在你的情况下,你调用函数1,2,3,4,结果是1,2,4,3,因为你正在使用队列在一个错误/突然的操作。

 Step1: All your function will make an entry to a Queue -> 1,2,3,4 Step2: Read your queue and make an insert, if success remove the element else redo the operation. This way it will insert in the desired sequence 

另一个好处是,因为你使用队列,所以你不必为表格保持非常高的吞吐量。

编辑

我想你只需要确保完成你的第一个操作,你将执行你的下一个过程,而不是在此之前。

例如:fn 1 – >从队列读取(现在不要从队列中删除) – >操作如果不是再次执行,则完成 – >从队列中删除 – >执行下一个操作。

您只需确保从队列中读取,然后等待,直到从DynamoDB获得响应。

希望这可以帮助。