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

Я пытаюсь очистить и привести свой код в форму, похожую на prod, но у меня много проблем с prod env из движка Google App. На локальном все работает без проблем, но каждый раз, когда я пытаюсь протестировать на prod, у меня возникают проблемы со сроками и тайм-аутом. Мои вопросы: 1) Какова наилучшая/рекомендуемая практика для отправки ОДНОЙ и той же карты с ОДНИМ и тем же приложением (видео) многим пользователям из моей стеклянной посуды. Это классы, которые вызываются из очереди:

class batchWorker(webapp2.RequestHandler):
def post(self):
    userToPush = self.request.get('user_id')
    #posting video
    media_link = util.get_full_url(self, '/static/video/short_from_glass_low.mp4')
    resp = urlfetch.fetch(media_link, deadline=2000)
    media_video = MediaIoBaseUpload(io.BytesIO(resp.content), mimetype='video/mp4',
                                        resumable=False)
    users = Credentials.all()
    for user in users:
            creds = StorageByKeyName(Credentials, user.key().name(), 'credentials').get()
            mirror_service = util.create_service('mirror', 'v1', creds)
            #first card
            timeline_item01 = {'text':'New video from bundle - Test002'}
            timeline_item01['bundleId'] = 'video_001'
            timeline_item01['isBundleCover'] = 'true'
            mirror_service.timeline().insert(body=timeline_item01).execute()
            #second card
            timeline_item = {'text': 'Text here'}
            timeline_item['isBundleCover'] = 'false'
            timeline_item['bundleId'] = 'video_001'
            mirror_service.timeline().insert(body=timeline_item, media_body=media_video).execute()
            logging.info("Posted video for user %s" % user.key().name())

Вот как я помещаю его в очередь:

taskqueue.add(url='/worker', params={'user_id': '103012621006129330069'})

Некоторое время я делал это, некоторые другие я получил журнал следующим образом:

2013-08-01 07:15:37.695 /worker 500 6481ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
I 2013-08-01 07:15:31.676 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:31.677 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:31.711 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:31.712 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:31.713 URL being requested: https://www.googleapis.com/discovery/v1/apis/mirror/v1/rest?userIp=0.1.0.2
I 2013-08-01 07:15:31.770 URL being requested: https://www.googleapis.com/mirror/v1/timeline?alt=json
I 2013-08-01 07:15:32.675 URL being requested: https://www.googleapis.com/upload/mirror/v1/timeline?uploadType=multipart&alt=json
E 2013-08-01 07:15:37.685 The API call urlfetch.Fetch() took too long to respond and was cancelled. Traceback (most recent call last): File "/base/data/home/runtimes/python27

некоторые другие я получил это:

2013-08-01 07:15:11.066 /worker 500 7239ms 0kb AppEngine-Google; (+http://code.google.com/appengine)
I 2013-08-01 07:15:04.434 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.439 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.527 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.528 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.529 URL being requested: https://www.googleapis.com/discovery/v1/apis/mirror/v1/rest?userIp=0.1.0.2
I 2013-08-01 07:15:04.587 URL being requested: https://www.googleapis.com/mirror/v1/timeline?alt=json
I 2013-08-01 07:15:04.620 Refreshing due to a 401
I 2013-08-01 07:15:04.628 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.629 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.630 Refreshing access_token
I 2013-08-01 07:15:04.833 make: Got type <class 'google.appengine.api.datastore_types.Blob'>
I 2013-08-01 07:15:04.834 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.839 validate: Got type <class 'oauth2client.client.OAuth2Credentials'>
I 2013-08-01 07:15:04.839 get: Got type <class 'model.Credentials'>
I 2013-08-01 07:15:05.970 URL being requested: https://www.googleapis.com/upload/mirror/v1/timeline?uploadType=multipart&alt=json
E 2013-08-01 07:15:10.985 Deadline exceeded while waiting for HTTP response from URL: https://www.googleapis.com/upload/mirror/v1/timeline?uploadType=multipart&alt=json Traceba

На данный момент я немного обескуражен, так как могу на 100% понять логику, но реализация продукта - это боль.

Нужно ли использовать пакетные вызовы, чтобы проталкивать карты одну за другой? есть другой подход? Почему я сталкиваюсь с ошибкой крайнего срока, когда процессы очереди должны иметь крайний срок 10 минут (ошибка крайнего срока возникает через 10 секунд после начала выполнения).


person FaustoDassenno    schedule 01.08.2013    source источник


Ответы (2)


Тайм-аут на самом деле исходит из вашего запроса на загрузку, вы можете исправить это, изменив код, который создает экземпляр службы (util.create_service), и установите аргумент timeout при создании экземпляра объекта httplib2.Http:

# Instantiate an Http instance
http = httplib2.Http(timeout=2000) # Use a bigger value if you want to stay safe.

Что касается пакетной обработки запроса, к сожалению, API не поддерживает смешивание пакетных запросов и запросов на загрузку мультимедиа...

person Alain    schedule 01.08.2013

Я думаю, что строка:

 resp = urlfetch.fetch(media_link, deadline=2000)

пытается установить крайний срок для этого запроса в 2000 секунд, но:

Из документации: максимальный срок (обработчик запроса) 60 секунд Таким образом, ваш срок будет проигнорирован или вернется к значению по умолчанию.

person Steve Barnes    schedule 01.08.2013
comment
Нет, в документации сказано, что: крайний срок: крайний срок в секундах для операции. - person FaustoDassenno; 01.08.2013