Одной из идей было бы использование рабочих очередей (каталогов или БД), при условии, что вы будете использовать хранилище таким образом, чтобы оно соответствовало вашим критериям избыточности.
\ retrieve
\ retrieve \server1
\ retrieve \ server ...
\ retrieve \ server10000
\ in-process
\ complete
1.) Все страницы, которые будут семенами, будут хэшироваться и помещаться в очередь с использованием хэша в качестве корневого файла.
2.) Перед помещением в очередь вы проверяете полные и незавершенные очереди, чтобы убедиться, что выне ставить в очередь
3.) Каждый сервер извлекает случайные пакетные файлы (1-N) из очереди извлечения и пытается переместить их в личную очередь
4.) Файлыесли произошел сбой процесса переименования, предполагается, что он «запрошен» другим процессом
5.) Файлы, которые можно переместить, должны быть обработаны, поместите маркер в каталог в процессе, чтобы предотвратить повторную очередь.
6.) Загрузите файл и поместите его в очередь \ Complete
7.)Очистите файл из каталогов внутри процесса и сервера
8.) Каждые 1000 прогонов проверяют самые старые 10 файлов внутри процесса, пытаясь переместить их из своих очередей на сервер обратно в общую очередь извлечения.Это поможет, если сервер зависает, а также должен балансировать нагрузку на медленных серверах.
Для извлечения, внутрипроцессных и полных серверов большинство файловых систем ненавидят миллионы файлов в одном каталоге, разделите хранилище на сегменты по символамхэша \ abc \ def \ 123 \ будет каталогом файла abcdef123FFFFFF….Если бы вы масштабировали до миллиардов загрузок.
Если вы используете базу данных mongo вместо обычного файлового хранилища, многих из этих проблем можно избежать, и вы сможете извлечь выгоду из шардинга и т. Д. *