В настоящее время я ищу решения, которые могут оптимизировать использование пропускной способности сети.
Сценарий: на сервере есть файл. Клиент загружает его через REST API. Клиент вносит некоторые изменения и загружает измененный файл обратно на сервер через REST. Сервер заменит исходный файл загруженным файлом.
Возможные подходы Я имею в виду два возможных подхода.
1- Local Diff Перед внесением каких-либо изменений клиент сделает копию оригинального файла. После внесения изменений клиент будет использовать алгоритмы, такие как BSDiff или XDelta, для извлечения изменений путем сравнения оригинальных и измененных файлов. Эти изменения будут отправлены на сервер. Сервер будет применять diff к исходному файлу.
2- Использование R-Sync. Выполните вызов REST на сервере и запросите начальную скользящую контрольную сумму и хэш MD5. Затем на основе ответа сгенерируйте diff и отправьте его на сервер. Сервер объединит изменения.
Я провел грубое тестирование и обнаружил, что BSDiff является наиболее эффективным решением (с учетом различий - что является основной целью оптимизации). Он генерирует наименьшее возможное различие, НО требует огромной памяти, что делает невозможным использование на стороне клиента для файлов большого размера. С другой стороны, результаты X-Delta и остальных инструментов бинарного сравнения, которые я пробовал, не так уж хороши с точки зрения размера генерируемого diff. Локальный diff также имеет недостаток использования дополнительного дискового пространства из-за сохранения копии исходного файла. Это может быть проблемой в случае больших файлов.
Проблема памяти BSDiff делает R-Sync наиболее подходящим выбором (потому что остальные инструменты не настолько эффективны при поиске различий). Поэтому я решил пойти на R-Sync.
R-Sync работает в два этапа. Сначала он получает подписи на основе файла, а затем данные отправляются обратно на основе подписей, отправленных ранее. Я планирую дополнительно оптимизировать R-Sync, сохраняя подписи исходного файла на стороне клиента, прежде чем вносить в него какие-либо изменения. Это избавит клиента от необходимости запрашивать сервер для вычисления и отправки подписей во время загрузки. Клиент может просто отправлять данные на основе уже вычисленных подписей на сервер всякий раз, когда клиент хочет загрузить файл.
Вопрос: Я знаю, что это немного странный вопрос, поэтому я задал вопрос, прежде чем задавать его здесь. Я просто хотел бы знать, есть ли лучшие альтернативы для решения такого рода проблем? Я хочу подтвердить свой подход, просто чтобы убедиться, что я на правильном пути и не пропускаю ничего важного.