yandex-cloud / nodejs-sdk

Yandex.Cloud NodeJS SDK

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

GRPC API не отвечает по IPv6, из-за этого процесс завершается очень долго

vitalets opened this issue · comments

Привет! Заметил, что все мои скрипты использующие sdk стали перед выходом зависать на 5 - 10 секунд.
Дебаг показал, что проблема в следующем.
DNS эндпойнты yandex-cloud резолвится в 2 айпишника: IPv4 и IPv6.
Далее grpc-js пытается приконнектиться к обоим айпишникам. С IPv4 все ок, а IPv6 остается в статусе CONNECTING.
После того, как все операции выполнены через IPv4, завершение http2 сессии с IPv6 и занимает такое долгое время.
По крайней мере на моей локальной машине (osx, nodejs 16).

Для демонстрации можно взять код из readme:

import { Session, cloudApi, serviceClients } from '@yandex-cloud/nodejs-sdk';
const { resourcemanager: { cloud_service: { ListCloudsRequest } } } = cloudApi;

const iamToken = '...';

main();

async function main() {
  const session = new Session({ iamToken });
  const cloudService = session.client(serviceClients.CloudServiceClient);
  const response = await cloudService.list(ListCloudsRequest.fromPartial({ pageSize: 10 }));
  console.log(response);
}

Запускаем с дебагом grpc:

GRPC_TRACE=subchannel,dns_resolver GRPC_VERBOSITY=DEBUG node grpc.mjs

Видно, что коннект к 84.201.181.26 успешно прошел, а к 2a0d:d6c1:0:1c::4e:

D 2022-02-14T11:37:15.152Z | dns_resolver | Resolver constructed for target dns:resource-manager.api.cloud.yandex.net:443
D 2022-02-14T11:37:15.157Z | dns_resolver | Resolution update requested for target dns:resource-manager.api.cloud.yandex.net:443
D 2022-02-14T11:37:15.162Z | dns_resolver | Resolved addresses for target dns:resource-manager.api.cloud.yandex.net:443: [2a0d:d6c1:0:1c::4e:443,84.201.181.26:443]
D 2022-02-14T11:37:15.163Z | subchannel | (2) 2a0d:d6c1:0:1c::4e:443 Subchannel constructed with options {}
D 2022-02-14T11:37:15.164Z | subchannel | (3) 84.201.181.26:443 Subchannel constructed with options {}
D 2022-02-14T11:37:15.165Z | subchannel | (2) 2a0d:d6c1:0:1c::4e:443 IDLE -> CONNECTING
D 2022-02-14T11:37:15.166Z | subchannel | (3) 84.201.181.26:443 IDLE -> CONNECTING
D 2022-02-14T11:37:15.166Z | subchannel | (2) 2a0d:d6c1:0:1c::4e:443 creating HTTP/2 session
D 2022-02-14T11:37:15.170Z | subchannel | (3) 84.201.181.26:443 creating HTTP/2 session
D 2022-02-14T11:37:15.287Z | subchannel | (3) 84.201.181.26:443 CONNECTING -> READY
{
  '$type': 'yandex.cloud.resourcemanager.v1.ListCloudsResponse',
  nextPageToken: '',
  clouds: []
}
D 2022-02-14T11:37:25.171Z | subchannel | (2) 2a0d:d6c1:0:1c::4e:443 CONNECTING -> TRANSIENT_FAILURE
D 2022-02-14T11:37:25.179Z | subchannel | (2) 2a0d:d6c1:0:1c::4e:443 TRANSIENT_FAILURE -> IDLE

У меня этот скрипт зависает секунд на 10 и только потом выходит.
Если закомментить получение IPv6 в grpc-js, то скрипт выходит моментально.

Не уверен, что это вопрос именно к SDK, но все же какие варианты убрать эти задержки?
Или на стороне сервера сделать чтобы эндпойнты отвечали по IPv6?
А то очень некомфортно работать с этими зависаниями(

В общем это какая-то моя локальная сетевая проблема с IPv6 (