我的方案:来自Azure存储队列的消息我要在DocumentDB中创建或更新文档
这是我的代码:
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支持之前): 我错过了什么?这是正确的方法还是注定要失败?
答案 0 :(得分:1)
不是至少有5%的时间
根据我的经验,如果是专用计划,我们需要为我们的功能应用启用始终开启设置。
函数运行时将在几分钟不活动后进入空闲状态,因此只有HTTP触发器才会实际“唤醒”您的函数。这类似于WebJobs必须启用Always On的方式。
有关消费计划的详细信息&amp; 专用应用服务计划以及如何设置应用设置,请参阅Enable Always On when running on dedicated App Service Plan。
答案 1 :(得分:1)
使用队列batchSize 1而不是SingletonMode.Listener使问题消失。
<强> hosts.json 强>
{
"queues": {
"batchSize": 1
}