App Engine Flexible не может использовать хранилище данных с примером websockets - PullRequest
0 голосов
/ 29 января 2019

Я попытался добавить пример проекта websockets в проект хранилища данных, и websockets работают, но когда страница запрашивает хранилище данных или пытается поместить новую сущность, я получаю ответ 502.В журналах это показывает критическую ошибку на сервисном работнике.Если я удалю код веб-сокета, код хранилища данных будет работать как положено.Единственное отличие, которое я вижу, это то, что точки входа для примеров приложений немного отличаются

в примере веб-сокета используется

entrypoint: gunicorn -b :$PORT -k flask_sockets.worker main:app

, в то время как в образце хранилища данных используется

entrypoint: gunicorn -b :$PORT main:app

образец веб-сокетаhttps://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/flexible/websockets

образец хранилища данных https://github.com/GoogleCloudPlatform/python-docs-samples/tree/master/appengine/flexible/datastore

Ответы [ 3 ]

0 голосов
/ 11 мая 2019

Проблема заключается в том, что GRPC (механизм транспорта по умолчанию клиента Cloud Datastore) не совместим с gevent.Помимо использования другой инфраструктуры веб-сокетов, вы можете обойти эту проблему, активировав патч совместимости gevent для grpc, используя следующий код:

import grpc.experimental.gevent as grpc_gevent
grpc_gevent.init_gevent()
0 голосов
/ 14 мая 2019

В дополнение к ответу Эндрю вы можете расширить рабочий класс gunicorn для запуска приложений gRPC.

# gevent_grpc_worker.py
from gunicorn.workers.ggevent import GeventWorker
from grpc.experimental import gevent


class GeventGrpcWorker(GeventWorker):
    def patch(self):
        super(GeventGrpcWorker, self).patch()
        gevent.init_gevent()
        self.log.info('patched grpc')
# config.py for gunicorn
import multiprocessing
from gevent_grpc_worker import GeventGrpcWorker


# http://docs.gunicorn.org/en/stable/design.html#how-many-workers
workers = multiprocessing.cpu_count() * 2 + 1
worker_connections = 10000
# Use an asynchronous worker as most of the work is waiting for websites to load
worker_class = '.'.join([GeventGrpcWorker.__module__,
                         GeventGrpcWorker.__name__])
timeout = 30

Затем запустить управляемое приложение с помощью:

gunicorn -c config.py app:app
0 голосов
/ 05 февраля 2019

Как вы сказали, кажется, что есть проблема с flask_socket.worker, я протестировал его, и он не работает с клиентом хранилища данных.

Я пробовал с инфраструктурой Flask-SocketIO с использованием обработчика событий и запросов к хранилищу данных работают нормально.

entrypoint: gunicorn -b :$PORT --worker-class eventlet -w 1 main:app

Также вам необходимо добавить модуль событий в файл require.txt eventlet==0.24.1

Недостатком этого является то, что он нарушает совместимость сКод веб-сокета, поэтому вам нужно переписать эту часть.Помните, что примеры кода предназначены только для того, чтобы показать в нескольких строках, как использовать продукты Google Cloud и скопировать их без изменения конфигурации, указанной в app.yaml, не очень хорошая идея.

...