Использование gen_server для инкапсуляции таблицы мнезий?

StackOverflow https://stackoverflow.com/questions/1437468

  •  08-07-2019
  •  | 
  •  

Вопрос

У меня есть серверное приложение, сделанное на Erlang. В нем у меня есть таблица мнезии которые хранят некоторую информацию на фотографиях. В духе "все Процесс & Quot; Я решил обернуть эту таблицу в модуль gen_server , чтобы Модуль gen_server является единственным, который непосредственно обращается к таблице. Запрос и добавление информации в эту таблицу осуществляется путем отправки сообщений этому процессу (который имеет зарегистрированное имя). Идея в том, что будет несколько клиентов обрабатывает запрос информации из этой таблицы.

Это прекрасно работает, но у этого модуля gen_server нет состояния. Все это Требуется хранится в таблице мнезий. Итак, мне интересно, если gen_server возможно не лучшая модель для инкапсуляции этой таблицы?

Должен ли я просто не делать это процессом, а просто инкапсулировать таблицу через функции в этом модуле? В случае ошибки в этом модуле, это вызовет сбой вызывающего процесса, что, я думаю, может быть лучше, потому что это повлияет только на одного клиента, в отличие от сейчас, когда это приведет к gen_server завершается сбоем, оставляя всех без доступа к таблице (до супервизор перезапускает его).

Любой вклад приветствуется.

Это было полезно?

Решение

Я думаю, согласно бритве Оккама , есть нет необходимости в существовании этого gen_server , тем более что в нем не хранится абсолютно состояние . Такой процесс может быть необходим в ситуациях, когда вам нужен доступ к таблице (или любому другому ресурсу), чтобы он был строго последовательным (например, вы могли бы хотеть избежать любых прерванных транзакций в стоимость узкого места).

Инкапсуляция доступа к таблице в модуле - хорошее решение . Он не создает никакой дополнительной сложности и обеспечивает надлежащий уровень абстракции и инкапсуляции.

Другие советы

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

Создание модуля API, который выполняет все определенные операции доступа к таблице и обновления, является хорошей идеей, поскольку функции API лучше передадут ваше намерение в коде, который их вызывает. Это будет более читабельным, чем помещение операций mnesia непосредственно в вызывающий код.

Модуль API также дает вам возможность перейти от mnesia к какой-либо другой системе хранения позже, если вам нужно. Использование транзакций mnesia внутри вашего модуля API защищает вас от некоторых ошибок программирования, так как mnesia будет выполнять откат операций, которые завершаются сбоем. Модуль API всегда будет доступен для вызывающих абонентов и позволяет любому количеству вызывающих абонентов выполнять операции одновременно, в то время как API на основе gen_server имеет точку отказа, процесс, который может сделать API недоступным.

Единственное, что API на основе gen_server дает вам по сравнению с чисто функциональным API, - это сериализовать доступ к таблице, что является необычным требованием, и если вам это не нужно, это может привести к снижению производительности.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top