App Engine的灵活的不能使用的数据存储使用WebSockets示例

问题描述 投票:0回答:3

我试图加入的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

python websocket app-engine-flexible
3个回答
0
投票

至于你说的好像还有与flask_socket.worker一个问题,我已经测试它,它不会与数据存储客户端。

我曾尝试使用该eventlet工作者Flask-SocketIO framework和数据存储区查询做工精细。

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

你也需要添加eventlet模块中的requirements.txt文件eventlet==0.24.1

这种方法的缺点是,它打破了WebSocket的代码兼容性,所以你需要重写这一部分。请记住,代码示例只是意在几行字来说明如何使用谷歌的云产品,并将它们复制粘贴,而无需修改在app.yaml中undelied配置不是一个好主意。


1
投票

安德鲁的回答的补充,可以延长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
投票

这个问题似乎是GRPC(在云存储客户端的默认传输机制)是不兼容GEVENT。除了使用不同的WebSockets框架,可以解决该问题通过激活GRPC的GEVENT兼容性补丁,使用下面的代码:

import grpc.experimental.gevent as grpc_gevent
grpc_gevent.init_gevent()
© www.soinside.com 2019 - 2024. All rights reserved.