Могу ли я использовать созданный клиентом токен сеанса для cosmosdb?

#azure #azure-cosmosdb #azure-cosmosdb-sqlapi #consistency

#лазурный #azure-cosmosdb #azure-cosmosdb-sqlapi #последовательность #azure #согласованность

Вопрос:

Я провел небольшое исследование по использованию токена сеанса в dotnet v3 sdk cosmosdb, и пока я нашел эти две ссылки, которые дают мне несколько советов о том, как его использовать: use-session-tokens и how-to-convert-session-token .

В нашем сценарии мы хотели бы иметь строгую согласованность (но мы не хотим использовать строгую согласованность для всех данных), если обновление принадлежит одному и тому же userId , чтобы, когда один экземпляр обновляет данные под этим пользователем, все остальные сразу же увидели результат. Мы также хотели бы использовать cosmosdb в качестве блокировки для другого сценария.

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

Например, если я хочу обновить данные в соответствии с определенным userId , я бы использовал {userId}:-1#1 в качестве токена сеанса. Будет ли это допустимым способом использования токена сеанса? Я также не уверен, что означают поля pkrangeid, Version, GlobalLSN и какую роль они играют, когда cosmosdb имеет дело с согласованностью.

Заранее спасибо!

Ответ №1:

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

Чтобы получить надежную согласованность в регионе или, точнее, прочитать ваши собственные гарантии записи, предоставляемые согласованностью сеанса, и использовать один экземпляр клиента Cosmos, вы уже получите свои собственные гарантии записи. Вам не нужно управлять токеном сеанса. Cosmos SDK сделает это за вас.

Если у вас есть сценарий, в котором у вас есть несколько экземпляров клиента Cosmos DB в отдельных процессах, и вы хотите прочитать свои собственные гарантии записи, у вас есть два варианта.

  1. Реализовать согласованность с ограниченной несогласованностью, которая обеспечивает строгую согласованность внутри региона для всех экземпляров клиента Cosmos, считывающих и записывающих данные в этом регионе. Это делается путем чтения двух реплик. Поскольку Cosmos DB всегда выполняет запись в 3 реплики, вы гарантированно всегда будете считывать самые последние данные, поскольку Cosmos DB проверит LSN из обеих реплик и вернет данные из более высокого LSN, если они не совпадают. Преимуществом этого подхода является то, что его очень легко реализовать. Недостатком является то, что Точечные чтения (т.Е. ReadItemAsync() ) стоят в два раза дороже, потому что их чтение из двух реплик.

  2. Используйте согласованность сеанса и используйте объекты с сохранением состояния в долговременных функциях или что-то подобное, что позволит вам реализовать распределенный мьютекс для хранения и обновления токена сеанса в нескольких экземплярах клиента Cosmos. Плюсом здесь является то, что точечные чтения по-прежнему составляют 1 RU, недостатком является эта сложность, а также все записи сериализуются, поскольку они требуют постановки в очередь всех записей против мьютекса, который должен обновляться каждым экземпляром клиента. Примечание: если ваши клиенты находятся в одном процессе, но в нескольких потоках, вы можете использовать параллельную коллекцию, которая проще, но по-прежнему требует синхронизации потоков, что повлияет на пропускную способность записи в клиенте при высоком уровне параллелизма.

Комментарии:

1. Спасибо за потрясающий ответ! У меня все еще есть пара вопросов: означает ли это, что токены сеанса могут использоваться только для запросов на чтение / запрос и должны обновляться при каждом запросе на запись? Как насчет запроса на замену с установленным флагом ifEtagMatch, как я могу гарантировать, что etag является новым? Кроме того, если я хочу поддерживать этот распределенный мьютекс для хранения токена сеанса, должен ли я хранить токен сеанса для каждой базы данных или для каждого раздела? Заранее спасибо!

2. Спасибо, Марк, у меня есть еще один вопрос. В документе doc, если ограниченная устаревшая база данных распределена по нескольким регионам с помощью одного мастера, она ухудшается до согласованной согласованности префиксов. В нашем случае операции чтения и записи будут выполняться только в том же регионе, что и master (только для нескольких регионов для DR), он все еще сильный или это согласованный префикс в этом конкретном главном регионе?

3. Я также попытался использовать произвольный большой LSN для токена сеанса во вновь созданной БД, но это не дало мне никаких ошибок, был ли переданный мной токен не обработан?

4. Токен сеанса обновляется при каждом запросе на запись, включая Replace и Upsert. Etag проверяется при установке IfMatchEtag = itemResponse . ETag в параметре ItemRequestOptions для замены или обновления, пример здесь, github.com/Azure/azure-cosmos-dotnet-v3/blob/master /…

5. Для чтения в одном регионе вы получите надежную согласованность с ограниченной устареваемостью. Смотрите Гарантии согласованности здесь, learn.microsoft.com/en-us/azure/cosmos-db /…