diff options
author | Aleksey Myasnikov <79263256394@ya.ru> | 2022-02-16 11:57:08 +0300 |
---|---|---|
committer | Aleksey Myasnikov <79263256394@ya.ru> | 2022-02-16 11:57:08 +0300 |
commit | 63632f939dd73650749c9c6c8d7e42fa0c32458c (patch) | |
tree | b685810b371e7e5592157a983c2bf32825c7bff1 | |
parent | 50c7a8a430049bcf5a1051b53221ba67d9836079 (diff) | |
download | ydb-63632f939dd73650749c9c6c8d7e42fa0c32458c.tar.gz |
KIKIMR-13205 update ydb-go-sdk to v3.10.0
KIKIMR-13205 update ydb-go-sdk to v3.10.0
ref:455186e32a851fc34d2668e4813042a8be09429b
-rw-r--r-- | build/rules/go/vendor.policy | 1 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go.md | 13 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go_appendix.md | 0 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/_includes/go.md | 61 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/index.md | 22 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit.md | 2 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit/_includes/go.md (renamed from ydb/docs/ru/core/reference/ydb-sdk/recipes/_includes/session_pool_limit/go.md) | 0 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit/index.md (renamed from ydb/docs/ru/core/reference/ydb-sdk/recipes/_includes/session_pool_limit.md) | 8 | ||||
-rw-r--r-- | ydb/docs/ru/core/reference/ydb-sdk/recipes/toc_i.yaml | 4 |
9 files changed, 98 insertions, 13 deletions
diff --git a/build/rules/go/vendor.policy b/build/rules/go/vendor.policy index 5f8f72a5f6f..6af7b285982 100644 --- a/build/rules/go/vendor.policy +++ b/build/rules/go/vendor.policy @@ -811,7 +811,6 @@ ALLOW .* -> vendor/github.com/ydb-platform/ydb-go-sdk-prometheus ALLOW .* -> vendor/github.com/ydb-platform/ydb-go-sdk-zap ALLOW .* -> vendor/github.com/ydb-platform/ydb-go-sdk-zerolog ALLOW .* -> vendor/github.com/ydb-platform/ydb-go-sdk-opentracing -ALLOW .* -> vendor/github.com/ydb-platform/ydb-go-sdk-opentracing/internal/cmd/bench ALLOW .* -> vendor/github.com/ydb-platform/ydb-go-yc-metadata # CONTRIB-2099 diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go.md index ba7260180e3..c69f919dd7c 100644 --- a/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go.md +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go.md @@ -1,7 +1,7 @@ Есть несколько способов включить логи в приложении, использующем `ydb-go-sdk`: -1. Выставить переменную окружения `YDB_LOG_SEVERITY_LEVEL=info` (доступные значения `trace`, `debug`, `info`, `warn`, `error`, `fatal`, `quiet`, по умолчанию `quiet`). - Данная переменная окружения включает встроенный в `ydb-go-sdk` логгер (синхронный, неблочный) с выводом в стандартный поток вывода. -2. {% cut "Подключить сторонний логгер `go.uber.org/zap`" %} +* Выставить переменную окружения `YDB_LOG_SEVERITY_LEVEL=info` (доступные значения `trace`, `debug`, `info`, `warn`, `error`, `fatal`, `quiet`, по умолчанию `quiet`). + Данная переменная окружения включает встроенный в `ydb-go-sdk` логгер (синхронный, неблочный) с выводом в стандартный поток вывода. +* {% cut "Подключить сторонний логгер `go.uber.org/zap`" %} ```go package main @@ -40,7 +40,7 @@ } ``` {% endcut %} -3. {% cut "Подключить сторонний логгер `github.com/rs/zerolog`" %} +* {% cut "Подключить сторонний логгер `github.com/rs/zerolog`" %} ```go package main @@ -80,4 +80,7 @@ } ``` {% endcut %} -4. Реализовать собственный пакет логгирования на основе пакета трассировки `github.com/ydb-platform/ydb-go-sdk/v3/trace` + +{% include [overlay](go_appendix.md) %} + +* Реализовать собственный пакет логгирования на основе пакета трассировки `github.com/ydb-platform/ydb-go-sdk/v3/trace` diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go_appendix.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go_appendix.md new file mode 100644 index 00000000000..e69de29bb2d --- /dev/null +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/debug/_includes/logs/go_appendix.md diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/_includes/go.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/_includes/go.md new file mode 100644 index 00000000000..e84dac17748 --- /dev/null +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/_includes/go.md @@ -0,0 +1,61 @@ +В `Ydb Go SDK` корректная обработка ошибок закреплена в нескольких программных интерфейсах: +* Основная логика обработки ошибок реализуется функцией-помощником `retry.Retry` + Подробности выполнения повторных максимально скрыты. + Пользователь может влиять на логику работы функции `retry.Retry` двумя способами: + - через контекст (можно устанавливать deadline и cancel) + - через флаг идемпотентности операции `retry.WithIdempotent()`. По умолчанию операция считается неидемпотентной. + + Пользователь передает свою функцию в `retry.Retry`, которая по своей сигнатуре должна возвращать ошибку. + В случае, если из пользовательской функции вернулся `nil`, то повторные запросы прекращаются. + В случае, если из пользовательской функции вернулась ошибка, `Ydb Go SDK` пытается идентифицировать эту ошибку и в зависимости от нее выполняет повторные попытки. + + {% cut "Пример кода, использующего функцию `retry.Retry`:" %} + ```go + package main + + import ( + "context" + "time" + + "github.com/ydb-platform/ydb-go-sdk/v3" + "github.com/ydb-platform/ydb-go-sdk/v3/retry" + ) + + func main() { + db, err := ydb.New( + ctx, + ... + ) + if err != nil { + panic(err) + } + defer func() { + _ = db.Close(ctx) + }() + var cancel context.CancelFunc + // fix deadline for retries + ctx, cancel := context.WithTimeout(ctx, time.Second) + err = retry.Retry( + ctx, + func(ctx context.Context) error { + whoAmI, err := db.Discovery().WhoAmI(ctx) + if err != nil { + return err + } + fmt.Println(whoAmI) + }, + retry.WithIdempotent(), + retry.WithTrace(trace.Trace{}), + retry.WithID("my high-level call"), + ) + if err != nil { + panic(err) + } + } + ``` + {% endcut %} +* Сервис для работы с табличными запросами `db.Table()` сразу предоставляет программный интерфейс `table.Client`, который использует пакет `retry`, а также следит за временем жизни сессий `Ydb`. + Пользователю доступны две публичных функции: `db.Table().Do(ctx, op)` (`op` предоставляет сессию) и `db.Table().DoTx(ctx, op)` (`op` предоставляет транзакцию). + Как и в предыдущем случае пользователь может влиять на логику выполнения повторных запросов через контекст и признак идемпотентности, а `Ydb Go SDK` интерпретирует возвращаемые из `op` ошибки. +* Запросы к остальным сервисам `Ydb` (`db.Scripting()`, `db.Scheme()`, `db.Coordination()`, `db.Ratelimiter()`, `db.Discovery()`) также используют внутри себя функцию `retry.Retry` для выполнения повторных запросов. + diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/index.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/index.md new file mode 100644 index 00000000000..2d336da3aa1 --- /dev/null +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/retry/index.md @@ -0,0 +1,22 @@ +# Выполнение повторных попыток + +{% include [work in progress message](../_includes/addition.md) %} + +`Ydb` является распределенной СУБД с автоматическим масштабированием под нагрузку. +На серверной стороне могут проводиться работы, серверные стойки или целые дата-центры могут быть временно отключены. +В связи с этим допускаются некоторые ошибки при работе с `Ydb`. +В зависимости от типа ошибки следует по разному реагировать на них. +`Ydb SDK` для обеспечения высокой доступности предоставляют встроенные средства выполнения повторных попыток, +в которых учтены типы ошибок и закреплена реакция на них. + +Ниже приведены примеры кода использования встроенных в `Ydb SDK` средств выполнения повторных попыток: + +{% list tabs %} + +- Go + + + {% include [go.md](_includes/go.md) %} + + +{% endlist %} diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit.md deleted file mode 100644 index 6f3b0c252df..00000000000 --- a/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit.md +++ /dev/null @@ -1,2 +0,0 @@ - -{% include [index.md](_includes/session_pool_limit.md) %} diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/_includes/session_pool_limit/go.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit/_includes/go.md index ce1e15b6f3d..ce1e15b6f3d 100644 --- a/ydb/docs/ru/core/reference/ydb-sdk/recipes/_includes/session_pool_limit/go.md +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit/_includes/go.md diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/_includes/session_pool_limit.md b/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit/index.md index d0a15ff3693..b8b2f00c935 100644 --- a/ydb/docs/ru/core/reference/ydb-sdk/recipes/_includes/session_pool_limit.md +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/session_pool_limit/index.md @@ -1,11 +1,11 @@ # Установить размер пула сессий -{% include [work in progress message](addition.md) %} +{% include [work in progress message](../_includes/addition.md) %} -Размер пула сессий на клиенте влияет на потребление ресурсов (память, процессор) на серверной стороне YDB. +Размер пула сессий на клиенте влияет на потребление ресурсов (память, процессор) на серверной стороне YDB. Простая математика: если `1000` клиентов одной базы данных имеют по `1000` сессий, то на серверной стороне создается `100000` акторов (воркеров, исполнителей сессий). Если не лимитировать количество сессий на клиенте, то можно получить "задумчивый" кластер в полу-аварийном состоянии. По умолчанию в `Ydb SDK` установлен лимит в `50` сессий. -Хорошая рекомендация - устаналивать лимит на количество сессий на клиенте в минимальное-необходимое для штатной работы клиентского приложения. Следует иметь в виду, что сессия однопоточная что на серверной стороне, что на клиентской. Соответственно, если для расчетной нагрузки приложению необходимо выполнять `1000` одновременных запросов (`inflight`) в `Ydb` - значит следует установить лимит в `1000` сессий. +Хорошая рекомендация - устаналивать лимит на количество сессий на клиенте в минимальное-необходимое для штатной работы клиентского приложения. Следует иметь в виду, что сессия однопоточная что на серверной стороне, что на клиентской. Соответственно, если для расчетной нагрузки приложению необходимо выполнять `1000` одновременных запросов (`inflight`) в `Ydb` - значит следует установить лимит в `1000` сессий. Тут надо отличать расчетный `RPS` (requests per second, запросов в секунду) и `inflight`. В первом случае это общее колличество выполненных запросов к `Ydb` за `1` секунду. Например, для `RPS`=`10000` и средним `latency` (задержка исполнения запроса) в `100`мс достаточно установить лимит в `1000` сессий. То есть каждая сессия за расчетную секунду выполнит в среднем `10` последовательных запросов. Ниже приведены примеры кода установки лимита на пул сессий в разных `Ydb SDK` @@ -15,7 +15,7 @@ - Go - {% include [go.md](session_pool_limit/go.md) %} + {% include [go.md](_includes/go.md) %} {% endlist %} diff --git a/ydb/docs/ru/core/reference/ydb-sdk/recipes/toc_i.yaml b/ydb/docs/ru/core/reference/ydb-sdk/recipes/toc_i.yaml index a24e689af6e..e9a0b6ffb45 100644 --- a/ydb/docs/ru/core/reference/ydb-sdk/recipes/toc_i.yaml +++ b/ydb/docs/ru/core/reference/ydb-sdk/recipes/toc_i.yaml @@ -5,8 +5,10 @@ items: include: { mode: link, path: auth/toc_p.yaml } - name: Балансировка include: { mode: link, path: balancing/toc_p.yaml } +- name: Выполнение повторных запросов + href: retry/index.md - name: Диагностика проблем include: { mode: link, path: debug/toc_p.yaml } - name: Установить размер пула сессий - href: session_pool_limit.md + href: session_pool_limit/index.md |