Способы синхронизации многих (небольших) файлов через сетевое соединение с высокой задержкой
Мы обычно разворачиваем наши программные приложения на наших клиентах, используя Subversion (svn update на клиентах; однонаправленный). В настоящее время у нас возникают проблемы с одним из наших клиентов из-за высокой задержки (большие скорости загрузки файлов), потому что они находятся в Китае, а наш сервер - в Канаде. Subversion просто отключается с ошибкой после очень длительного периода времени.
Наше приложение имеет множество небольших файлов (.aspx, .config и т. Д.) И несколько больших файлов (.dll, .jpg), что в общей сложности составляет около 100-200 МБ.
В настоящее время я рассматриваю возможность сделать следующее:
- Провести локальную проверку SVN на сервере
- Почтовый результат
- FTP или rsync большой почтовый файл на чужой компьютер
- Распаковка файла во временную папку.
- Выполнение локальной rsync из этой временной папки в нашу обычную папку установки.
Есть ли лучшие решения?
- Настройка зеркала Subversion ближе к месту назначения? (Мне понадобится всего несколько часов в месяц, но может быть трудно найти)
- Используете другую систему контроля версий? (Git лучше для соединений с высокой задержкой)?
- Существуют ли способы упаковки патчей Subversion (включая двоичные файлы) для повторного применения в месте назначения вместо отправки всех данных?
- Будет ли лучше использовать DropBox (который использует Amazon S3) для передачи файлов во временную папку?
3 ответа
Не стучите по rsync для всего дерева маленьких файлов, пока вы не попробуете. Он не выполняет циклическую обработку для каждого отдельного файла, он конвейеризован, поэтому он должен быть таким же быстрым, как и все остальное во всем наборе данных. (Так быстро, как TCP может собирать кадры в упорядоченные пакеты на вашем канале с высокой задержкой.)
Посмотрите, как работает rsync, чтобы объяснить, как избежать обходов.
Вы можете создать патч в стиле Unix для всех изменений во всех файлах. И просто перенести это в zip-файл.
Вы можете использовать git (возможно, с git-svn) для обработки передачи. Это удивительно эффективно для устранения различий в версиях файлов.
В противном случае вы можете использовать двоичный инструмент сравнения xdiff.