Я предполагаю, что этот ваш сервер имеет хорошее подключение к Интернету с широким восходящим потоком. Если это так, то ограничивающим фактором, когда только несколько клиентов загружают несколько файлов, является пропускная способность этих клиентов. Таким образом, вы получите максимальную скорость, равную нисходящей полосе пропускания ваших клиентов. Таким образом, просто взять готовую библиотеку HTTP-сервера для обслуживания загрузок должно быть достаточно.
Реализация вашего бэкенда действительно имеет значение и способна повысить производительность загрузки, когда многие пользователи подключаются к вашему серверу и загружают множество файлов. В первую очередь необходимо учитывать следующие моменты:
TCP имеет время запуска. Когда вы впервые открываете соединение, скорость загрузки начинает медленно увеличиваться, пока не достигнет максимума. Чтобы свести к минимуму это время, при загрузке нескольких файлов соединение, открытое для загрузки одного файла, следует повторно использовать для следующего файла.
Загрузка многих файлов одновременно (на стороне клиента) нецелесообразна, когда пропускная способность является ограничивающим фактором, потому что клиент должен запускать много TCP-соединений, и данные будут либо фрагментированы при записи на диск, либо (при предварительном выделении) диск будет довольно занят, прыгая между секторами.
Как правило, ваш сервер должен использовать неблокирующую библиотеку ввода-вывода (например, java.nio) и воздержитесь от создания потока для каждого входящего соединения, так как это приводит к перебору что снова резко снижает производительность вашего сервера.
Если у вас есть действительно большое количество клиентов, одновременно загружающих с вашего сервера, предел, который вы, вероятно, достигнете, будет:
Лимит восходящего потока вашего провайдера
Скорость чтения вашего жесткого диска (насколько мне известно, у SSD ~ 500 МБ/с)
Ваш сервер может попытаться удерживать наиболее часто запрашиваемые файлы в своей памяти и обслуживать содержимое оттуда (ОЗУ DDR3 достигает скорости 17 ГБ/с). Я сомневаюсь, что у вас на сервере так мало файлов, что вы можете кэшировать их все в оперативной памяти вашего сервера.
Так что основная инженерная задача заключается в умном выборе того, какой контент следует кэшировать, а какой нет. Это можно сделать на основе приоритета, назначив более высокий приоритет определенным файлам или с помощью метрики, которая кодирует вероятность того, что один файл будет загружен в течение следующих нескольких минут. Или просто файлы, которые на данный момент скачиваются большинством клиентов.
С учетом таких соображений вы можете раздвинуть границы своего сервера загрузки до определенного момента, после которого единственное улучшение может быть достигнуто за счет распространения или репликации ваших файлов на множество серверов.
Если вы идете в таком направлении, где должно быть возможно одновременное обслуживание миллионов клиентов, вам следует подумать о покупке такой услуги у CDN. Они специализируются на быстрой доставке и имеют множество вышестоящих серверов в большинстве AS, так что каждый клиент может загружать свои файлы с регионального сервера CDN.
Я знаю, я не приводил ни алгоритма, ни примеров кода, но я и не собирался полностью отвечать на этот вопрос. Я просто хотел дать вам некоторые важные рекомендации и мысли по этой теме. Я надеюсь, вы сможете использовать хотя бы некоторые из этих мыслей для своего проекта.
person
lSoleyl
schedule
08.11.2014