Каков идиоматический способ сопоставления идентификаторов с процессами в OTP/Erlang?

У меня есть игровой сервер, на котором размещено несколько экземпляров игры. Игроки могут ввести идентификатор, чтобы присоединиться к текущей игре. Чтобы связать клиента с нужным экземпляром игры, у меня есть таблица ETS, которая сопоставляет идентификаторы игр с PID процесса Erlang, обрабатывающего этот конкретный экземпляр игры. Хотя это работает, мне не очень нравится использовать ETS, поскольку он создает глобальные данные, которые не находятся под контролем какого-либо одного процесса.

Я хочу знать следующее: Есть ли в Erlang/OTP идиоматический способ сопоставления идентификаторов с процессами? Можно ли использовать ETS в этом случае, поскольку данные по своей сути являются глобальными? Или у меня должен быть один процесс, в котором хранится словарь всех идентификаторов для обработки сопоставлений? Я чувствую, что это больше стиль Erlang, но может быть не таким производительным или параллельным. Я также наткнулся на gproc, просматривая другие ответы SO, которые кажутся улучшенным словарем процессов. Однако у меня сложилось впечатление, что использование словаря процесса не одобряется (согласно стандарту erlang. веб-страницу организации).


person kjw0188    schedule 14.06.2012    source источник
comment
gproc (rustyklophaus.com/articles/) вполне нормально. Известно, что он более стабилен/улучшен по сравнению со встроенным словарем процессов. Вы также можете использовать mnesia оперативные таблицы, но я думаю, что ETS тоже подойдет.   -  person Muzaaya Joshua    schedule 14.06.2012
comment
Взгляните на этот вопрос stackoverflow.com/questions/5319553/   -  person loxs    schedule 14.06.2012


Ответы (1)


ETS tables могут управляться данным процессом/генеральным_сервером, и их владение может передаваться от процесса к процессу в трудные времена через ets:give_away/3 или heir option во время создания таблицы.

Многие разработчики игр полагаются на что-то вроде memcached, которое не отличается (намеренно) от ETS. Однако mnesia является очень стабильным OTP-приложением и может обрабатывать гораздо больше одновременных обновлений по сравнению с ETS. Мы использовали mnesia в очень загруженных приложениях, и она никогда не зависала, если только вся виртуальная машина не падала из-за других проблем. На самом деле, большинство доступных систем, построенных на erlang, зависят либо от mnesia, либо от ETS для совместного использования состояния между резервными компонентами, чтобы при переключении одного на другой были доступны данные в памяти.

gproc — очень удобный инструмент, особенно для таких вещей, как игры. Это связано с тем, что процесс зависит от своих собственных легкодоступных данных. Никакой другой процесс не может искать данные другого процесса. Таким образом, вместо сохранения состояния игры в ETS вы также можете использовать gproc.

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

person Muzaaya Joshua    schedule 14.06.2012
comment
Также не рекомендуется запускать gproc в глобальном режиме. - person Tilman; 14.06.2012
comment
правда, тем не менее: при нагрузочном тестировании вы обнаружите, что gproc довольно стабилен. - person Muzaaya Joshua; 14.06.2012
comment
Не уверен, во время нагрузочного тестирования я столкнулся с проблемами с gen_leader сбоями при наличии многих глобально зарегистрированных процессов в gproc. - person Tilman; 14.06.2012
comment
Спасибо за информацию, но ваш ответ на самом деле не отвечает на главный вопрос. - person kjw0188; 15.06.2012
comment
Этот ответ дает самый идиоматический ответ erlang, который вы когда-либо слышали: попробуйте каждый вариант и ... посмотрите, какой из них работает лучше. Кроме того, таблицы ETS (необязательно завернутые в gen_servers) довольно распространены. Для нераспределенных случаев хорошо работает и gproc. См. проект jlouis etorrent для примера использования gproc. - person mlb; 15.06.2012
comment
Mnesia — это почти распределенная таблица ETS в том, как она работает, так что проверьте ее. - person I GIVE CRAP ANSWERS; 15.06.2012