Привет всем!
Давно уже пишутся хорошые приложения с использованием техлогии асинхронного джаваскрипта(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.