gen_server с dict по сравнению с mnesia таблицей по сравнению с ets

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

Что лучший способ состоит в том, чтобы реализовать его?

  1. gen_server с dict. Ключ будет идентификатором пользователя. dict:store/3 обновит или создаст состояние. gen_server решает проблему 'транзакции'.

  2. таблица mnesia с ram_copies. Транзакции дескриптора и я не должны реализовывать gen_server. Является там слишком много служебным с этим решением?

  3. Таблица ETS, которая является большим количеством легкого веса и имеет gen_server. Действительно ли возможно сделать транзакцию в ETS? Заблокировать таблицу между чтением всех сообщений и очисткой их?

Спасибо

13
задан pablo 28 January 2010 в 12:20
поделиться

1 ответ

Так как вы делаете синхронизацию вручную, мнезия - это очень много. Очевидно, что вам не нужны сетевые штучки, вот в чем основная разница между ets и mnesia.

Ets, насколько я понимаю, является всего лишь процессом, совместимым с протоколом otp вокруг dict/bag/..., и поскольку у вас есть несколько процессов, получающих доступ к вашим данным, вам следует использовать ets.

Я придумал для себя следующую логику:

Multiple processes on multiple VMs -> mnesia
Multiple processes on one VM -> ets/dets
One process -> bag/dict/...
19
ответ дан 1 December 2019 в 23:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: