Change Feed Processor - несколько потребителей приобретают аренду по всем partitonIds

У меня есть 2 экземпляра рабочей роли, которые слушают одну и ту же коллекцию в CosmosDb с помощью процессора лент изменений. Я получаю повторяющиеся данные, потому что оба потребителя приобрели аренду по всем разделам, и одни и те же данные передаются дважды.

Я использовал свойство LeasePrefix в ChangeFeedHostOptions и установил для него имя экземпляра (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
}

Вот варианты подачи, которые я использовал:

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 ответ

Причина, по которой вы получаете дубликаты, заключается в том, что вы используете LeasePrefix. LeasePrefix заявляет:

Это можно использовать для поддержки нескольких экземпляров ChangeFeedEventHost, указывающих на один и тот же канал, при использовании одной и той же вспомогательной коллекции.

Цель этого свойства состоит в том, чтобы на самом деле сделать это, разделить одну и ту же коллекцию аренды с несколькими независимыми хостами.

Чтобы решить вашу проблему, просто удалите назначение LeasePrefix или используйте один и тот же префикс для обоих.

Другие вопросы по тегам