3

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

Сценарий: на сервере есть файл. Клиент загружает его через 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, сохраняя подписи исходного файла на стороне клиента, прежде чем вносить в него какие-либо изменения. Это избавит клиента от необходимости запрашивать сервер для вычисления и отправки подписей во время загрузки. Клиент может просто отправлять данные на основе уже вычисленных подписей на сервер всякий раз, когда клиент хочет загрузить файл.

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

2 ответа2

1

Я думаю, что ваше решение пойти с rsync является лучшим. Это рентабельно, точно и хорошо продумано. Не забывайте использовать опцию --strict для md5sum иначе вы можете столкнуться с проблемами. Возможно, вы захотите пропустить некоторые проверки больших файлов, так как это просто съест ресурсы и даст тот же результат. Представьте, что вы сравниваете два файла по 2 ГБ - гораздо проще просто удалить старый, скопировать новый и обновить хэш и контрольную сумму, чем создавать новый хэш, сравнивать его со старым и затем объединять изменения. Для небольших файлов не имеет значения.

Другая идея состоит в том, чтобы просто запустить diff для хэшей, а затем частично передать файлы - rsync --checksum , --update и --inplace - ваши друзья.

Для дальнейшей оптимизации использования пропускной способности сети вы можете рассмотреть --compress и --bwlimit= .

Я не знаю, как часто вам нужно передавать эти файлы, как часто должна происходить синхронизация. Если слишком часто, может быть, лучше настроить Unison. Подробнее об этом в Linux Journal.

Удачи!

0

Это в основном у меня над головой - особенно с двоичными файлами, но разве обычный rsync не передает по умолчанию только изменения в нелокальное назначение? (Если нет, у него есть опция --nowhole-files.)

Если это так, он сделает всю работу за вас.

Если вам нужна более подробная информация, пишите на rsync@lists.samba.org, где тусуются очень полезные эксперты по rsync. Вы можете подписаться на https://lists.samba.org/mailman/listinfo/rsync .

Для таких вопросов было бы очень полезно, если бы вы указали, какую операционную систему и версию вы используете, а также версию рассматриваемых программ. Я никогда не слышал о R-Sync, но я все время использую rsync в Linux.

Я не уверен, но я думаю, что видел ссылки на запуск rsync под Cygwin в Windows, если это ваша среда.

Этот форум, в частности, отвечает на вопросы о Windows и Linux, поэтому еще более важно указать свою среду здесь.

См. Также https://en.wikipedia.org/wiki/Rsync. Он охватывает сам rsync, а также другие утилиты, такие как rdiff, которые могут оказаться полезными.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .