Я создаю erlang сервер. Пользователи отправляют запросы HTTP на сервер для обновления их состояния. Процесс запроса HTTP на сервере сохраняет пользовательское сообщение о состоянии в памяти. Каждую минуту сервер отправляет все сообщения на удаленный сервер, и очистите память. Если пользователь обновляет свое состояние несколько раз за минуту, последнее сообщение переопределяет предыдущий. Важно, чтобы между чтением всех сообщений и очисткой их никакой другой процесс не был в состоянии записать сообщение о состоянии.
Что лучший способ состоит в том, чтобы реализовать его?
gen_server с dict. Ключ будет идентификатором пользователя. dict:store/3 обновит или создаст состояние. gen_server решает проблему 'транзакции'.
таблица mnesia с ram_copies. Транзакции дескриптора и я не должны реализовывать gen_server. Является там слишком много служебным с этим решением?
Таблица ETS, которая является большим количеством легкого веса и имеет gen_server. Действительно ли возможно сделать транзакцию в ETS? Заблокировать таблицу между чтением всех сообщений и очисткой их?
Спасибо
Так как вы делаете синхронизацию вручную, мнезия - это очень много. Очевидно, что вам не нужны сетевые штучки, вот в чем основная разница между ets и mnesia.
Ets, насколько я понимаю, является всего лишь процессом, совместимым с протоколом otp вокруг dict/bag/..., и поскольку у вас есть несколько процессов, получающих доступ к вашим данным, вам следует использовать ets.
Я придумал для себя следующую логику:
Multiple processes on multiple VMs -> mnesia
Multiple processes on one VM -> ets/dets
One process -> bag/dict/...