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 (