DocumentDB在并行WebJobs中添加一个单义文档

时间:2016-02-27 09:59:59

标签: azure azure-cosmosdb

这是我的方案:我有一个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中找到两个同名文档。为什么呢?

0 个答案:

没有答案