Как синхронизировать действия пользователей и данные в многопользовательской системе?
=======================================================================================

 Доброго времени суток!  

  

В процессе разработки многопользовательской системы (фронтенд + микросервисный бэкенд) столкнулся с непониманием как правильно обеспечить одновременную работу пользователей.  

Суть проблемы:  

- пользователь user1 зашел на страничку редактирования информации, выбрал пункт info1 и начинает его редактировать,  

- в это же время пользователь user2 тоже выбрал info1, сделал небольшую правку и нажал Сохранить.   

- однако user1 ничего не знает о том что данные были изменены другим пользователем, вносит свои правки и также нажимает кнопку Сохранить.  

  

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

Т.е. после того как пользователь user2 нажал Сохранить данные, то он получил уведомление что данные будут изменены, создается задача на изменение данных, меняется номер версии данных и начинается их сохранение-синхронизация.   

  

Как правильно мне поступить в этой ситуации относительно пользователя user1?  

  

Мои мысли:  

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

2 - просто создать задачу на изменение данных от user1 и поместить ее в очередь выполнения. В результате перезапишуться данные, введенные пользователем user2. При этом пользователь user1 не будет знать что он редактировал неактуальные данные, это вроде как нехорошо.  

- возможно есть другие варианты...  

  

И посоветуйте, пожалуйста, что можно почитать по алгоритмам создания подобных систем где присутствуют следующие нюансы:  

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

- общие данные, которые могут меняться любым из пользователей,  

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

  

Есть ли какое-то более обобщенное название у подобных систем?  

  

P.S. Заранее прошу прощения, тэги вопроса мог поставить некорректно, т.к. не смог сходу придумать какие правильно подобрать. 

 Вы описываете типичную ситуацию при работе с базами данных.  

Обычно применяются 2 стратегии:  

1. ничего не делаем, побеждает последний записавший данные. Запись, конечно, должна быть атомарной, т.е. если 2 пользователя одновременно пишут, то в итоге должны быть записанны данные либо первого пользователя либо второго, но не нечто среднее.  

2. блокировка доступа на изменение, в этом случае описанная ситуация просто не возникнет.  

Эти же подходы вполне применимы и в вашем случае.  

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

 Можно блокировать редактирование данных пока user1 эти данные редактирует, т.е. выводить оповещение для user2 что в данный момент данные редактируются и предложить продолжить редактирование несмотря ни на что.   

  

>  1 - уведомить пользователя user1 о том что данные были изменены и попросить дождаться синхронизации данных, после этого по-новому подтянуть актуальные данные и повторить потом операцию редактирования. 

  

Это тоже вариант 

 Вы описали проблемы, которые решают системы контроля версий, например. 

 Ещё есть более красивый, но на 2 порядка более сложный вариант — CRDT <https://m.habr.com/ru/post/418897/>, привожу его здесь скорее для полноты ответов, чем как реальный совет, никому не рекомендую использовать CRDT в проде без необходимости. 

 Вероятно одним из решений будет внедрение возможности совместного редактирования документа. Посмотрите в сторону collaborative editors. Например, [ProseMirror](https://prosemirror.net/examples/collab/#edit-Example). Не могу сказать наверняка, что решение хорошее, но как вариант, думаю, рассмотреть стоит.