17 апр. 2011 г.

Ковыряние. Eventmachine vs Erlang.


Завтра у меня *большая и важная контрольная* по конструлям потому я зачем-то страдаю херней и решил наконец напостить в бложик. Тем более что есть о чем.



На работе случилась необходимость написать по-быстрому прототипчик сервера раздачи контента плагину для Adobe ID. Подключений много, все долгоживущие, но каждое по-отдлельности в основном простаивает.

На чем же писать асинхронный TCP сервер с потенциалом на несколько сотен, а то и тысяч, подключений? Поскольку пистон я не люблю выбор оказался между Eventmachine и Erlang. 

Helloworld'ы на eventmachine это действительно просто и сравнительно понятно. Сложная логика быстро превращается в спагетти из callback'ов. С этим приходиться бороться и даже иногда получается. Впрочем это проблема не столько Eventmachine, сколько event-based подхода вообще – тем же страдает Node.js (впрочем Node еще много чем страдает :) )

Поскольку цели сделать финальный вариант не было, а OTP я не знаю, то решил без него. Заодно Erlang лучше "распробовал".

Erlang вполне ожидаемо выиграл и по производительности (почти линейно размазывается по ядрам, можно еще по нодам, но я не пробовал) и по прямолинейности кода (отсутствию callback'ов и конечных автоматов). Синтаксис по-началу заставляет тосковать по оному в Haskell, и похоже не только меня. Но быстро привыкаешь. Есть ощущение что по-дороге изобрел немного OTP.

Когда уже закончил с Erlang версией сервера увидел Revactor. Можно лечить спагетти ценой ограничения кол-ва поддерживаемых платформ (только Ruby 1.9+), но императивную семантику Ruby все равно в мешке не утаишь. Производительность тоже, хотя 1.9 в этом плане получше. Насколько я понял автор сабжа полузабил и ушел делать Reia.

При желании перед Ruby скрыптами можно поставить load-balancer и получить горизонтальную масштабируемость, еще через это можно обновлять код сервров за балансировщиком по-очереди, создавая видимость горячей замены кода. Но это более костыльное решение чем большой и счастливый Erlang всему. Тем более, что при использовании OTP эти ништяки получаются совсем сами собой (без OTP надо следовать некоторым соглашениям).

Для полноты картины надо поиграть в асинхронную монаду (Haskell) и продолжения (Scheme). Предполагаю, что Haskell будет удобнее для front-end'а, Erlang для back-end'а. А Scheme неплоха и там и там, но медленнее обоих.

З.Ы.: У меня окончательно вызрела идея давно обещанной библиотеки анимации на JS. Надеюсь доживет в голове до лета.
З.З.Ы.: Старый добрый "Пушистик" получил воторое рождение на HackDay.
З.З.З.Ы.: Быть может скоро напостю про курсовик и Android vs iPhone