5

我目前正在尝试使用工作者 socketio.sgunicorn.GeventSocketIOWorker 使用 gunicorn 服务器在多个工作者之间扩展gevent - socketio。我在存在 websockets 时使用它,否则我会强制 XHR 轮询(对于 IE 等)。

XHR-polling 需要一个会话来跟踪以下民意调查,但是一旦我从一个到两个或更多工作人员,请求开始在它们之间传播,这意味着状态丢失并且一切都崩溃了。

我认为以下代码行是相关的: https://github.com/abourget/gevent-socketio/blob/master/socketio/handler.py#L104-106 我想我需要一些其他存储引擎,例如redis我正在使用常规的 pubsub-actions,但这在实际库的深处。

所以我的问题是如何在我的应用程序中全局从内存中的会话存储转到另一个后端引擎(它是否优雅地覆盖了上面链接中的会话代码?)无需修改库本身?类似于 php.ini 中的 PHP 会话指令。我想可以说这是一个非常通用的python问题,但我很难找到相关信息,而且我也不确定它是否适用于这个库。

或者,我如何在不同的工作人员和服务器之间使用 gevent-socketio 的 xhr-polling 传输(没有粘性)?

谢谢!

4

3 回答 3

3

这显然是socketio的一个限制。从我在网上看到的情况来看,会话处理通常是在 web 框架层而不是 web 服务器层完成的。socketio 尝试在其自己的较低层上执行此操作,并且以有限的方式执行此操作。我猜作者认为一个成熟的解决方案将是一个矫枉过正。在你的情况下,他们被证明是错误的。

只有两种方法可以克服需要更改逻辑的限制:修补源代码和在运行时修补。选择最让你满意的(或者,好吧,最不讨厌的:^))。对于第二个选项,我建议request_tokens用具有相同接口的另一个实体替换和/或创建它的代码。由于第 1 段中所述的原因,我真的认为 socketio 作者可能会接受一个源补丁,如果您提出一个,它将允许它利用外部会话处理机制。

会话信息的标准位置是:共享内存、文件、数据库。我建议您更改逻辑,使 socketio 使用与您的 Web 框架(或任何组成您的页面)相同的机制。

于 2012-10-28T12:30:21.303 回答
0

看看这里的例子:

https://github.com/abourget/gevent-socketio/tree/master/examples/pyramid_backbone_redis_chat_persistence

它展示了如何使用 redis 作为分布式消息队列

于 2012-11-23T13:02:59.447 回答
0

只是一个想法,因为我有同样的问题;而不是让 gunicorn 分叉(使用 -w 标志),也许您可​​以在不同的端口上生成多个 gunicorn 进程,然后使用 nginx 使用带有“粘性”会话的“上游”块来平衡它们。我相信这就是 nodejs 实现在不与 Redis 共享状态时如何处理工作人员的多处理。

于 2015-03-19T21:36:59.613 回答