5

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

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?

Спасибо,

+0

Примерно как часто являются призывы положить() и получить()? – Adam

ответ

0

Вы можете использовать requests или urllib3 без каких-либо проблем, см https://google-auth.readthedocs.io/en/latest/user-guide.html#making-authenticated-requests

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

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

Смежные вопросы