Есть хорошая технология AnyEvent (на самом деле их множество разных).  Когда
ваяем какой-либо сервер с использованием этой технологии, то под нее
довольно хорошо ложится только простая передача контента из сокета в сокет.
А вот если сюда надо добавить обработку данных, то в зависимости от того
насколько эта обработка сложная технология может начать хромать на обе ноги.

схема:

1. взяли данные из одного места (AE::io $place, 0 sub {})
2. сделали над данными преобразование (тот самый sub)
3. отдали их клиенту (AE::io, $client, 1, sub {})

все работает красиво и быстро, пока пункт 2 выполняется быстро. Когда в
пункте 2 мы делаем например какую-то текстовую обработку данных, то вся
система понижает время отклика.

хочется спросить у аудитории кто какие пути борьбы с этим знает?

наиболее очевидный - запуск N параллельных процессов, которые работают по
этой схеме. Получается что это работает сильно лучше форковой схемы (один
процесс на одного клиента), но в целом тоже может страдать отклик.
появляется проблема что если один процесс "схватил" несколько клиентов, а
один из них требует выполнения ресурсоемкого задания, то другой клиент будет
ждать, хотя мог бы быть обработан

и менее очевидный - вынесение пункта 2 в отдельный (отдельные) процесс и
тогда обычным AE::io сплавлять ему данные и получать ответ.

но тут встает задача быстрой передачи данных задания в другой процесс.
сериализация/десериализация сама по себе может оказаться довольно накладной
вещью и возвращаемся к тому с чего мы начали. А есть ли способ (может на
базе mmap кто-то делал решение?) быстрой передачи объекта perl между двумя
процессами? И вообще, кто решал подобные проблемы, поделитесь соображениями?
--
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить