App Engine Flexible无法将数据存储区与websockets示例一起使用

时间:2019-01-29 04:05:33

标签: python websocket app-engine-flexible

我尝试将websockets示例项目添加到数据存储项目中,并且websockets正常工作,但是当页面查询数据存储或尝试放置新实体时,我收到502响应。在日志中,它在服务工作者上显示严重错误。如果我删除了websocket代码,则数据存储区代码将按预期工作。我唯一看到的区别是应用示例的入口点略有不同

websocket示例使用

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

数据存储区示例使用时

entrypoint: gunicorn -b :$PORT main:app

websocket示例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 :(得分:1)

作为安德鲁回答的补充,您可以扩展gunicorn worker类以运行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

答案 1 :(得分:0)

正如您所说,flask_socket.worker似乎有问题,我已经对其进行了测试,但不适用于数据存储区客户端。

我已经尝试过使用{letter worker}与Flask-SocketIO framework一起使用,并且数据存储区查询工作正常。

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

此外,您还需要在requirements.txt文件eventlet==0.24.1

中添加eventlet模块。

其缺点是,它破坏了与websocket代码的兼容性,因此您需要重写此部分。请记住,代码示例仅打算在几行中显示如何使用Google Cloud产品并复制粘贴它们,而无需修改app.yaml中不需要的配置。

答案 2 :(得分:0)

问题似乎是GRPC(Cloud Datastore客户端的默认传输机制)与gevent不兼容。除了使用其他websockets框架之外,您还可以使用以下代码通过激活grpc的gevent兼容性补丁来解决此问题:

import grpc.experimental.gevent as grpc_gevent
grpc_gevent.init_gevent()
相关问题