我正在使用Change Feed处理器库(或Azure Functions Cosmos DB触发器)订阅集合更新。如何将多个独立(非竞争)消费者设置为同一集合的Feed?
一种方法是使用多个租赁集合,例如leases1
,leases2
等。但这有点浪费。
有没有办法只用一个租约收集? (例如,通过在某处指定消费者组名称,类似于事件中心处理器)
答案 0 :(得分:2)
我注意到直接通过更改Feed处理器库与通过功能集成消费更改Feed之间存在一些不一致。
使用Change Feed Processor Library时,会生成以下文档:
{
"id": "somegraph.documents.azure.com_obtRAA==_obtRAJvr8AU=..0",
"_etag": "\"47006e54-0000-0000-0000-59d4fdf20000\"",
"state": 2,
"PartitionId": "0",
"Owner": "CosmosChangeIngestionServiceType",
"ContinuationToken": "\"143641\"",
"SequenceNumber": 3322,
"_rid": "obtRAIhO1RIFAAAAAAAAAA==",
"_self": "dbs/obtRAA==/colls/obtRAIhO1RI=/docs/obtRAIhO1RIFAAAAAAAAAA==/",
"_attachments": "attachments/",
"_ts": 1507130866
}
从函数生成的Ones可疑地省略Owner
属性并将其设置为null。我的理解是,这个Owner
字段区分了变更Feed消费者,并允许多个消费者跟踪同一个Lease集合中的进度(显然是理想的)。因此,我不确定它是否是设置功能绑定时遗漏的错误或错误,但似乎目前您每个租约集合只能有一个功能消费者。
刚刚与Cosmos团队进行了每周一次的电话会议,并向他们询问了这个具体问题,以及其他租赁存储提供商(例如Table Storage)的状态。他们应该在一天结束时回复我们并做一些澄清。当我们收回官方信息时,我会进一步更新。
答案 1 :(得分:2)
您可以为Azure Function Cosmos DB Trigger定义leaseCollectionPrefix
。在Azure门户中,只需单击您的功能,然后单击集成,然后单击高级编辑器,这将打开您的function.json
。您可以在触发器上定义属性,例如
"bindings": [
{
"type": "cosmosDBTrigger",
"name": "documents",
"direction": "in",
"leaseCollectionName": "leases",
"connectionStringSetting": "myDatabase_DOCUMENTDB",
"databaseName": "myDbName",
"collectionName": "myCollectionName",
"createLeaseCollectionIfNotExists": false,
"leaseCollectionPrefix": "myFunctionSpecificValue"
}
其他设置记录在文档:
下以下设置可自定义内部更改源机制和租赁集合使用情况,并可在高级编辑器中的function.json中设置相应的属性名称:
leaseCollectionPrefix
:设置后,它会为此函数的Lease集合中创建的租约添加前缀,从而有效地允许两个单独的Azure Functions通过使用不同的前缀共享相同的Lease集合。feedPollDelay
:设置后,它会以毫秒为单位定义在所有当前更改耗尽后轮询分区以进行Feed上的新更改之间的延迟。默认值为5000(5秒)。leaseAcquireInterval
:设置后,它以毫秒为单位定义启动任务以计算分区是否在已知主机实例之间均匀分布的时间间隔。默认值为13000(13秒)。leaseExpirationInterval
:设置时,它以毫秒为单位定义在代表分区的租约上进行租约的时间间隔。如果租约未在此时间间隔内续订,则会导致租约过期,并且分区的所有权将移至另一个实例。默认值为60000(60秒)。leaseRenewInterval
:设置后,它以毫秒为单位定义实例当前持有的分区的所有租约的续订间隔。默认值为17000(17秒)。checkpointFrequency
:设置后,它以毫秒为单位定义租约检查点之间的间隔。在成功调用函数后,默认值始终为。maxItemsPerInvocation
:设置后,它会自定义每个函数调用接收的最大项目数。