更改Feed处理程序 - 多个消费者在所有partitonIds上获得租约

时间:2018-04-12 08:31:48

标签: azure azure-cosmosdb

我有2个worker角色实例使用Change Feed Processor在CosmosDb中侦听同一个集合。我收到重复数据,因为两个消费者都在所有分区上获得了租约,并且相同的数据正在流式传输两次。

我使用了ChangeFeedHostOptions的LeasePrefix属性并将其设置为实例名称(RoleEnvironment.CurrentRoleInstance.Id

这是租赁收集的一个例子:

Consumer1
{
    "id": "WorkerRole1_IN_1xyz.documents.azure.com_v0QfAA==_v0QfAKJwMgA=..0",
    "_etag": "\"0000c601-0000-0000-0000-5acf0fca0000\"",
    "state": 2,
    "PartitionId": "0",
    "Owner": "WorkerRole1_IN_1",
    "ContinuationToken": "\"115725\"",
    "SequenceNumber": 1,
    "_rid": "DiADAKjOkAMDAAAAAAAAAA==",
    "_self": "dbs/DiADAA==/colls/DiADAKjOkAM=/docs/DiADAKjOkAMDAAAAAAAAAA==/",
    "_attachments": "attachments/",
    "_ts": 1523519434
}

Consumer2:
{
    "id": "WorkerRole1_IN_0xyz.documents.azure.com_v0QfAA==_v0QfAKJwMgA=..4",
    "_etag": "\"00007e01-0000-0000-0000-5acf0fcc0000\"",
    "state": 2,
    "PartitionId": "0",
    "Owner": "WorkerRole1_IN_0",
    "ContinuationToken": "\"115725\"",
    "SequenceNumber": 1,
    "_rid": "DiADAPNPPAMDAAAAAAAAAA==",
    "_self": "dbs/DiADAA==/colls/DiADAPNPPAM=/docs/DiADAPNPPAMDAAAAAAAAAA==/",
    "_attachments": "attachments/",
    "_ts": 1523519436
}

以下是我使用的Feed选项:

ChangeFeedOptions feedOptions = new ChangeFeedOptions
{
    StartFromBeginning = true,
    MaxItemCount = 10000,
    StartTime = DateTime.Today.AddDays(-7)
};

ChangeFeedHostOptions feedHostOptions = new ChangeFeedHostOptions
{
    LeasePrefix = Configs.hostName,
    FeedPollDelay = TimeSpan.FromSeconds(30)
};

有人可以告诉我,如果我遗失了什么吗?

1 个答案:

答案 0 :(得分:1)

您收到重复的原因是因为您使用的是LeasePrefix。 LeasePrefix声明:

  

这可用于支持在使用相同辅助集合时指向同一个Feed的多个ChangeFeedEventHost实例。

该属性的目标是实际执行此操作,与多个独立主机共享相同的租约集合。

要解决您的问题,只需删除LeasePrefix分配或为两者使用相同的前缀。