Лучшая методика для реализации HTTP(S) прокси сервера?

Здравствуйте, уважаемые хабровчане!



Собрался писать HTTP(S) прокси сервер с определённым дополнительным функционалом, к которому будут подключаться несколько клиентов, а сам он в свою очередь будет также подключаться к другому прокси серверу. Некий промежуточный проксик.

Крайне важно, чтобы keep-alive работал.



А совет нужен вот в чём — как реализовать? Самым простым вариантом кажется реализация на тредах (создаём на каждого клиента свой поток, и гоняем данные туда сюда). Но… Хочется что-то получше и попроизводительней — ресурсов очень ограниченное количество.

Проблема в том, что в асинхронном программировании я полный профан. Не посоветуете, как подступиться? Не кинете в меня хорошими мануалами для таких дел? Или всё же не заморачиваться и делать на тредах? Опять-таки, не посоветуете лучшую методику реализации? Мануалами в меня не кинете?



Как лучше всего таки организовать данный проксик?



Пишется под WinXP SP3, но посредством MinGW.



Извиняюсь за сумбурность вопроса, лучше не смог что-то… Если что непонятно, уточняйте!
  • Вопрос задан
  • 4274 просмотра
Решения вопроса 1
Под Windows вариант один клиент — один тред является оптимальным, если не требуется очень большого числа одновременных подключений (скажем, порядка 10000). Если требуется что-то очень высоконагруженное, то используется вариант один тред — n клиентов на асинхронных неблокирующих сокетах с наращиванием числа тредов по необходимости.

Но опять же могу предложить написать плагин под 3proxy, если его функционала недостаточно.
Ответ написан
Пригласить эксперта
Ответы на вопрос 5
@RubtsovAV
Вариант с потоками самый надежный. Есть еще такая вещь как не блокирующие сокеты, возможно вам подойдут, вторая ссылка в гугле www.cyberforum.ru/cpp-linux/thread346566.html
Ответ написан
Комментировать
@mitnlag
Вместо мануала дам совет. Напишите модуль под nginx.
Ответ написан
AterCattus
@AterCattus
Люблю быстрый backend
libevent/libev вполне могут оказаться подспорьем, если надумаете «с нуля» писать
Ответ написан
Комментировать
AxisPod
@AxisPod
Я бы посоветовал поискать готовый open source проект, взять и допилить функционал. Особенно учитывая отсутствие серьезного опыта в этой сфере.

Если же сильно хочется, я бы посоветовал использовать библиотеку asio, которая существует как в пакете boost, так и отдельно. Лучше конечно вместе с буст, прям там есть неплохие примеры реализации асинхронных серверов, которые можно взять за основу.
Ответ написан
@RubtsovAV
Кстати еще есть вариант с пулом потоков, где в процессе всегда поддерживается какое-то минимальное количество запущенных потоков. Таким образом, при подключении клиентов, ресурсы на создание потоков тратиться не будут. Такое решение будет хорошо работать только на многоядерных системах и при большом кол-ве клиентов. На одном ядре лучший вариант это неблокирующие сокеты, т.к. более экономен в ресурсах.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы