×

Сессии в джаваскрипт приложении

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Добрый день, есть приложение на джаваскрипте, загружается вебстраница и вы можете рисовать типа как в paint. Рисунки можна сохранять на удаленном сервере и также можна править рисунки других людей. Есть таск — ограничить правку рисунка одной сессией, тоесть если вы начинаете править рисунок то никто другой не может править этот же рисунок пока вы не закончите. Сессию я организовал через ajax и файл на диске, тоесть когда вы тронули кисти или карандаш — вызвался ажакс и записал в файл время начала правки, никто другой не может активировать кисти на рисунке для которого уже создан лог файл. но встал вопрос — как релизить сессию. Идея отслеживать закрытие окна или рефреш страницы и вызывать ажакс с удалением сессии не сработала, ажакс не отрабатывает даже если ставить синхро мод. Может кто подскажет как можна релизить сессию или как по другому организовать раздельный доступ ?

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

если кому интерестно то вот что вышло. Сразу скажу нельзя сохранять копии рисунков, только изменения к оригиналам. сессия активируется кнопкой «начать изменения», после нажатия кнопки на диск пишется файл с названием как картинка но расширением ЛОК, внутрь файла пишеься время начала сассии и номер юзера, если все ок — то появляется менюха для эдита картинки. Если на диске уже есть файл ЛОК то проверяется время создания файла, если прошло больше 30 минут — то файл переписывается с новым временем и новым юзером, если меньше 30 минут то проверятеся айди юзера и если это другой юзер то показыватся попап с просьбой «прийти позже». В процессе эдита по нажатию разных кнопок файл ЛОК перезаписывается с новым временем и сессия продляется. Если выйти из окна мышкой то начинат считать время таймер для автоматического закрытия сессии, через 30 минут он сотрет файл с диска и выдаст попап что сессия закончилась. Если кто то просто закрыл броузер то нада ждать 30 минут пока новый юзер может занять сессию. Вообщем как то так.

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

хранить изменения в памяти???
лолололололололололо — расскажешь потом PM куда случайно данные миллиона пользователей пробались
пхп тоже может работать с сокетами (Оо внезапно )

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

при закрытии браузера обычно срабатывает событие типо onshutdown, установи на него аякс с дестроем сессии

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

Я бы предложил хранить рисунок в процессе редактирования только в session storage / local storage / local filesystem и использовать явное сохранение на сервер и оптимистическую блокировку — если при попытке сохранения обнаруживается, что кто-то другой внес изменения раньше, выдавать сообщение об ошибке сохранения и предлагать а) сохранить в файл с другим именем на сервере б) потерять свои изменения и загрузить обновленную версию в) сохранить свою версию, затерев ранее записанную кем-то другим.

Очень даже правильно. И автоматически делать КОПИЮ с переименованием в случае конфликта версий.

Спробуй багато користувацьке редагування з WebSocket-ами

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

Если у тебя не трёхзвенная архитектура, закронтабь в операционке отдельный процесс проверки отвалившихся по таймауту сессий. Например дёргай по wget. Дёшево, сердито, хрен кто сломает.

если бы ты немного разбирался в теме ты бы такой фигни не советовал

Та все верно он написал. У человека может банально браузер упасть или электричество выключиться. И на такие случаи висящие сессии нужно убивать по таймауту. Даже если это будет дополнением к кнопке finish, а не основным методом.

ты можешь при попытке инициализации новой сессии проверять тайм штамп старой и если он старее чем пара часов то просто писать туда новый и забирать сессию себе. зачем эти кронтабы и т.д.

Так тоже можно

Теоретически — да. Практически — это зелёный свет уводчикам сессий. Так что нихрена, если тонкий клиент не владеет сессией — значит он не откроет замочек без логинчика с парольчиком. И получит НОВУЮ сессию. И будет ждать пока старая отвалится, если же какой объект держит. Хотя не спорю, это решение можно принять ПРИНУДИТЕЛЬНО, предупредив что открыто в другом месте и не сохранено.

Кстати, пару часов — то многовато. Речь идёт о минутах, от 2 до 10, зависимо от производительности сервака и сколько не жалко отдать под пинги. Идеально если сессии хранишь в памяти, а не на диске — для игрушечных задач самое оно. А при нормальной перезагрузке просто прописываешь процедуру сохранения — восстановления сессий.

Это как раз совет для тех, кто не разбирается, хардкор. RealTime выше посоветовали.
P.S. Есть ещё золотое правило: входящим данным и действиям клиента доверять нельзя.

1) Реализуйте version control, два человека могут править, а потом тот кто позже нажал на сохранить — показывать мерж конфликт и пусть либо пересохраняет под другим именем либо перезаписывает сверху

2) Релиз можно на сейф прикрутить, а после сейфа — перекидывать на рид онли вью с кнопкой едит (сделать лок), но первый варик мне боььше нравится

вершин контрол сразу отпадает, такого в реквайрментах нет. Сейв релизить сессию наверно не будет, пока прикручиваю кнопку Едит и финиш эдит. но теперь нада еще таймер прикручивать что бы релизить сессию по неактивности больше чем час.

Коментар порушує правила спільноти і видалений модераторами.

Для чого вам те роздільне редагування, ось люди створили, вчіться =) www.multiplayerpiano.com

1. реализовать hearbeat — отправлять с клиента регулярно запросы на сервер с посылом «я всё еще тут». как только перестало приходить — дропнуть сессию(то есть, например, клиент шлёт каждую минуту, а каждые 5 минут дропаются сессии просрочненные более, чем на 5 минуты — максимальная задержка — 10 минут).
2. отслеживать через beforeunload уход со страницы + с каким-то большим таймаутом принудительно дропать старые сессии(на случай, если браузер сдох из-за сбоя, beforeunload могло не вызваться)

1. хартбит кажется немного грубым решением, каждые 4 или 9 минут переподтверждать сессию и через 5 или 10 минут неактивности релизиит ее как то слишком прямолинейно. хотелось бы пошаманить с вызовом ажакса по уходу со страницы — но у меня это не работает

Хм. Никогда не проверял такой вариант, но вроде бы XHR запросы прерываются при уходе cо страницы, не должно быть особой разницы просто get там или jsonp.

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

Так многие делают, и это работает.
Jsonp просто блочит все

а нельзя на сервере этим управлять?
например, PHP позволяет игнорить разрыв соединения и продолжить выполняться
думаю, другие тоже должны б

Если онлайн приложения с несколькими пользователями — socket.io + серверная логика... не думаю что разумно будет делать это на клиенте

явное окончание редактирования (в рамках приложения) или таймаут

есть такая мысль прицепить кнопку — закончить редактирование и по попытке выхода или закрытия окна просить нажать эту кнопочку

эм ну если «просить» то можно и кнопку программно нажать )) А более понятный юзкейс в пользу кнопки — как передать редактирование другому?

конкретно этот юзер кейс прохлопался. Этот реквайремент вообще не обсуждался с заказчиком, но почитав спеку перед финальными тестами я этот поинт обнаружил и теперь вот нада шота решать )))

Дуже схоже на Leader election. Хто лідер той і пише, можливо буде корисно використати Zookeeper та Javascript клієнт github.com/...uan/node-zookeeper-client

да это сложновато, мое приложение интегрированно в мудл как модуль, притягивать зокипер кажется сложным

Підписатись на коментарі