Tous les produits
Search
Centre de documentation

MaxCompute:DNS resolution fails due to high concurrency

Dernière mise à jour :Aug 10, 2026

Cette rubrique explique comment résoudre les échecs de résolution DNS qui surviennent lorsque de nombreuses requêtes simultanées tentent d'accéder au nom de domaine d'un service tiers.

Lorsqu'une fonction définie par l'utilisateur (UDF) ou un job Spark envoie un grand nombre de requêtes concurrentes vers le nom de domaine d'un service tiers, la résolution DNS peut échouer. Dans Logview, l'erreur s'affiche comme suit :

name or service not known

Cause racine

Chaque requête exécutée pendant la phase d'exécution du job déclenche une recherche DNS distincte. En cas de forte concurrence, le volume élevé de requêtes DNS simultanées peut saturer le résolveur DNS et entraîner l'échec des recherches. Pour éliminer ce goulot d'étranglement, résolvez le nom de domaine une seule fois lors de l'initialisation et réutilisez le résultat obtenu.

Solution

Résolvez le nom de domaine en adresse IP dans la méthode __init__, avant le début de la phase d'exécution. Stockez le résultat dans une variable de classe et utilisez-le pour toutes les requêtes HTTP ultérieures.

# -*- 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

Remplacez xxx-vpc.cn-shanghai.aliyuncs.com par le nom de domaine réel de votre service.