这是我的方案:我有一个azure队列,一个Web作业池和一个DocumentDB集合。在队列中,有一些消息由webjobs处理。
webjob处理消息,然后只有当队列消息中的名称尚未包含在db中的文档中时,它才会在DocumentDB上创建文档。 文档中的每个名称必须是唯一的,因此如果webjob检查队列消息中是否存在具有相同名称的文档,则它会读取此文档并增加计数器。
问题是webjob与其他相同的webjob并行工作,因此两个或多个实例可以同时读取包含相同名称(不是已经进入db)的不同队列消息。为了确保文档中名称的唯一性,我在DocumentDb上创建了这个预触发器
function validateName() {
var collection = getContext().getCollection();
var request = getContext().getRequest();
var docToCreate = request.getBody();
lookForDuplicates();
function lookForDuplicates(continuation) {
var query = {
query: 'SELECT * FROM myCollection c WHERE c.GeoArea.Name = @Name',
parameters: [{
name: '@Name',
value: docToCreate.GeoArea.Name
}]
};
var requestOptions = {
continuation: continuation
};
var isAccepted = collection.queryDocuments(collection.getSelfLink(), query, requestOptions,
function(err, results, responseOptions) {
if (err) {
throw new Error('Error querying for documents with duplicate Name: ' + err.message);
}
if (results.length > 0) {
throw new Error('Document with the name, ' + docToCreate.GeoArea.Name + ', already exists: ' + JSON.stringify(results[0]));
}
}
);
}
}
这个预触发几乎总是有效,但有时我会在db中找到两个同名文档。为什么呢?