Коллекция аренды CosmosDB больше не создается автоматически - PullRequest
0 голосов
/ 08 мая 2020

У меня очень странная проблема с CosmosDB и Azure Functions. Я часто удаляю свою базу данных и заново создаю ее в DEV. Затем я повторно развертываю приложение-функцию. Когда я вызываю API в приложении и вызываются триггеры CosmosDB, я обычно вижу созданную коллекцию leases. Вот типичный триггер:

[FunctionName("MyTrigger")]
public static async Task RunAsync([CosmosDBTrigger("MyDatabase", "MyContainer",
ConnectionStringSetting = "CosmosConnectionString", LeaseCollectionName = "leases", 
LeaseCollectionPrefix = "MyTrigger", CreateLeaseCollectionIfNotExists = true)]IReadOnlyList<Document> documents, 
ExecutionContext executionContext)
{
     // code
}

По какой-то причине коллекция leases больше не создается. Я воссоздал базу данных, повторно развернул приложение-функцию несколько раз и безуспешно выполнял вызовы API. Что мне не хватает?

РЕДАКТИРОВАТЬ: Я просмотрел журналы и заметил, что есть много Microsoft.Azure.Documents.ChangeFeedProcessor.Exceptions.LeaseLostException исключений с сообщением The lease was lost, поэтому я не уверен, что происходит .

EDIT2: Вот более подробное сообщение об ошибке, которое мне удалось извлечь из журналов:

«Либо исходная коллекция MyContainer» (в базе данных MyDatabase) или коллекция аренды leases (в базе данных MyDatabase) не существует. Обе коллекции должны существовать до запуска слушателя. Чтобы автоматически создать коллекцию аренды, установите для CreateLeaseCollectionIfNotExists значение true

Обратите внимание, что CreateLeaseCollectionIfNotExists уже установлено в true.

1 Ответ

1 голос
/ 09 мая 2020
Ошибка

Either the source collection... происходит отсюда: https://github.com/Azure/azure-webjobs-sdk-extensions/blob/0683d1bd08a16680c70f982ad00c940b7e9c1fce/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTriggerListener.cs#L140, которая реагирует на обнаружение NotFound при попытке запустить процесс триггера.

Ключевым моментом здесь является понимание того, что Создание коллекции аренды происходит во время инициализации функции, а не во время ее выполнения.

Если вы удалите коллекцию аренды (или отслеживаемую коллекцию) во время работы функции, вы можете увидеть всплывающее сообщение об ошибке, созданное запущенными экземплярами. Если появится новый экземпляр (из-за масштабирования) или вы перезапустите функцию, то начнется создание https://github.com/Azure/azure-webjobs-sdk-extensions/blob/0683d1bd08a16680c70f982ad00c940b7e9c1fce/src/WebJobs.Extensions.CosmosDB/Trigger/CosmosDBTriggerAttributeBindingProvider.cs#L155.

Итак, когда возникают эти ошибки?

  1. Инициализация функции -> CreateIfNotExist проверяет и создает коллекцию Leases. Если это не удается, инициализация здесь останавливается. Это вызывает сообщение об ошибке.
  2. Функция запущена -> Экземпляры могут быть запущены, и если аренда удалена, ошибки времени выполнения заставят код функции повторить попытку Запустить процесс снова, поскольку повторная попытка не запускает инициализацию снова , он выводит Either the source collection...
  3. Иногда The lease was lost происходит в сценарии балансировки нагрузки ios, когда несколько экземпляров Function работают и распределяют масштабируемую нагрузку, когда аренда (из коллекции аренды) распространяется на новый экземпляр . Это также может произойти, если триггер попытался обновить контрольную точку, и вы внезапно удалили коллекцию аренды.

Что вы можете сделать

Если вы вручную удаляете коллекцию аренды, то вы контролируют то, что может случиться. Рекомендация:

  1. остановить ваши функции
  2. удалить коллекцию аренды
  3. запустить свои функции.

Поведение функции, если вы не остановите ее и если вы удалите хранилище аренды во время его работы, полностью не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...