PHP Apache 共享内存存储(如 apc_store/apc_fetch)有啥好的 Flask/Python/WSGI 模拟?

Posted

技术标签:

【中文标题】PHP Apache 共享内存存储(如 apc_store/apc_fetch)有啥好的 Flask/Python/WSGI 模拟?【英文标题】:What's a good Flask/Python/WSGI analog to the PHP Apache shared memory stores like apc_store/apc_fetch?PHP Apache 共享内存存储(如 apc_store/apc_fetch)有什么好的 Flask/Python/WSGI 模拟? 【发布时间】:2011-06-25 07:07:02 【问题描述】:

我已经用 php 进行了几年的大型游戏服务器开发。负载均衡器将传入请求委托给集群中的一台服务器。为了更好的性能,我们开始使用apc_storeapc_fetch直接在Apache共享内存中缓存集群中每个实例上的所有静态数据(本质上是游戏世界的模型对象)。

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

我们可以用什么代替?

【问题讨论】:

【参考方案1】:

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

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

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

根据您希望键/值存储提供的其他功能,您可能还想研究一些替代方案,例如 mongodb (http://www.mongodb.org/)。

【讨论】:

我将集中式 Membase 用于我的真实数据存储,并将集中式 Memcache 用于临时键/值。正如我在帖子中提到的,重点是“避免从我们的主 Memcached 集群通过网络传输相当大的模型对象”。在之前的游戏中对本地内存进行这种更改给了我巨大的性能提升。像这样的游戏的整个静态数据集小于 50mb,因此存储/加载不是问题。毕竟,无论如何,您最终都必须将其拉入本地内存;如果它存储在那里就更好了:) 基本前提是必须集中的数据要集中,不能推送到应用服务器的数据(即静态/游戏世界数据,无状态,跨节点相同)要推送到应用服务器。 对不起,我不能接受这个答案,因为它忽略了我的任务中的两个重要点:[1] 我只是在谈论静态数据,[2] 我已经使用集中式 Memcached。跨度> 好的,我现在明白了,我假设静态数据仍然是每个用户(对于他们的游戏实例)而不是共享的。因此,您在 Flask 中对 apc_store 和 apc_fetch 的等效性将是使用 Werkzeug 缓存库link,它至少为您提供了最终要用于缓存的系统的抽象(即使您决定使用 memcached) 我还想知道您是否可以使用 membase server link 之类的东西,并在您的每台服务器上运行一个实例。然后您可以使用它将静态内容复制到所有节点,但每个服务器都可以连接到其本地实例。不是我有直接经验的东西,但它可能适用于这种情况。【参考方案2】:

[五个月后]

我们的游戏框架已经完成。

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

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

我现在意识到我最初的问题很幼稚,因为与 LAMP 堆栈不同,Flask 服务器在请求之间保持运行,服务器的内存本身是“共享内存”——不需要像 APC 这样的东西。事实上,任何东西在它自己和Flask's threadsafe local store的请求处理范围之外,都可以被认为是“共享内存”。

【讨论】:

以上是关于PHP Apache 共享内存存储(如 apc_store/apc_fetch)有啥好的 Flask/Python/WSGI 模拟?的主要内容,如果未能解决你的问题,请参考以下文章

在 Apache 上的 PHP 中的线程之间共享数据

增加 PHP 内存限制(Apache、Drupal6)

PHP共享内存

PHP共享内存段实现,使用shmop函数实现内存共享

PHP共享内存详解

php操作共享内存shmop类及简单使用测试(代码)