Я вовлек себя, увлекся восходящий канал несколько месяцев назад. Это действительно не кодирует базирующийся, больше взламывания. Это - все еще забава и супер гиковский.
Использовать таймер: send_after
, таймер: exit_after
или таймер: kill_after
. Модуль таймера
использует ets
для таймеров хранения, и есть только один gen_server
для всей виртуальной машины. Сохраните ссылку на таймер в каждой записи сеанса для перезапуска таймера или около того. Это простое и чистое решение.
Низкочастотное событие должно обрабатываться низкочастотным процессом IMO. Вы не хотите «тратить» слишком много ресурсов на что-то, что не «генерирует» ценность.
Действие «очистки» не требует «блокировки» сервера. Может быть, вам нужно развить этот момент.
Почему вам нужно что-то «заблокировать» в вашем решении №1? Что вас здесь беспокоит? Пожалуйста, подробно опишите, что вас беспокоит, чтобы я мог предложить больше.
Вы действительно не можете ошибиться ни с одним из предложенных решений, если у вас нет ginourmous чисел сеансов. И я хочу сказать, что вам следует провести тест.
Модуль таймера реализован в виде упорядоченной таблицы ets, где ets: first может эффективно найти первый таймер, срок действия которого должен истечь, и перейти в режим ожидания, пока это не произойдет. Таким образом, нет проблем с добавлением многих тысяч таймеров через модуль таймера. По одному на сеанс.
Если у вас очень много сеансов, проблема создания отказоустойчивого проекта, вероятно, будет более серьезной. Вам нужно будет распределить базу данных сеанса, чтобы запросы могли быть сбалансированы по нагрузке, и вы
Вот как я обрабатываю сеансы в моей любимой «веб-структуре».
Рабочие процессы напрямую ищут существующие сеансы и создают новые сеансы в таблице ets (без какого-либо вмешательства сервера). Также рабочие процессы после успешного поиска проверяют, не умер ли сеанс. Если это так, он создает новый сеанс и удаляет старый. Поскольку таблицу ets не нужно упорядочивать, можно включить параллелизм записи.
Роль «сервера сеанса» заключается в том, чтобы владеть таблицей сеанса и время от времени запускать процесс очистки. Это процесс с низким приоритетом, который просматривает таблицу ets с помощью вызовов ets: next () и удаляет сеансы с истекшим сроком действия.
Обратите внимание, что здесь не задействованы таймеры.