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