@Drottarutarnum
Любопытный любитель

Что использовать для синхранизации данных?

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

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

В голову приходит к каждому векторному элементу добавлять последнее время обновления, но возможно есть решение проще, или вообще готовая библиотека чтобы не писать свой велосипед?
  • Вопрос задан
  • 72 просмотра
Решения вопроса 1
@rPman
Если все реализуешь ты сам, то у тебя должна быть реализация undo/redo, отмена действий и их обратный повтор. Реализуется это обычно тем что либо на машине локально сохраняются состояния документа (буквально память) на каждое действие отмены, либо для каждого действия у тебя должна быть обратная операция.
Что значит обратная операция - нарисовать линию - удалить линию, удалить линию - нарисовать линию (т.е. буквально в момент удаления линии ты должен в лог действий сформировать запись о том как эту линию создать)

Соответственно каждое твое действие с документом должно логироваться в лог действий (пар действий).

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

Теперь самое главное - нужен самый главный (сервер или в p2p среде случайно выбранный один из участников) которому весь лог отправляется и который перенаправляет действия остальным, на самом деле можно паралельно и напрямую отсылать для отзывчивости но главный разруливает конфликты, или даже не допускает (реальное изменение происходит как только главный скажет что данные дошли до всех клиентов, но визуально это лаги, это некомфортно). Разруливать конфликт можно просто откатом операции автоматически (например прописать приоритетность для каждого действия). Если сделаешь механизм ручного разруливания конфликтов - тебе пользователи спасибо скажут.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
2ord
@2ord
По описанию задачи должна подойти реализация PouchDB протокола синхронизации Apache CouchDB. На практике ещё не пробовал.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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