Настройка срока жизни в Azure Cosmos DB

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

В Azure Cosmos DB вы можете настроить срок жизни (TTL) на уровне контейнера или переопределить его на уровне элемента, когда он будет настроен для контейнера. Срок жизни для контейнера можно настроить с помощью портала Azure или пакетов SDK для конкретных языков. Переопределение срока жизни на уровне элемента можно настроить с использованием пакетов SDK.

Содержимое этой статьи имеет отношение к сроку жизни в транзакционном хранилище Azure Cosmos DB. Если вас интересует срок жизни в аналитическом хранилище для активации сценариев NoETL HTAP с использованием Azure Synapse Link, щелкните здесь.

Включение срока жизни для контейнера с помощью портала Azure

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

  1. Войдите на портал Azure.

  2. Создайте новую учетную запись Azure Cosmos DB или выберите существующую учетную запись.

  3. Откройте область Data Explorer.

  4. Выберите существующий контейнер, на вкладке Настройки разверните его и измените следующие значения:

    • В разделе Параметры найдите Срок жизни.

    • В зависимости от своих требований можно:

      • отключить этот параметр;
      • установите для него значение Включен (по умолчанию) или
      • включить его с заданным в секундах значением срока жизни.
    • Выберите Сохранить, чтобы сохранить изменения.

    Configure Time to live in Azure portal

  • Если параметр DefaultTimeToLive имеет значение null, значит, параметр срока жизни отключен.
  • Если параметр DefaultTimeToLive имеет значение –1, значит, параметр срока жизни включен (без значения по умолчанию).
  • Если параметр DefaultTimeToLive имеет любое другое целочисленное значение (кроме 0), значит, параметр срока жизни включен. Сервер будет автоматически удалять элементы на основе настроенного значения.

Включение срока жизни для контейнера с помощью Azure CLI или Azure PowerShell

Сведения о создании или включении срока жизни для контейнера см. в следующих статьях:

Включение срока жизни для контейнера с помощью пакета SDK

Database database = client.GetDatabase("database");

ContainerProperties properties = new ()
{
    Id = "container",
    PartitionKeyPath = "/customerId",
    // Never expire by default
    DefaultTimeToLive = -1
};

// Create a new container with TTL enabled and without any expiration value
Container container = await database
    .CreateContainerAsync(properties);

Настройка срока жизни для контейнера с помощью пакета SDK

Чтобы задать срок жизни в контейнере, необходимо ввести ненулевое положительное число, указывающее период времени в секундах. Исходя из настроенного значения срока жизни, все элементы в контейнере после последнего изменения метки времени элемента _ts удаляются.

Database database = client.GetDatabase("database");

ContainerProperties properties = new ()
{
    Id = "container",
    PartitionKeyPath = "/customerId",
    // Expire all documents after 90 days
    DefaultTimeToLive = 90 * 60 * 60 * 24
};

// Create a new container with TTL enabled and without any expiration value
Container container = await database
    .CreateContainerAsync(properties);

Настройка срока жизни элемента с помощью портала

Срок жизни можно задать не только для контейнера, но и для элемента. Настройка срока жизни на уровне элемента переопределит значение срока жизни по умолчанию для элемента в этом контейнере.

  • Чтобы задать срок жизни для элемента, необходимо ввести ненулевое положительное число, которое будет означать время в секундах, по истечении которого с момента последнего изменения элемента (метка времени _ts) этот элемент будет считаться устаревшим. Кроме того, вы можете указать -1, а также то, что срок жизни элемента не ограничен.

  • Если у элемента нет поля срока жизни, то по умолчанию к элементу будет применяться срок жизни, заданный для контейнера.

  • Если свойство TTL отключено на уровне контейнера, поле срока жизни в элементе будет игнорироваться, пока свойство не будет включено для этого контейнера.

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

  1. Войдите на портал Azure.

  2. Создайте новую учетную запись Azure Cosmos DB или выберите существующую учетную запись.

  3. Откройте область Data Explorer.

  4. Выберите существующий контейнер, разверните его и измените следующие значения:

    • Откройте окно Scale & Settings (Параметры масштабирования).
    • В разделе Параметры найдите Срок жизни.
    • Выберите Включен (по умолчанию) или Включен и задайте значение срока жизни.
    • Выберите Сохранить, чтобы сохранить изменения.
  5. Затем перейдите к элементу, для которого нужно установить срок жизни, добавьте свойство ttl и выберите Обновить.

    {
        "id": "1",
        "_rid": "Jic9ANWdO-EFAAAAAAAAAA==",
        "_self": "dbs/Jic9AA==/colls/Jic9ANWdO-E=/docs/Jic9ANWdO-EFAAAAAAAAAA==/",
        "_etag": "\"0d00b23f-0000-0000-0000-5c7712e80000\"",
        "_attachments": "attachments/",
        "ttl": 10,
        "_ts": 1551307496
    }
    

Настройка срока жизни элемента с помощью пакета SDK

public record SalesOrder(string id, string customerId, int ttl);
Container container = database.GetContainer("container");

SalesOrder item = new (
    "SO05", 
    "CO18009186470"
    // Expire sales order in 30 days using "ttl" property
    ttl:  60 * 60 * 24 * 30
);

await container.CreateItemAsync<SalesOrder>(item);

Сброс срока жизни с помощью пакета SDK

Вы можете сбросить срок жизни в элементе, выполнив операции записи или обновления в элементе. Операция записи или обновления установит для _ts текущий момент времени, и срок жизни для элемента начнет истекать заново. Если вы хотите изменить срок жизни элемента, это поле можно обновить так же, как любое другое.

SalesOrder item = await container.ReadItemAsync<SalesOrder>(
    "SO05", 
    new PartitionKey("CO18009186470")
);

// Update ttl to 2 hours
SalesOrder modifiedItem = item with { 
    ttl = 60 * 60 * 2 
};

await container.ReplaceItemAsync<SalesOrder>(
    modifiedItem,
    "SO05", 
    new PartitionKey("CO18009186470")    
);

Отключение срока жизни с помощью пакета SDK

Чтобы отключить срок жизни в контейнере и остановить фоновый процесс проверки на наличие просроченных элементов, нужно удалить свойство DefaultTimeToLive контейнера. Удаление этого свойства и выбор значения -1 имеют разный эффект. Если задано значение -1, срок действия новых элементов, добавляемых в контейнер, не будет истекать, однако это значение можно переопределить для определенных элементов в контейнере. При удалении свойства TTL из контейнера элементы никогда не истекают, даже если они явно переопределяют предыдущее значение TTL по умолчанию.

ContainerProperties properties = await container.ReadContainerAsync();

// Disable ttl at container-level
properties.DefaultTimeToLive = null;

await container.ReplaceContainerAsync(properties);

Следующие шаги

Дополнительные сведения о сроке жизни см. в следующей статье: