Azure Function并不总是在后续请求中使用输入DocumentDB绑定来获取文档

时间:2017-01-18 08:00:16

标签: azure azure-cosmosdb azure-functions

我的方案:来自Azure存储队列的消息我要在DocumentDB中创建或更新文档

  • 我将DocumentDB的一致性设置为,因此确实如此 保证文档更新
  • 我使用Singleton / Listener, 这样一次只能处理一个Queue条目

这是我的代码:

function.json

{
  "disabled": false,
  "bindings": [
    {
      "name": "updateEntry",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "update-log",
      "connection": "AzureWebJobsStorage"
    },
    {
      "type": "documentDB",
      "name": "inputDocument",
      "databaseName": "logging",
      "collectionName": "messages",
      "id": "{id}",
      "connection": "documentDB",
      "direction": "in"
    },
    {
      "type": "documentDB",
      "name": "outputDocument",
      "databaseName": "logging",
      "collectionName": "messages",
      "createIfNotExists": true,
      "connection": "documentDB",
      "direction": "out"
    }
  ]
}

run.csx

#r "Newtonsoft.Json"

using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

[Singleton(Mode = SingletonMode.Listener)]
public static void Run(UpdateEntryType updateEntry, TraceWriter log, DocumentType inputDocument, out DocumentType outputDocument)
{
    log.Info($"update entry:{updateEntry.id} {updateEntry.created} {updateEntry.Event.ToString()}");

    outputDocument = new DocumentType();
    outputDocument.Events = new List<JObject>();

    if (inputDocument == null)
    {
        outputDocument.id = updateEntry.id;
        outputDocument.created = updateEntry.created;
    }
    else
    {
        log.Info($"input document:{inputDocument.id} {inputDocument.created} {inputDocument.Events.Count}");
        outputDocument.id = inputDocument.id;
        outputDocument.created = updateEntry.created.CompareTo(inputDocument.created) < 0 ? updateEntry.created : inputDocument.created;
        outputDocument.Events.AddRange(inputDocument.Events);
    }

    outputDocument.Events.Add(updateEntry.Event);

    log.Info($"output document:{outputDocument.id} {outputDocument.created} {outputDocument.Events.Count}");
}

public class UpdateEntryType
{
    public string id { get; set; }
    public string created { get; set; }
    public JObject Event { get; set; }
}

public class DocumentType
{
    public string id { get; set; }
    public string created { get; set; }
    public List<JObject> Events { get; set; }
}

我的问题:大部分时间都会找到一个实际的现有文档 id 并因此更新 - 但至少在5%的时间内没有

我的问题(在我打开案例@MSFT支持之前): 我错过了什么?这是正确的方法还是注定要失败?

2 个答案:

答案 0 :(得分:1)

  

不是至少有5%的时间

根据我的经验,如果是专用计划,我们需要为我们的功能应用启用始终开启设置。

  

函数运行时将在几分钟不活动后进入空闲状态,因此只有HTTP触发器才会实际“唤醒”您的函数。这类似于WebJobs必须启用Always On的方式。

有关消费计划的详细信息&amp; 专用应用服务计划以及如何设置应用设置,请参阅Enable Always On when running on dedicated App Service Plan

enter image description here

答案 1 :(得分:1)

使用队列batchSize 1而不是SingletonMode.Listener使问题消失。

<强> hosts.json

{
  "queues": {
    "batchSize": 1
}