Ошибки времени ожидания Google Cloud Datastore в python

У меня есть таблица в Google Cloud Datastore, где я храню небольшую структуру данных, которая написана в одном сервисе Python и прочитана в другом. Я использую gcloud версии 0.15.0. Вот код Python, который я использую для записи / чтения данных в / из GCD:

from gcloud import datastore
import datetime
import json
class GCD(object):
def __init__(self, project_id):
    self.client = datastore.Client(project_id)

def put(self, table, key, data):
    with self.client.transaction():
        entity = datastore.Entity(self.client.key(table, key), exclude_from_indexes=['context'])
        entity.update({'context': json.dumps(data), 'created': datetime.datetime.utcnow(), 'done': True})
        try:
            self.client.put(entity)
        except Exception as e:
            print "GCD save failed with exception: %s" % e
    return None

def get(self, table, key):
    entity_key = self.client.key(table, key)
    entity = None
    try:
        entity = self.client.get(entity_key)
    except Exception as e:
        print "GCD read failed with exception: %s" % e
    if not entity:
        return None
    else:
        return json.loads(entity['context'])

Я наблюдаю большое количество ошибок чтения / записи с сообщением "Время операции чтения истекло"; >5% отказов, что весьма противоречит документации, в которой упоминается ожидаемая частота отказов 1 на 30K.

Мои вопросы тогда:

  1. Можно ли увеличить время ожидания в вызовах datastore.client.get и datastore.client.put? Я не ищу ответы, основанные на повторных попытках; уже пытался и не хочу зависеть только от повторов.

  2. Что я должен делать при создании таблицы или настройке клиента, который может уменьшить эти ошибки тайм-аута?

  3. Я где-то читал ( https://github.com/GoogleCloudPlatform/gcloud-python/issues/1214), что Python gcloud использует httplib2.Http, который не является потокобезопасным и имеет проблемы с таймаутом. Есть ли способ использовать (более стабильный) пакет запросов Python?

Спасибо,

1 ответ

Ты можешь использовать requests или же urllib3 без проблем смотрите https://google-auth.readthedocs.io/en/latest/user-guide.html

AFAIK Тайм-аут запросов по умолчанию - None, поэтому он ждет бесконечно (пока сервер его не закроет.) Вы можете передать собственный Session к AuthorizedSession также, которые перекрывают request метод и устанавливает время ожидания по умолчанию, как вам нравится.

Если проблема не устранена, я рекомендую использовать механизм повторных попыток:-). По этой причине https://github.com/GoogleCloudPlatform/google-cloud-python/issues/2694