это membase хороший уровень устойчивости на сервер Эрланг геймер?


Я стремлюсь создать браузерную игру, в которой игроки могут создавать здания.

Каждое здание будет иметь несколько модулей (двигатели, офисы, производственные линии,...). Каждый модуль будет иметь enentually одно или несколько выполняемых действий, таких как создание 2oo 'item X' с ингредиентами Y, Z.

Игровой сервер будет настроен с помощью erlang: OTP-приложение в качестве самого сервера, а Nitro - веб-интерфейс. Мне нужно постоянство данных. Я думал о следующем:

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

Но когда здание не получает никаких сообщений в течение X секунд или минут, он завершит работу (благодаря таймауту gen_server feature) и вернуть его текущее состояние обратно в базу данных.

Итак, поскольку это будет (мягкая) игра в реальном времени, gen_server должен быть настроен очень быстро. Я думал о membase Как базе данных, потому что она, как известно, имеет очень хорошее время отклика.

Мой вопрос: когда сервер gen работает, его состояния заполняют некоторую память, и это состояние присутствует в памяти, обрабатываемой membase тоже, поэтому состояние использует в два раза больше его размера в памяти. Разве это плохой дизайн ?

Является ли membase хорошим решением для обработки настойчивости в моем случае ? будет ли использование мнезии лучшим выбором или что-то еще ?

Я боюсь mnesia 2 Go (или 4 ?) ограничение размера таблицы, потому что я не знаю на данный момент средний размер состояния моих gen_servers (здания в этом примере, но также игроки, производственные линии, что угодно), и у меня может быть когда-нибудь больше, чем 1 Игрок :)

Спасибо

2 5

2 ответа:

Я согласен с Хайнек-Пичи-выходил. РИАК-отличная вещь для хранения ключей-Вали.

Мы используем Riak почти на 95% для того же самого, что вы описали. Все работает до сих пор без каких-либо проблем. В случае, если вы столкнетесь с ограничением производительности Riak-добавьте больше узлов,и это хорошо!

Еще одна интересная вещь в Riak - это его очень низкая производительность с течением времени. Дополнительную информацию о бенчмаркинге Riak вы можете найти здесь: http://joyeur.com/2010/10/31/riak-smartmachine-benchmark-the-technical-details/

В случае, если вы идете с ним:

О membase и использовании памяти: я также попробовал membase, но обнаружил, что он не подходит для моих задач - (membase объявляет отказоустойчивость, но я не смог настроить это так, как должно работать с ошибками, даже с помощью membase ребят у меня не получилось). Поэтому на данный момент я использую следующую архитектуру: все игроки, которые находятся в онлайне и играют в игру, представлены как игроки-процессы (gen_server). Все данные и бизнес-логика для каждого игрока находятся в его игропроцессе. Время от времени каждый игрок-процесс решает сохранить свое состояние в риаке.

Пока кажется, что это очень быстрый и эффективный подход.

Обновление: теперь мы имеем дело с PostgreSQL. Это потрясающе!

Вы можете посмотреть на bitcask или другие Riak backends для хранения ваших данных. Избегать IPC, безусловно, хорошая идея, так что держите его внутри Эрланга.