Erlang: управление сеансами и тайм-аут

Я вовлек себя, увлекся восходящий канал несколько месяцев назад. Это действительно не кодирует базирующийся, больше взламывания. Это - все еще забава и супер гиковский.

7
задан jldupont 9 November 2009 в 13:42
поделиться

4 ответа

Использовать таймер: send_after , таймер: exit_after или таймер: kill_after . Модуль таймера использует ets для таймеров хранения, и есть только один gen_server для всей виртуальной машины. Сохраните ссылку на таймер в каждой записи сеанса для перезапуска таймера или около того. Это простое и чистое решение.

5
ответ дан 7 December 2019 в 05:24
поделиться

Низкочастотное событие должно обрабатываться низкочастотным процессом IMO. Вы не хотите «тратить» слишком много ресурсов на что-то, что не «генерирует» ценность.

Действие «очистки» не требует «блокировки» сервера. Может быть, вам нужно развить этот момент.

Почему вам нужно что-то «заблокировать» в вашем решении №1? Что вас здесь беспокоит? Пожалуйста, подробно опишите, что вас беспокоит, чтобы я мог предложить больше.

2
ответ дан 7 December 2019 в 05:24
поделиться

Вы действительно не можете ошибиться ни с одним из предложенных решений, если у вас нет ginourmous чисел сеансов. И я хочу сказать, что вам следует провести тест.

Модуль таймера реализован в виде упорядоченной таблицы ets, где ets: first может эффективно найти первый таймер, срок действия которого должен истечь, и перейти в режим ожидания, пока это не произойдет. Таким образом, нет проблем с добавлением многих тысяч таймеров через модуль таймера. По одному на сеанс.

Если у вас очень много сеансов, проблема создания отказоустойчивого проекта, вероятно, будет более серьезной. Вам нужно будет распределить базу данных сеанса, чтобы запросы могли быть сбалансированы по нагрузке, и вы

0
ответ дан 7 December 2019 в 05:24
поделиться

Вот как я обрабатываю сеансы в моей любимой «веб-структуре».

Рабочие процессы напрямую ищут существующие сеансы и создают новые сеансы в таблице ets (без какого-либо вмешательства сервера). Также рабочие процессы после успешного поиска проверяют, не умер ли сеанс. Если это так, он создает новый сеанс и удаляет старый. Поскольку таблицу ets не нужно упорядочивать, можно включить параллелизм записи.

Роль «сервера сеанса» заключается в том, чтобы владеть таблицей сеанса и время от времени запускать процесс очистки. Это процесс с низким приоритетом, который просматривает таблицу ets с помощью вызовов ets: next () и удаляет сеансы с истекшим сроком действия.

Обратите внимание, что здесь не задействованы таймеры.

1
ответ дан 7 December 2019 в 05:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: