@kirill-93

Нужна ли проверка или можно полагаться на события вебсокета?

На сайте люди заходят и редактируют свои проекты. Иногда случается одна из следующих ситуаций:
1. Два человека одновременно зашли редактировать проект.
2. Человек открыл форму редактирования, начал что-то делать и ушел, не закрыв и не сохранив изменения. Потом пришел домой, там что-то сделал. На сл. утро вернулся на работу и продолжил редактировать открытую форму.
В общем случаются проблемы, клиенты пишут нам, мы долго разбираемся в чем дело и тп.
В итоге решили сделать так: как только проект открыт на редактирование, у всех остальных людей, которые имеют к нему доступ, он блокируется и сообщается, что проект в данный момент кем-то редактируется.
Я для этого написал небольшую программу на nodejs.

const WebSocket = require('ws');

let locked = [];

WSS.on('connection', ws => {
    ws.on('close', () => {
        delete locked[i];

        broadcastMessage(id, {type: 'updateLocks', data: locked);
    });

    ws.on('message', json => {
        if (message.type === 'lock') {
            locked.push({project_id: message.data.id});
        }

        broadcastMessage(id, {type: 'updateLocks', data: locked);
    });

    broadcastMessage(id, {type: 'updateLocks', data: locked);
});


Код я упростил, но все примитивно. Человек открыл проект на редактирование - на сервере id проекта добавили в массив. Закрыл проект или закрыл браузер - удаляем id проекта из массива.
Сервис работает уже несколько месяцев и все хорошо, но время от времени (три раза за все время), люди писали, что они проект закрыли, а он так и остался заблокирован.
Я несколько раз все тщательно анализировал, в коде ошибок не нашел. Разве что происходит какая-то ситуация, котрую я не учел, когда человек ушел, но сообщение по какой-то причине на сервер не пришло. Думаю написать проверку, которая будет выполняться каждые 10 секунд и обходить массив подключенных людей. Если кто-то из них отвалился, то удалять проекты.
Подскажите, могут ли быть какие-то баги? Хорошая ли идея написать дополнительную проверку?
  • Вопрос задан
  • 523 просмотра
Пригласить эксперта
Ответы на вопрос 2
@w411
Backend Developer
Плохая идея проверять каждые 10 секунд - можешь положить сервер.
А нельзя обойти массив подключенных людей принудительно по нажатию кнопки из веб-интерфейса?
Вот скажем юзер открывает редактор, ему выводится сообщение о блокировке и кнопочка "Обновить информацию", нажал на кнопку - сервер сделал все проверки, если блокировка есть - вывести информацию о том кто редактирует проект в данный момент, если блокировок нет - дать доступ.
Ответ написан
Комментировать
zoonman
@zoonman
⋆⋆⋆⋆⋆
Перестать мучить людей и использовать https://github.com/Operational-Transformation/ot.js/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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