vg писал(а):Недавно обсуждал вопрос об архитектуре сервера реализующего кастом команд-ориентед протокол ...
Транспорт - TCP. Мне сказали, что архитектура, когда сервер делается в первичном потоке на блокирующем прослушивающем сокете (Беркли интерфейс), и когда каждый клиент обслуживается в отдельном потоке - сакс.
не все так черно-бело, но в принципе верно. то есть скорее так - если
обработка клиентского запроса не занимает много времени, то стоит
все делать в одном потоке. причин несколько -
(а) треды не бесплатны. под линуксом тред = облегченный процесс,
так что иметь 10000 тредов на 10000 клиентов - напрашиваться на
проблемы. про пулы тредов я вообще молчу.
(б) упрощенная синхронизация в коде или отсутствие необходимости
ее как таковой -> меньше шансов налепить нетривиальных багов и
_гораздо_ проще в отладке
Было сказано, что такой софт никто не будет покупать...
если продается не сам код, а продукт, то в принципе до балды как он
написан, лишь бы работал per specifications.
Было заявлено, что всё на самом деле можно сделать в одном потоке.
зависит, но в принципе правильно. если нормируется время ответа,
то надо смотреть сколько по максимуму занимает обработка одного
запроса и какая средняя загрузка в запрос/сек.
Было сказано также, что Winsock Microsoft вообще тянет как устарелую технологию только ради поддержки старых приложений.
ну это было сказано человеком, который толком не знает winsock,
либо ты его не так понял. в winsock конечно нет поддержки epoll,
но его е**нутые WSA Events вполне нормально scale'ятся.
Как же сделать так, чтобы всё работало без отдельных потоков для клиентов.
http://www.monkey.org/~provos/libevent - немного кривовато, но представление дает
http://liboop.org - из той же оперу, вид сбоку
общая идея такая - на каждый коннекшн заводится state, сокет
регистрируется в глобальной select/poll/epoll loop и мониторится
на события. вся работа выполняется в обработчике события в
соответствии со state'ом.
надо мозги слегка вывернуть, но как только их вывернешь - назад
пути не будет
ps. у меня сейчас бежит 2х тредовый сервер под линуксом, держит
несколько десятков тысяч клиентов. central loop - на epoll. сессии
по несколько часов, часто - дней. средняя загрузка - 30%, трафик -
около 200 kbps. второй тред - под крипто операции, первый - под
все остальное. делайте выводы.
pps. эту ссылку я по-моему уже не раз давал, она классическая по
этой тематике -
http://www.kegel.com/c10k.html