Есть социальная сеть. Есть много пользователей, которые заливают много статического контента (фото/видео/аудио). Хранить это локально на том же сервере нельзя, объем памяти жестких дисков быстро исчерпается. Докупаем несколько физических серверов под эти нужды. Теперь встает задача программного уровня. Пишем загрузчик файлов, например изображений для начала. Когда пользователь выбрал в форме загрузки файлов изображения, они с помощью ajax запроса отсылаются на обработку php-скрипту, когда php-скрипт обработал фотографию (поменял ширину/высоту/обрезал и т.п.), он пишет новое изображение в файл с помощью функции imagejpeg и ей подобных пока что локально на этом же сервере, чтобы дальше загрузить это изображение на ftp-сервер и информацию по файлу в базу данных, а после этого происходит уничтожение локальной копии файла. Хорошо, тут я и предлагаю, всем вместе подумать. Очевидно у нас может быть много серверов со статикой, также очевидно, что в базе данных, нужно хранить номер сервера где хранится этот файл, чтобы потом собрать ссылку до этого файла. Теперь осталось всего ничего написать программный компонент, который будет возвращать скрипту-загрузчику файлов, соединение с тем фтп-сервером на который будет заливаться этот файл.
Я думаю, что этот компонент должен быть реализован с помощью шаблона проектирования singleton, это раз. Второе, я думаю, что этот компонент должен по каким-то критериям, выбрать фтп-сервер и попробовать с ним установить соединение и вернуть его, если этого не получается сделать, то повторить процедуру и суметь избежать зацикливания. Третье, собственно определить, по каким критериям выбирать фтп-сервер, рандомно, round-robin (наверное нужно хранить номер последнего сервера, который обратывал запрос), по загруженности сервера? По какой формуле определять эту загруженность? Как удостоверится, что файлу точно хватит места на жестком диске? Четвертое, решить где хранить данные по фтп-серверам массивом в файле/sql/nosql еще где-то?
Как вы вообще видите реализацию такого компонента? А может вовсе не нужно такого делать и есть уже какие-то готовые решения? Пишите, буду рад.