Какой хороший аналог Flask/Python/WSGI для общей памяти PHP Apache хранится как apc_store/apc_fetch?

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

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

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

Ответ 1

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

Наша игровая среда выполнена.

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

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

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

Ответ 2

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

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

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

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