# lock

## Описание 

Сервис пессимистического блокировщика

!!! note
    Обязательный элемент системы. API доступно только внутри инфраструктуры серверной части lexema8. 


Механизм пессимистической блокировки является частью нового функционала, разработанного в версии платформы 8.4. Назначением механизма является блокировка записей моделей при их загрузке в различных клиентах и различными пользователями. Это означает, что в один момент времени с одной записью модели может работать только один пользователь в одном клиенте (то есть в рамках одной вкладки браузера). Механизм реализован с помощью выделенного системного веб-сервиса lock

### Работа пессимистического блокировщика
В одном браузере может быть открыто несколько вкладок с самостоятельными экземплярами веб-клиента. В таком случае каждый отдельный экземпляр веб-клиента (находящийся в собственной вкладке браузера) будет иметь уникальный идентификатор клиента, но все они будут относится к одной и той же браузерной сессии.

### Снятие блокировки

Сценарии снятия блокировки:

-   Закрытие документа - клиент отправляет запрос на снятие блокировки с закрываемого документа
-   Выход из системы - клиент отправляет запрос на снятие всех блокировок, установленных текущим пользователем в текущей сессии
-   Закрытие вкладки браузера - клиент отправляет запрос на снятие всех блокировок, установленных текущим пользователем в текущей сессии с текущего экземпляра клиента
-   Ключ блокировки удаляется из хранилища вручную - разработчик, системный администратор или иное лицо (или программа), имеющая доступ к хранилищу, производит удаление ключа (или ключей)
-   Истекает время хранения ключа блокировки - см. следующий раздел, а также  [EXPIRE](https://redis.io/commands/expire)

### Снятие неактивных блокировок

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

Таким образом, если некий экземпляр клиента в рамках определённой сессии пользователя не отправляет запросы к серверу в течение заданного времени, время жизни блокировок, относящихся к этому экземпляру клиента, не будет продлеваться, и они будут удалены по истечении этого времени.
## Описание настройки сервиса блокировок

- **protocol** - используемый веб-протокол (по умолчанию `http`).
- **host** - имя хоста (по умолчанию `localhost`).
- **port** - порт для запуска (по умолчанию - `3064`).
- **route** - используемый маршрут (по умолчанию `/api/v2.0/lock`).
- **timeout** - количество миллисекунд бездействия, после которого считается, что время ожидания истекло (по умолчанию `120`). В режиме продакшена может потребоваться дополнительно настроить таймаут для веб-сервера (nginx).
- **script** - путь к модулю, запускающему сервис (по умолчанию `ecosoft-lexema8/lock`).
