Как реализовать регулирование пропускной способности на стороне клиента для FTP/HTTP?
Мне поручено написать систему загрузки данных на стороне клиента (в Linux), которая использует FTP или HTTP для загрузки данных размером в терабайт от внешних партнеров на наш локальный сайт. Администратор сети нашей компании говорит мне, что я не могу превысить определенную пропускную способность. Каков наилучший способ для меня реализовать такую систему? Существуют ли существующие библиотеки?
Я открыт для написания своих собственных клиентов FTP и HTTP (в C или Java на Linux), но предпочел бы остаться вне ядра. Я знаю, что могу ограничить скорость, с которой мой FTP/HTTP-клиент вызывает сокет read(), но что произойдет, если на стороне сервера вызовет write() быстрее моего лимита?
5 ответов
Вы могли бы построить еще один слой поверх InputStream
: В read
метод, вы можете посчитать байты до сих пор. Если число байтов в секунду превышает определенный лимит, дайте потоку загрузки некоторое время спать. Контроль потока TCP делает все остальное.
Для простоты, если вы используете Linux, вы можете просто использовать wget
вместо того, чтобы заново изобретать колесо? Посмотрите на --limit-rate
переключатель.
Но вернемся к теме:) Этот ответ может помочь вам начать: как я могу реализовать ограниченную скорость загрузки в Java?
Если вы знаете задержку сетевого пути, вы можете просто установить размер получаемого буфера TCP на желаемый продукт с задержкой пропускной способности. Это задушит отправителя в порядке. Но результирующее значение может быть слишком маленьким для вашей платформы, поэтому оно может изменить его в сторону увеличения. Проверьте значение после его установки.
Знает ли ваш нетадмин, что TCP автоматически разделяет пропускную способность?
Я знаю, что Apache JMeter имитирует медленные соединения. Вы могли бы, возможно, взглянуть на код.
Вы открыты для готовых продуктов с графическим интерфейсом или командной строки? Filezillia обеспечивает это. Также есть клиент командной строки linux, называемый lftp. Устанавливаемый параметр - net: limit-total-rate, который будет ограничивать скорость передачи. Поскольку этот клиент поддерживает несколько передач одновременно, он также имеет параметр net: limit-rate.