Todos os produtos
Search
Central de documentação

MaxCompute:DNS resolution fails due to high concurrency

Última atualização: Jun 26, 2026

Este tópico descreve como corrigir falhas na resolução de DNS causadas por múltiplas requisições simultâneas ao nome de domínio de um serviço par.

Se uma User-Defined Function (UDF) ou um job do Spark enviar um grande volume de requisições simultâneas para o nome de domínio de um serviço par, a resolução de DNS poderá falhar. No Logview, o erro é exibido da seguinte forma:

name or service not known

Causa raiz

Cada requisição durante a fase de execução do job aciona uma consulta DNS separada. Em cenários de alta concorrência, o volume de consultas simultâneas pode sobrecarregar o resolvedor DNS e causar falhas nas buscas. Para eliminar esse gargalo, resolva o nome de domínio apenas uma vez durante a inicialização e reutilize o resultado.

Solução

Resolva o nome de domínio para um endereço IP no método __init__, antes do início da fase de execução. Armazene o resultado como uma variável de classe e use-o em todas as requisições HTTP subsequentes.

# -*- coding:UTF-8 -*-
from odps.udf import annotate

@annotate("string->string")
class test_udf(object):
    __ip_address = ''

    def __init__(self):
        # Resolve the domain name once during initialization to avoid
        # concurrent DNS queries during job execution
        import socket
        retries = 3
        for i in range(retries):
            try:
                self.__ip_address = socket.gethostbyname("xxx-vpc.cn-shanghai.aliyuncs.com")
                print(self.__ip_address)
            except socket.gaierror as e:
                print('Failed to resolve domain' + e.strerror)
                if i < retries:
                    print('resolve domain retry: ' + str(i + 1))
                    continue
                else:
                    raise
            break

    def evaluate(self, inputPath):
        import requests
        output = 'false'
        retries = 3
        print(self.__ip_address)
        url = f"http://{self.__ip_address}/{inputPath}"
        print(url)
        for i in range(retries):
            try:
                response = requests.get(url)
                if response.status_code == 200:
                    output = 'true'
                else:
                    raise
            except Exception as e:
                if i < retries:
                    print('connect retry: ' + str(i + 1))
                    print('error: ' + e.message)
                    continue
                else:
                    raise
            break

        return output

Substitua xxx-vpc.cn-shanghai.aliyuncs.com pelo nome de domínio real do seu serviço.