Какой хороший Flask / Python / WSGI аналог хранилищ разделяемой памяти PHP Apache, таких как apc_store / apc_fetch? - PullRequest
10 голосов
/ 11 февраля 2011

Я пару лет занимался крупномасштабной разработкой игрового сервера на PHP. Балансировщик нагрузки делегирует входящие запросы одному серверу в кластере. Во имя повышения производительности мы начали кэшировать все статические данные (в основном объекты модели игрового мира) в каждом из экземпляров этого кластера, непосредственно в разделяемой памяти Apache, используя apc_store и apc_fetch.

По ряду причин мы сейчас начинаем разрабатывать подобный игровой фреймворк на Python, используя микрофрейм Flask. На первый взгляд, хранилище памяти этого экземпляра - это та часть, которая, похоже, не переводит напрямую в Python / Flask. В настоящее время мы рассматриваем возможность запуска Memcached локально для каждого экземпляра (чтобы избежать потоковой передачи довольно больших объектов модели по проводам из нашего основного кластера Memcached).

Что мы можем использовать вместо этого?

Ответы [ 2 ]

5 голосов
/ 16 февраля 2011

Я думаю, что даже в этом случае вам может потребоваться централизованная система хранения ключей / значений, а не ряд независимых систем на каждом сервере.Если только ваш балансировщик нагрузки не перенаправляет одних и тех же пользователей на одни и те же серверы, вы можете столкнуться с ситуацией, когда запросы пользователя направляются на разные серверы каждый раз, поэтому каждому узлу придется получать состояние игры, а не обращаться к нему из общего кэша.

Кроме того, нехватка памяти, которую может вызвать локальное хранилище ключей / значений в каждой системе, может замедлить другие функции вашего игрового сервера.Хотя это в значительной степени зависит от объема кэшируемых данных.

В общем, лучшим подходом будет запуск некоторых тестов, чтобы увидеть, какую производительность вы получите с кластером memcached и типами объектов, которые вы используете.хранение по сравнению с локальным хранилищем.

В зависимости от того, какие другие функции вы хотите получить от хранилища ключей / значений, вы также можете рассмотреть некоторые альтернативы, такие как mongodb (http://www.mongodb.org/).

2 голосов
/ 21 февраля 2011

[Пять месяцев спустя]

Наша игровая среда готова.

В конце мы решили сохранить статические данные в полностью инициализированных экземплярах модели sqlalchemy на каждом веб-сервере.Когда разогревающийся игровой сервер разогревается, эти экземпляры сначала создаются путем нажатия на общую базу данных MySQL.

Поскольку наши фабрики Model откладываются до пула экземпляров, экземпляры Model необходимо создавать только один раз для каждого развертывания.сервер - это важно, потому что в нашем масштабе MySQL будет плакать при любой нагрузке.Мы достигли нашей цели , а не потоковой передачи этих данных по проводной связи, сохранив определения элементов как можно ближе к коду нашего приложения: в самом коде приложения.

Теперь я понимаю, что мой оригиналвопрос был наивным, потому что в отличие от стека LAMP сервер Flask продолжает работать между запросами, сама память сервера является «разделяемой памятью» - для этого не нужно что-то вроде APC.Фактически, что-либо вне области обработки запроса само по себе и Потокобезопасное локальное хранилище Flask , можно считать "общей памятью".

...