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/...