Я пытаюсь очистить и привести свой код в форму, похожую на 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 секунд после начала выполнения).