22 июня 2012 в 18:32

Небольшые проблемы с Faye Comet-Server на рельсах

Привет всем!


Давно уже пишутся хорошые приложения с использованием техлогии асинхронного джаваскрипта(AJAX) на рельсах. Но наконец James Cougland представил отличный сервис по имени Faye Comet-Server, который отлично делает синхронизацию AJAX на всех клиентах канала.

Поиски


По началу я пробовал юзать APE-server написал даже небольшой чат для него но угрюмые проблемы начались на большых лоадах и сервак просто падал. Потом я подумал об Juggernaut но начитавшысь миллион агрессивных постов в его сторону решыл даже не пробовать. Node.js и Socket.io тоже очень неплохие сервисы для реализации технологии Comet но мне надо было что-то интегрирующееся в рельсы. Я решыл попробовать Faye.

Для начала я хотел вспомнить что на старом добром хабре уже есть похожый материал по Comet-y и Faye но все ето изображено на касте сверху там же можно скачать исходних каста и попробывать как оно и с чем его едят. Я же хочу расказать о некоторых проблемах с которыми вы можете столкнуться.

Проблема каналов


В Faye для того чтобы изменения на твоем клиенте показывалась на всех клиентах автоматически используется принцип канала. Ето строка как правило находится в файле application.js и выглядит примерно так:

client.subscribe(var client = new Faye.Client('http://localhost:9292/faye');, function(data) {});

где "/poker/new" ето канал. Ета строчка говорит нам о том что клент которого вы создали:

var client = new Faye.Client('http://localhost:9292/faye');

будет пренадлежать каналу "/poker/new", и все клиенты которые входят в етот канал будут иметь возможность соблюдать у себя в браузере перемены.

Я хочу что бы вы поняли одну важную здесь вещь в Faye. Канал "/poker/new" не имеет ничего общего с url-строкой у меня она например "http://localhost:3000/game/poker". Ето очень важно! Запомніте что канал это простой стринг который абсолютно не имеет ничего общего с урлой.

Проблемы с запуском сервера Faye


Первое что хотелось бы пожелать от разработчиков ето запуск. Он очень даже нехорошый. Каждый раз прописывать в консоли bundle exec rackup faye.ru -s thin -E production ето не самое лучшее что можно было бы представить себе. Но есть несколько вариантов. Описывать их детально я не буду ведь в етом нет очень большой необходимости. Я использовал приемущество daemon_controller для того чтобы Faye-server запускался вместе с Rails-server(Thin Not WEBrick!).

И еще один момент мне спас жызнь потому что ответ мне был нужен быстро так как запуская сервер у меня случалась ошыбка:

ostaptan:cards ostap$ bundle exec rackup faye.ru -s thin -E production
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:9292, CTRL+C to stop
/Users/ostap/.rvm/gems/ruby-1.9.3-p125@cards/gems/faye-websocket-0.4.5/lib/faye/websocket/api.rb:75:in `block in close': undefined method `close_connection_after_writing' for nil:NilClass (NoMethodError)

А ответ тне забыть строчку Faye::WebSocket.load_adapter('thin') в файле faye.ru Который подгружает нам Thin.
ruby on rails, ajax, comet, web-разработка
Наш человек в Сайгоне