Лучшая методика для реализации HTTP(S) прокси сервера?
Здравствуйте, уважаемые хабровчане!
Собрался писать HTTP(S) прокси сервер с определённым дополнительным функционалом, к которому будут подключаться несколько клиентов, а сам он в свою очередь будет также подключаться к другому прокси серверу. Некий промежуточный проксик.
Крайне важно, чтобы keep-alive работал.
А совет нужен вот в чём — как реализовать? Самым простым вариантом кажется реализация на тредах (создаём на каждого клиента свой поток, и гоняем данные туда сюда). Но… Хочется что-то получше и попроизводительней — ресурсов очень ограниченное количество.
Проблема в том, что в асинхронном программировании я полный профан. Не посоветуете, как подступиться? Не кинете в меня хорошими мануалами для таких дел? Или всё же не заморачиваться и делать на тредах? Опять-таки, не посоветуете лучшую методику реализации? Мануалами в меня не кинете?
Как лучше всего таки организовать данный проксик?
Пишется под WinXP SP3, но посредством MinGW.
Извиняюсь за сумбурность вопроса, лучше не смог что-то… Если что непонятно, уточняйте!
Под Windows вариант один клиент — один тред является оптимальным, если не требуется очень большого числа одновременных подключений (скажем, порядка 10000). Если требуется что-то очень высоконагруженное, то используется вариант один тред — n клиентов на асинхронных неблокирующих сокетах с наращиванием числа тредов по необходимости.
Но опять же могу предложить написать плагин под 3proxy, если его функционала недостаточно.
Ни разу не пошутил, в HTTP-прокси один активный пользователь создает несколько подключений, 10000 подключений это порядка 1500-2000 одновременно браузящих пользователей. Вот как раз таки в *nix, если использовать select() (что, правда, вряд ли кто-то будет делать в более-менее нормальном проекте) проблемы будут с большим числом подключений из-за особенностей реализации select() в POSIX.
Я бы посоветовал поискать готовый open source проект, взять и допилить функционал. Особенно учитывая отсутствие серьезного опыта в этой сфере.
Если же сильно хочется, я бы посоветовал использовать библиотеку asio, которая существует как в пакете boost, так и отдельно. Лучше конечно вместе с буст, прям там есть неплохие примеры реализации асинхронных серверов, которые можно взять за основу.
Кстати еще есть вариант с пулом потоков, где в процессе всегда поддерживается какое-то минимальное количество запущенных потоков. Таким образом, при подключении клиентов, ресурсы на создание потоков тратиться не будут. Такое решение будет хорошо работать только на многоядерных системах и при большом кол-ве клиентов. На одном ядре лучший вариант это неблокирующие сокеты, т.к. более экономен в ресурсах.