Decadal
@Decadal

Как сохранять большие тексты при частых, но незначительных изменениях?

Есть форма, которая сохраняет текст без кнопки "сохранить", т.е., интерактивно (что-то вроде гуглдока). Как только пользователь заканчивает ввод текста и проходит несколько секунд, на сервер отправляется запрос со всем контентом для сохранения введённых изменений. Проблема с большими текстами (ограничение размера текста есть, 64 кб, всё равно беда).
Существует вероятность того, что очередное изменение большого текста будет повреждённым (сохранится только кусок текста). Особенно это заметно при медленном интернете. Кроме того, как только пользователей станет много, подозреваю, сервер ляжет.
Как решить эту проблему? Возможно ли частичное обновление поля в MySQL (слабо представляю, как это выглядело бы), или использовать nosql(если да, то каков будет примерный алгоритм)? Как выявить частичные изменения, чтобы не гонять весь текст целиком, а только внесённые изменения? Поделитесь опытом.
  • Вопрос задан
  • 672 просмотра
Решения вопроса 3
Wolfnsex
@Wolfnsex
Если не хочешь быть первым - не вставай в очередь!
1. Для создания дельты изменений в чем бы то ни было (в тексте, или в бинарных данных и т.п.) есть утилиты/алгоритмы, уже готовые. Можете взять их и адаптировать под себя, например diff. Как это будет реализовано на уровне JS'а в браузере я пока не очень представляю, но гипотетически - это вполне возможно/реализуемо.

Как решить эту проблему? Возможно ли частичное обновление поля в MySQL

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

Судя по контексту эпитета выше - это проблема не базы, а медленного интернета конкретного пользователя. А так же, какие-то серьёзные ошибки архитектуры. Каким образом пользователи умудряются прислать половину запроса - я не очень представляю, такое даже в "лабораторных условиях" довольно не просто сэмитировать, не говоря уже о том, что бы подобное повторялось многократно. Но если уж у Вас запросы как-то кусками умудряются приходить - ставьте в конце запроса какой-то маркер, который не сможет воспроизвести пользователь, например, какой-то бинарный символ, который будет говорить о том, что это конец сообщения. Если его нет - выдавать пользователю сообщение, что всё очень и очень плохо...

Как выявить частичные изменения, чтобы не гонять весь текст целиком, а только внесённые изменения? Поделитесь опытом.
Ответ на этот вопрос содержится в 1-м абзаце, выше по тексту :)

Кроме того, как только пользователей станет много, подозреваю, сервер ляжет.
Довольно странно будет, если у Вас база ляжет от такой нагрузки... Это скорее больше похоже, опять таки, на серьёзные ошибки в архитектуре, а не проблемы БД/сервера как таковых.
Ответ написан
Комментировать
Taraflex
@Taraflex
Ищу работу. Контакты в профиле.
Произошедшие изменения на клиент сначала пишем в indexeddb/websql (localstorage используем только если нет первых 2-х ибо localstorage синхронный). Можно взять готовые обертки
https://github.com/tantaman/LargeLocalStorage
https://github.com/localForage/localForage
https://github.com/yathit/ydn-db
Также в localstorage храним флаг помнящий была ли последняя редакция из localstorage удачно отгружена на сервер.

Дальше думаю понятно.
Ответ написан
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Имхо редис + база, все что набирается хранится в клиенте, отсылается порциями на сервер с указанием что с какой позиции набиралось, из редиса вытаскивается текст, вставляется в нужные позиции, после чего сейвится обратно в редис, раз в эн минут все хреначится в базу, при отсутствии изменений в базу писать не нужно, проверяется хешем текста.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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