Как вы обрабатываете / реагируете на параллелизм пользовательского ввода на уровне GUI?

StackOverflow https://stackoverflow.com/questions/308353

Вопрос

Каковы хорошие способы обработки параллелизма пользовательского ввода?

В качестве ответов на этот вопрос уже исключена блокировка базы данных, как вы обрабатываете одновременный пользовательский ввод в целом?

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

Редактировать: Я знаю об обработке параллелизма на уровне данных с помощью транзакций:Если два пользователя одновременно инициируют сложное изменение данных, транзакция обработает его.

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

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

  • Получат ли они уведомление и / или будут вынуждены перезагрузиться?Или в конечном итоге будут перезаписаны изменения первого пользователя?
  • Должен ли я заблокировать файл и запретить нескольким пользователям редактировать один и тот же файл?
  • Могу ли я поместить весь процесс редактирования в транзакцию (я сильно сомневаюсь в этом, но кто знает ...)

Каков наилучший способ справиться с этой и подобными ситуациями?Существуют ли какие-либо другие стратегии?

Это было полезно?

Решение

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

Ваш пример редактирования файла через Интернет может быть разбит следующим образом:

  1. пользователь1 проверяет извлекает / получает / загружает / открывает файл v0
  2. пользователь2 проверяет извлекает / получает / загружает / открывает файл v0
  3. пользователь1 вносит изменения в свою копию файл v0
  4. пользователь2 вносит изменения в свою копию файл v0
  5. пользователь1 сохраняет файл версии v1 на сервер
  6. пользователь2 сохраняет файл версии v2 на сервер

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

Классический подход к управлению версиями заключается в том, что для user1 ничего не меняется по сравнению с обычным процессом редактирования / сохранения на рабочем столе.

Однако для пользователя 2, когда он пытается сохранить версию v2 на сервер, приложение должно проверить, были ли какие-либо изменения в версии файла v0 с момента последней загрузки пользователем.Поскольку это так, система контроля версий обычно показывает ему обе версии (v1 и v2) на экране бок о бок и позволяет ему смешивать их и сохранять полученную версию (v3) на сервере.

Для текстовых файлов существует ряд инструментов и систем как в Unix, так и в Windows, которые пытаются автоматизировать процесс таким образом, чтобы, если редактируемые области файла не перекрывались, изменения объединялись автоматически.

Альтернативой является блокировка файла для пользователя 2 до тех пор, пока пользователь 1 не закончит его редактирование.

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


Ваш пример, кстати, заметно отличается от другой ситуации, такой как бронирование билетов на самолет или запись на прием к врачу.

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

Таким образом, процесс бронирования должен состоять как минимум из двух этапов:

  1. система показывает бесплатные слоты;
  2. пользователь запрашивает один из бесплатных слотов (s1);
  3. система сообщает пользователю, действительно ли слот все еще свободен, и если да, то резервирует его за вами.
  4. пользователь завершает бронирование.

Шаг "действительно все еще свободен" связан с тем, что информация о просмотренных пользователями веб-страницах обычно не обновляется в режиме реального времени, поэтому между шагами 1 и 2 возможно, что другой пользователь подал заявку на бесплатный слот.

Другие советы

Посмотрите, как обрабатывать "транзакции" на любом языке / API базы данных, который вы используете.Если вы разработаете их правильно, он справится с этим за вас.

И чтобы понять теорию, я бы рекомендовал Распределенные системы Кулориса и др. но есть много других хороших книг.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top