Многопользовательская система

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Многопользовательская система

Сообщение hCORe » 13.08.2008 (Ср) 13:48

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

Первое, что приходит в голову --- блокировать доступ к документу при его открытии пользователем, и разблокировать при закрытии. Однако тут возникает другая проблема: что если пользователь откроет документ, а потом соединение с сетью неожиданно разорвется? Документ останется в <<подвешенном>> состоянии. Идея первая: при повторном открытии документа тем же самым пользователем, что его заблокировал, - разрешать пользователю доступ. (Здесь, правда, не совсем понятно, как справиться со случайным повторным запуском приложения. Поскольку приложение работает в браузере, выяснить, был ли разрыв связи, или случайный второй запуск программы, затруднительно). Идея вторая: с клиентской машины пользователя, открывшего документ, с периодом T посылать <<пинги>> серверу. В случае отсутствия <<пинга>> в течение времени >= kT (k > 1) --- документ разблокировать. При появлении <<пинга>> от того же пользователя --- блокировать вновь, если кто-то уже не заблокировал документ. Если документ уже заблокирован --- сообщать пользователю и мягко просить <<подождать>> :)
Другая проблема --- неожиданное (аварийное) завершение работы клиентского приложения --- тоже решается при помощи идеи №2.
Замечание: некоторые из редактируемых документов (например, список пользователей) могут редактировать только пользователи-администраторы.

Второе, что приходит в голову --- хранить множество версий одного и того же документа, порождаемых при сохранении данных отдельными пользователями, и впоследствии при необходимости <<сливать>> данные вместе или выбирать предпочтительную модификацию. Причем запрос на выбор можно посылать только если документ был сохранен несколькими пользователями с перерывом в t, где t достаточно мало. Даже скорее всего, необходимо хранить не сами версии, а только изменения по сравнению с исходным документом (как делается, например, в системах контроля версий).

Вариант первый, насколько я понимаю, используется MS Office при совместной работе над документом (уведомление об изменении); второй --- всяческими системами контроля версий и wiki.

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

Вопросы следующие:
1) Какой из вариантов предпочтительнее, если пользователи могут соединяться с сетью по ненадежным каналам (хотя и не очень часто), а задержки при работе не должны быть слишком большими? Или, может быть, существуют другие, более интересные варианты?
2) Для каждого из вариантов, возможно существуют известные алгоритмы? Если вы с ними знакомы, назовите, пожалуйста.
Моду создают модоки, а распространяют модозвоны.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Re: Многопользовательская система

Сообщение Sebas » 14.08.2008 (Чт) 8:28

а установить соурсконтрол какой-нибудь?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Многопользовательская система

Сообщение Хакер » 14.08.2008 (Чт) 16:13

Я прочитал, но так и не понял, какие проблемы с блокировками?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Re: Многопользовательская система

Сообщение hCORe » 15.08.2008 (Пт) 11:28

Идея про source control хороша, и ее я рассмотрел в первую очередь. Проблема в том, что сервер не мой, и что-то на него ставить не в моей власти :(
Проблема с блокировками разве что в том, что юзеры будут недовольны задержками и тем, что браузер должен постоянно пинговать сервер.
Есть мысль реализовать блокировки и посмотреть, как на это отреагируют. Так сказать, провести тест-драйв. В связи с этим повторяю вопрос из первого сообщения: есть ли на этот счет описание эффективных алгоритмов, а то нашел только общее описание блокировок в СУБД и все... Хотелось бы просто не <<изобретать велосипед>> :)
Заранее спасибо.
Моду создают модоки, а распространяют модозвоны.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: Многопользовательская система

Сообщение Antonariy » 15.08.2008 (Пт) 14:47

Идея вторая: с клиентской машины пользователя, открывшего документ, с периодом T посылать <<пинги>> серверу. В случае отсутствия <<пинга>> в течение времени >= kT (k > 1) --- документ разблокировать.

А что, запросы к серверу идут редко? Пингом ведь можно считать любой запрос. При логине создавать на сервере запись с ip клиента и апдейтить ее время при каждом запросе с этого ip, и если последние, допустим, полчаса запись не обновлялась, разблокировать. Процедуру разблокировки можно запускать при запросе с любого ip. Чтобы обработать ситуацию повторного запуска, можно клиенту выдавать идентификатор сессии, который тот должен присовокуплять к запросу. Задача сводится к "что делать с пустым запросом при открытой сессии".
Лучший способ понять что-то самому — объяснить это другому.

ANDLL
Великий гастроном
Великий гастроном
Аватара пользователя
 
Сообщения: 3450
Зарегистрирован: 29.06.2003 (Вс) 18:55

Re: Многопользовательская система

Сообщение ANDLL » 15.08.2008 (Пт) 16:54

А все таки я бы более разумную систему блокировок так как это сделано обычно в version control-системах
Когда юзер открывает документ(checkout), ничего не блокируется, просто передается содержимое документа.
Затем клиентский скрипт периодически опрашивает сервер на предмет изменений документа(это не бог весть какой траффик, 100 байт в минуту погоды не сделают).
Если документ на сервере изменился, скрипт обновляет документ у пользователя(refresh)
Если пользователь меняет документ, то есть дв пути
1) Либо клиентский скрипт(до изменения) делает reservred checkout(то бишь "блокирует" документ) и раз в определенный промежуток времени посылает на сервер обновленную версию документа. При этом тут можно указать некое временное окно(небольшое, минут в 5), в течение которого сервер, не получая очередного запроса reserved checkout разблокирует документ. Клиентский скрипт также знает про это, поэтому в случае обрыва связи блокирует пользователю возможность редактирования
2) Либо более предпочтительно - никаких блокировок, юзеры редактируют документы. Содержимое измененных документов отправляется на сервер при нажатии кнопки "сохранить"(commit).
При этом тому, кто делает commit вторым должен будет провести операцию merge или overwrite над изменениями другого юзера(то есть либо слить свой контент с чужим, либо перезаписать его)
Вобщем, рекомендую вникнуть в суть SVN или CC дабы узнать як це обiчно процюет.
Гастрономия - наука о пище, о ее приготовлении, употреблении, переварении и испражнении.
Блог


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 71

    TopList  
cron