[Moscow.pm] процессы и AnyEvent: быстрая передача данных

Ivan Petrov i.petro.77.00 на gmail.com
Ср Янв 12 23:01:43 PST 2011


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

схема:

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

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

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

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

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

но тут встает задача быстрой передачи данных задания в другой процесс.
сериализация/десериализация сама по себе может оказаться довольно накладной
вещью и возвращаемся к тому с чего мы начали. А есть ли способ (может на
базе mmap кто-то делал решение?) быстрой передачи объекта perl между двумя
процессами? И вообще, кто решал подобные проблемы, поделитесь соображениями?
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20110113/581ffa94/attachment.html>


Подробная информация о списке рассылки Moscow-pm