Иногда API геокодирования Google возвращает ошибку 500 серверов

Иногда API Карт Google возвращает 500 server error ответ по немецким почтовым индексам, и я не могу понять, почему.

Я надеюсь, что это достаточно конкретно. Есть идеи?

https://maps.googleapis.com/maps/api/geocode/json?key={api_key}&address={postal_code}&language=de&region=de&components=country:DE&sensor=false

1 ответ

Решение

Поскольку вы указываете, что проблема не в заданном адресе, а в "случайном" поведении, это может подпадать под документально подтвержденное поведение другого "известного" API.

Как и в других случаях, рекомендуемой стратегией является экспоненциальный откат для API геокодирования, что в основном означает, что вы должны повторить попытку после определенной задержки.

В случае, если приведенная выше ссылка не работает или изменяется, я цитирую статью:

Экспоненциальный откат

В редких случаях что-то может пойти не так, обслуживая ваш запрос; Вы можете получить HTTP-код ответа 4XX или 5XX, или TCP-соединение может просто оборваться где-то между вашим клиентом и сервером Google. Часто стоит повторить запрос, так как последующий запрос может быть успешным, если исходный сбой. Тем не менее, важно не просто циклически повторять запросы на серверы Google. Такое зацикленное поведение может привести к перегрузке сети между вашим клиентом и Google, что вызовет проблемы у многих сторон.

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

Например, рассмотрим приложение, которое хочет сделать этот запрос к API часового пояса Карт Google:

https://maps.googleapis.com/maps/api/timezone/json?location=39.6034810,-119.6822510×tamp=1331161200&key=YOUR_API_KEY

В следующем примере Python показано, как сделать запрос с экспоненциальной задержкой:

import json
import time
import urllib
import urllib2

def timezone(lat, lng, timestamp):
    # The maps_key defined below isn't a valid Google Maps API key.
    # You need to get your own API key.
    # See https://developers.google.com/maps/documentation/timezone/get-api-key
    maps_key = 'YOUR_KEY_HERE'
    timezone_base_url = 'https://maps.googleapis.com/maps/api/timezone/json'

    # This joins the parts of the URL together into one string.
    url = timezone_base_url + '?' + urllib.urlencode({
        'location': "%s,%s" % (lat, lng),
        'timestamp': timestamp,
        'key': maps_key,
    })

    current_delay = 0.1  # Set the initial retry delay to 100ms.
    max_delay = 3600  # Set the maximum retry delay to 1 hour.

    while True:
        try:
            # Get the API response.
            response = str(urllib2.urlopen(url).read())
        except IOError:
            pass  # Fall through to the retry loop.
        else:
            # If we didn't get an IOError then parse the result.
            result = json.loads(response.replace('\\n', ''))
            if result['status'] == 'OK':
                return result['timeZoneId']
            elif result['status'] != 'UNKNOWN_ERROR':
                # Many API errors cannot be fixed by a retry, e.g. INVALID_REQUEST or
                # ZERO_RESULTS. There is no point retrying these requests.
                raise Exception(result['error_message'])

        if current_delay > max_delay:
            raise Exception('Too many retry attempts.')
        print 'Waiting', current_delay, 'seconds before retrying.'
        time.sleep(current_delay)
        current_delay *= 2  # Increase the delay each time we retry.

tz = timezone(39.6034810, -119.6822510, 1331161200)
print 'Timezone:', tz

Конечно, это не разрешит упомянутые вами "ложные ответы"; Я подозреваю, что это зависит от качества данных и не происходит случайно.

Другие вопросы по тегам