Как обрабатывать почасовое закрытие Bigtable? - PullRequest
0 голосов
/ 03 марта 2019

У меня есть сервисы golang с постоянным клиентом Bigtable.Службы выполняют сотни операций чтения / записи на Bigtable в секунду.

Каждый час после загрузки службы у меня возникают сотни таких ошибок:

Retryable error: rpc error: code = Unavailable desc =
 the connection is draining, retrying in 74.49241ms

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

Мне удалось выяснить, что клиент Bigtable использует пул соединений gRPC.

Кажется, что сервер Bigtable gRPCМаксимальное время соединения составляет 1 час, что может объяснить вышеуказанную ошибку и увеличить время обработки при переподключении.

Предполагается, что конфигурация maxAgeGrace дает дополнительное время для завершения текущих операций и позволяет избежать одновременного завершения всех подключений к пулу.время.

Я увеличил размер пула соединений со значения по умолчанию с 4 до 12 без особой выгоды

Как предотвратить увеличение времени обработки во время переподключений и появления этой ошибки, учитывая, что мой трафик будет расти

Ответы [ 2 ]

0 голосов
/ 18 марта 2019

Клиенты bigtable в облаке используют пул соединений gRPC для подключения к bigtable.Java-клиент использует пул каналов для каждого соединения HBase, каждый пул каналов имеет несколько соединений gRPC.Соединения gRPC отключаются каждый час (или через 15 минут бездействия), и базовая инфраструктура gRPC выполняет переподключение.Первый запрос для каждого нового соединения выполняет ряд задач настройки, таких как квитирование TLS и прогрев кэшей на стороне сервера.Эти операции довольно дороги и могут вызвать всплески задержки.

Bigtable спроектирован как система с высокой пропускной способностью, и амортизированная стоимость этих повторных соединений с постоянным объемом запросов должна быть незначительной.Однако, если клиентское приложение имеет очень низкий QPS или длительные периоды простоя между запросами и не может допустить эти пики задержки, оно может создавать новое соединение Hbase (java) или новый клиент CBT (golang) каждые 30-40 минут ине запускать операционные вызовы (существуют на клиенте hbase или прочитать небольшую строку) на новом соединении / клиенте, чтобы заполнить базовые соединения gRPC (один вызов на соединение, для hbase по умолчанию вдвое больше процессоров, go по умолчанию имеет 4 соединения),После заполнения вы можете поменять новое соединение / клиент для основных операций в клиентском приложении. Здесь - это пример кода перехода для этого обходного пути.

0 голосов
/ 14 марта 2019

Я подозреваю, что это может быть связано с ошибкой , которая появилась в недавнем выпуске grpc-go и только что получила исправлено .По сути, вместо того, чтобы немедленно восстанавливать соединение, когда соединение разрывается, мы неправильно ждем 1 с перед повторным подключением.Пожалуйста, попробуйте еще раз с мастер-головой grpc-go.Спасибо!

...