Я видел веб-фреймворк, реализующий таким образом сеанс в памяти. Объект сеанса добавляется в кэш с тайм-аутом. Когда время истекло, сеанс удаляется из кэша автоматически. Чтобы защитить состояние гонки, каждый запрос должен получить блокировку для данного объекта сеанса для продолжения. Каждый запрос "коснется" сеанса в кэше для обновления тайм-аута.
Все выглядит хорошо, пока этот сценарий не обнаружен. Скажем, одна операция занимает больше времени, чем время ожидания. Другой запрос приходит и ожидает блокировки сеанса, которая в настоящее время удерживается долгим запросом. Наконец, долгосрочный запрос закончен, он снимает блокировку. Но, поскольку это уже занимает больше времени, чем время ожидания, объект сеанса уже удален из кэша. Это очевидно, потому что единственный запрос, удерживающий блокировку, не может " коснуться " объекта сеанса в кеше. Второй запрос получает блокировку, но не может получить просроченный объект Session. К сожалению ...
Чтобы устранить эту проблему, второй запрос должен заново создать объект Session. Но это все равно, что выкапывать захороненное мертвое тело из гробницы и пытаться вернуть его к жизни. Это вызывает глючный код.
Мне интересно, как лучше реализовать тайм-аут в сеансе для обработки такого сценария. Я знаю, что текущая платформа должна иметь хороший механизм сессии. Я просто хочу знать, как под капотом.