Появилась идея вынести блокировки в какое-то централизованное место, чтобы можно было редактировать документы на любом сервере, не привязывая документ к конкретному серверу.
Продумывал как отдельный Lotus-сервер, и даже Redis...)
Ребята, может уже кто-то делал такое и наступал на грабли (нагрузка, скорость и т.п.)? Не стесняйтесь поделиться опытом!)
Продумывал как отдельный Lotus-сервер, и даже Redis...)
При блокировке пишем:
- ID процесса (сгенерирован на конкретной кнопке/агенте и проч.)
- текущий SeqNumber;
- дату (Now);
- статус блокировки = 1.
При разблокировании:
- очищаем ID процесса и дату;
- обновляем SeqNumber до актуального;
- статус блокировки = 0.
Пример:
1. Заблокировали док, прописали текущий SeqNumber = 76.
2. Разблокировали док, обновили SeqNumber = 79 (да, не 77, как должно быть, потому что до меня код писали, видимо, гении...).
3. Пытаемся с другого сервера заблокировать док, - отправляем текущий SeqNumber = 76, а оно не даёт нам заблокировать, т.к. говорит "извини, товарищ, но надо обождать, пока пройдёт репликация"))) На самом деле ничего не говорит, а просто возвращает false, и все изменения записываются в запрос, который отрабатываться агентом по расписанию.
К этому ещё нужно 2 агента:
1. Сбрасывающий блокировку по прошествии определённого времени (например, 1-2 минуты).
2. Удаляющий документ/запись блокировки по прошествии определённого времени с даты последней блокировки (например, месяца 3), - когда док ушёл в архив и больше не меняется. Если вдруг док снова изменится, то запись снова появится.
Короче, как-то так.
- ID процесса (сгенерирован на конкретной кнопке/агенте и проч.)
- текущий SeqNumber;
- дату (Now);
- статус блокировки = 1.
При разблокировании:
- очищаем ID процесса и дату;
- обновляем SeqNumber до актуального;
- статус блокировки = 0.
Пример:
1. Заблокировали док, прописали текущий SeqNumber = 76.
2. Разблокировали док, обновили SeqNumber = 79 (да, не 77, как должно быть, потому что до меня код писали, видимо, гении...).
3. Пытаемся с другого сервера заблокировать док, - отправляем текущий SeqNumber = 76, а оно не даёт нам заблокировать, т.к. говорит "извини, товарищ, но надо обождать, пока пройдёт репликация"))) На самом деле ничего не говорит, а просто возвращает false, и все изменения записываются в запрос, который отрабатываться агентом по расписанию.
К этому ещё нужно 2 агента:
1. Сбрасывающий блокировку по прошествии определённого времени (например, 1-2 минуты).
2. Удаляющий документ/запись блокировки по прошествии определённого времени с даты последней блокировки (например, месяца 3), - когда док ушёл в архив и больше не меняется. Если вдруг док снова изменится, то запись снова появится.
Короче, как-то так.
Ребята, может уже кто-то делал такое и наступал на грабли (нагрузка, скорость и т.п.)? Не стесняйтесь поделиться опытом!)