什么是一个好的Flask/Python/WSGI类似于PHP Apache共享内存存储,如apc_store/apc_fetch?

Kyl*_*ild 10 python apache memcached wsgi flask

我用PHP做了几年的大规模游戏服务器开发.负载均衡器将传入请求委派给群集中的一个服务器.以更好的性能为名,我们开始使用apc_store和直接在Apache共享内存中缓存该集群中每个实例上的所有静态数据(本质上是游戏世界的模型对象)apc_fetch.

出于多种原因,我们现在开始使用Flask微框架在Python中开发类似的游戏框架.乍一看,这个实例的内存存储是一个似乎不直接转换为Python/Flask的内存.我们目前正在考虑在每个实例上本地运行Memcached(以避免从我们的主Memcached集群中通过线路传输相当大的模型对象.)

我们可以用什么呢?

efa*_*ner 5

我认为即使在这种情况下,您也可以考虑在每台服务器上使用集中式密钥/值存储系统而不是一系列独立的密钥/值存储系统.除非您的负载均衡器始终将相同的用户重定向到相同的服务器,否则您可能会遇到用户的请求每次都路由到不同服务器的情况,因此每个节点都必须检索游戏状态而不是从共享缓存中访问它.

此外,每个系统上存储的本地键/值可能导致的内存压力可能会降低游戏服务器的其他功能.虽然这在很大程度上取决于缓存的数据量.

一般来说,最好的方法是运行一些基准测试,以查看使用memcached群集获得的性能类型以及存储的对象类型与本地存储的性能.

根据您希望从键/值存储中获得的其他功能,您可能还需要查看一些替代方法,例如mongodb(http://www.mongodb.org /).


Kyl*_*ild 2

【五个月后】

\n\n

我们的游戏框架就完成了。

\n\n

最后,我们决定将静态数据存储在每个 Web 服务器中完全初始化的 sqlalchemy 模型实例中。当新启动的游戏服务器预热时,这些实例首先通过访问共享 MySQL 数据库来构建。

\n\n

由于我们的模型工厂遵循实例池,因此每个服务器的每次部署只需构建一次模型实例 \xe2\x80\x93 这很重要,因为在我们的规模下,MySQL 会在任何类型的持续负载下哭泣。我们通过将项目定义尽可能靠近我们的应用程序代码(在应用程序代码本身中)来实现不通过网络传输此数据的目标。

\n\n

我现在意识到我原来的问题很天真,因为与 LAMP 堆栈不同,Flask 服务器在请求之间保持运行,服务器的内存本身是“共享内存”\xe2\x80\x93 不需要像 APC 这样的东西就可以做到这一点。事实上,请求处理范围之外的任何内容以及Flask 的线程安全本地存储都可以被视为“共享内存”。

\n