Проблемы с очередями push-уведомлений на управляемой виртуальной машине Google App Engine / гибкой среде

У меня возникли проблемы с использованием очередей push-уведомлений в гибкой среде Google App Engine (официально называемой их управляемой средой виртуальных машин). Я получаю многочисленные 404 Instance Unavailable (см. рисунок ниже).

После небольшого анализа я пришел к выводу, что эти ошибки могут быть связаны с тем, что я добавляю задачу в очередь задач, а затем развертываю новую версию экземпляра гибкой виртуальной машины. Очередь задач, которую я передал ранее, заблокирована для более старого экземпляра и больше не может работать. Так ли работают очереди задач с гибкой виртуальной машиной? Если да, то как использовать push-очереди задач с гибкой виртуальной машиной?

экземпляр очереди задач недоступен


person speedplane    schedule 18.05.2016    source источник


Ответы (3)


Я на 90% закончил переход на гибкую среду, когда столкнулся с той же проблемой. После обширных исследований я пришел к выводу, что есть три варианта:

REST API (экспериментальный)

Используйте бета-версию REST API для очередей задач (это, как и все другие API-интерфейсы Google из гибкой среды, является внешним, поэтому вам нужно правильно обращаться с аутентификацией).

Справочник по REST API: https://cloud.google.com/appengine/docs/python/taskqueue/rest/

Обратите внимание, что это внешний и экспериментальный. Найти, например. java sdk без какой-либо значимой документации здесь: https://developers.google.com/api-client-library/java/apis/ (текущая версия: https://developers.google.com/api-client-library/java/apis/taskqueue/v1beta2)

Совместимая среда выполнения

Создайте собственную гибкую среду на основе среды выполнения -compat. Это предлагает старый appengine API в контейнере, подходящем для гибкой среды:

https://cloud.google.com/appengine/docs/flexible/custom-runtimes/build (ищите изображения со словом "ДА" в последнем столбце)

например: https://cloud.google.com/appengine/docs/flexible/java/dev-jetty9-and-apis

https://cloud.google.com/appengine/docs/flexible/java/migrating-an-existing-app

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

Прокси-сервис

Своего рода хакерская альтернатива, но она выполняет свою работу: создайте очень тонкую стандартную службу-оболочку среды, которая проксирует задачи в/из вашей очереди. Передайте их своему собственному приложению, как хотите. ¯\_(ツ)_/¯

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

В итоге я получил вариант этого, где я использую прокси-сервис в стандартной среде, но просто перенес свой возможный обработчик задач в AWS Lambda (так что он полностью отключен от GAE). Это другая катастрофа, но более управляемая.

Удачи!

person hraban    schedule 06.10.2016

Я технический руководитель и менеджер по этому продукту.

На ваш вопрос есть два разных ответа.

Во-первых, кажется, что у вас проблема с маршрутизацией версий — как вы говорите, задачи не могут выполняться для виртуальной машины, потому что вы запустили новую версию. По умолчанию задачи назначаются для выполнения в версии, из которой они были поставлены в очередь, чтобы избежать несоответствия версий. У вас должна быть возможность переопределить версию, повторно настроив цель в файле queue.yaml (или queue.xml). Документацию по этому вопросу можно найти здесь. Возможно, вам также придется посмотреть на свой

С более широкой точки зрения, построение пути миграции от стандартной/только MVM поддержки очередей задач в настоящее время является нашим наивысшим приоритетом.

Заменой является Cloud Tasks, который предоставляет тот же интерфейс, но может использоваться полностью независимо от App Engine. Он существует в той же вселенной, что и очереди задач AppEngine, поэтому вы сможете добавлять задачи в существующие очереди (как push, так и pull). В настоящее время он доступен в закрытой альфа-версии. Вы можете зарегистрироваться, чтобы присоединиться к альфа-версии здесь.

Мы настоятельно рекомендуем не писать новый код для REST API. Он не поддерживается, и альфа-версия облачных задач уже значительно более полнофункциональна.

person nhanssens    schedule 20.07.2017

Я поддерживаю ответ Храбана (в конце концов, он боролся с дьяволом), но предоставляю здесь дополнительный ответ.

Имейте в виду, что гибкая среда (управляемые виртуальные машины) по-прежнему является просто экземпляром вычислительного движка... и Google хорошо справляется с извлечением функций из AppEngine, чтобы сделать их доступными прозрачным образом. TaskQueues не совсем справились. Внимательно следите за облачной библиотекой — это механизм, с помощью которого DataStore становится пригодным для использования (для Java перейдите по адресу http://googlecloudplatform.github.io/google-cloud-java/0.3.0/index..html). Если вы перейдете по этой ссылке, вы также можете выбрать другие языки. У меня есть официальное сообщение о том, что TaskQueues все еще находятся в дорожной карте (но нет ETA).

На данный момент вы не можете использовать REST API для постановки в очередь PUSH-очередей. Теперь я решил решить эту проблему, используя REST API и создав очередь PULL для размещения задач. Затем я опрашиваю эту очередь внутри службы AppEngine (то есть модуля) и помещаю ее в очередь задач PUSH. Почему я иду на все эти проблемы? Потому что мне нужно выполнение по расписанию... а это функция, которую в AppEngine могут дать только TaskQueues. Поэтому я упаковываю свою задачу в конверт, а затем распаковываю и повторно помещаю ее в очередь задач. Звучит безумно? У меня работает надежно. Не пугайтесь того факта, что API REST является «альфа».

Я скажу, что если вы начинаете что-то новое, обратите внимание на Pub/Sub API. .

person Robert    schedule 22.10.2016