> Идея в том что бы не вызывать 1 000 000 потоков на 1 000 000 доменов, всего лишь 8-16.
А такой идеи и не было ни у кого.
А вот давайте подсчитаем насколько сильно вы утилизируете ресурсы системы:
Принимаем:
1. Время отклика сайта - 1 сек.
2. Ваши 8-16 потоков.
3. Размер страницы (чистый HTML) - 100 кб.
И так что получаем:
в секунду мы опрашиваем 16 сайтов.
в секунду у нас трафик 16*100 = 1,6 Мбайт\с
время сканирования 1млн сайтов = 17 часов. ( а можно и быстрее).
с учетом того что скорости домашнего интернета кое-где побольше (а если взять серверное решение, то еще больше) - то утилизируете вы всего 1\10 полосы пропускания канала. Т.е. могли бы поднять и кол-во потоков до 160 как минимум.
Почему я посоветовал Erlang ?
да все дело в том, что в нем вы можете создать и 10,и 10000 процессов, которые будут обслуживать ваши задачи, и утилизировать ресурсы на все 100%.
Конечно цифры 100000 потоков на парсинг + 1000 потоков на днс - утрированы, но ничего не будет мешать сделать и такое кол-во процессов + прозрачно распределить все это дело на несколько машин.
А причем тут кеширующий DNS ? По определению 1е+6 доменов вы не посещали, следовательно все запросы к одному DNS будут его нагружать, и это будет такой своеобразный bottle neck. Чтобы увеличить пропускную способность, надо использовать несколько DNS-серверов. И да, а где я говорил что их надо ставить ? Их надо просто использовать из интернета.
У Postgres один движок БД, соотвественно вы можете хранить все данные там, но забудьте о компрессии. Далее, у если вы изменяете данных (удаляете записи), но периодически вам нужно вызывать vacuum (что может отрицательно сказаться на производительности)
Менять настройки полей не в БД, а в конфигурационном файле, который одновременно может читать и обычный скрипт сайта, и специализированная система развертывания структуры БД.