November 19, 2009

Как программировать скоростные сервера в Лиспе

17 Ноября я презентовал мои идеи о конструкции скоростных серверов в Лиспе Монреальской группе программистов Scheme и Лисп.

Идеи презентации исходят из моей экзаменации веб-серверов Antiweb и TPD2 (смотрим презентацию Джона Фремлина о TPD2 Шибуйским Лисперам здесь). Один недостаток обоих серверов - довольно наивный подход к конкуренции и синхронизации. Я решил конструировать новый веб-сервер на базе этих примеров и размышлений, HTTP DOHC (DOHC - Dual Overhead Camshaft, когда в двигателе автомобиля двое распределительных валов в головке цилиндров - имя выбрано из за связанной двойной системы демультиплексирования в сервере).

Планирую дальнейшее развитие HTTP DOHC в полноценный веб-сервер, с интерфейсом схожим с Hunchentoot 1.0.

Ещё хочу обратить внимание - освободилось личное время для коммерческих проектов. Пишите на vsedach@gmail.com если есть что интересное.

3 comments:

archimag said...

А я то думаю, к чему эта активность в рассылке iolib :)

Меня последние пару месяцев не покидает мысль сделать для hunchentoot новый acceptor и taskmaster на основе iolib и схемой обработки запросов в стиле nginx. После беглого просмотра кода мне показалось, что это можно сделать без переделки оригинального кода. Только всё времени на это нет.

quasimoto said...

Не понял одной вещи - почему есть пул акцепторов? Ведь акцептор привязывается к адресу и порту, слушает, и отдаёт соединения в потоки мультиплексирования. Как их может быть несколько?

Vladimir Sedach said...

Акцептор - это тот процесс, который вызывает accept() на сервер (passive) сокет (этот сокет и привязан к адресу и порту).

Вот в том и фишка - все треды в пуле акцепторов сами отвечают на первый запрос, и только потом передают сокет в epoll пул на мултиплексирование. ТК accept() уже тред-safe (на винде и современных линуксах и бсд) получается что можно ответить на первый запрос без переключения контекста и даже без использование мьютекса.