faye_shards¶ ↑
-
Provides some useful methods to push data from Ruby on Rails to Faye (by jcoglan, faye.jcoglan.com).
-
Designed to work with both HTTP and HTTPS connections (RoR pushes via HTTP, client can be connected using HTTPS). Check out rails-alex.blogspot.com/2011/10/ssl-support-for-high-loaded-faye-nodejs.html to see how to configure Stunnel in front of Faye to enable HTTPS.
Comments¶ ↑
This gem will be helpful if you are planning to run more than one instance of Faye (doesn’t matter on 1 server or on many). If users in your application are subscribed to unique channels (eg. “/#{current_user.id}”) - faye_shards will fit all your needs. If you have global channels (which you use widely) and many instances of Faye - this game is not a perfect solution for you, but it will work. It doesn’t matter if you use Redis as data storage or not.
Check out these posts/discussions about Faye sharding:
Installing¶ ↑
Simply add
gem 'faye_shards'
to your Gemfile
Configuration¶ ↑
All you need to configure gem is to create file faye.yml in config folder. Here is an example:
development: shards: - port: 42000 host: 127.0.0.1 - port: 42001 host: 127.0.0.1 production: shards: - local_host: 10.1.1.1 port: 42000 host: server1.myapp.com secured: true secured_port: 32000 - local_host: 10.1.1.1 port: 42001 host: server1.myapp.com secured: true secured_port: 32001
Required options:
-
host
- IP or domain name where instance of Faye is running -
port
- port, instance of Faye is listening to
Optional params:
-
local_host
- local IP of server. Used for pushes from Rails instead ofhost
if specified. Just to communicate via local interfaces. -
secured
-true/false
. Specifies if there is a SSL Offloading configured for Faye instance. -
secured_port
- Required if secured is set totrue
.
So, in my example for production I have 2 Faye instances listening to ports 42000 and 42001 using HTTP + Stunnel configured to listen 32000 and 32001.
Usage¶ ↑
URL for Faye’s client-side JS (unless you store it somewhere on diff storage) is returned by this methos:
current_user.faye_shard.js_url(request.ssl?)
Module FayeShard::User::Faye
which can be included to your User model provides method faye_channel
which returns unique channel id for user. If you do not want to include module to your model - you need to manage unique channels for users yourself.
On client side, subscription should look like:
client = new Faye.Client(<%= raw current_user.faye_shard.url(request.ssl?).inspect %>); fayeSubscription = client.subscribe(<%= raw current_user.faye_channel.inspect %>, function(data) {});
or
fayeSubscription = client.subscribe(<%= raw my_own_method_for_channel_id.inspect %>, function(data) {});
Pushing data to user’s channel also depends on your decision to include module FayeShard::User::Faye
. So, 2 options:
current_user.push_to_faye(data) # Sends data to channel, returned by current_user.faye_channel
or
FayeShards.shard(current_user.id).push(my_own_method_for_channel_id, data)
Extensions can be passed as an additional hash after data
How to push to global channel and more information about gem can be found here: .
Roadmap / TODO¶ ↑
-
UT
-
Add example Rails app which uses faye_shards.
-
GOD scripts to start/monitor Faye instances based on faye.yml
Copyright¶ ↑
Copyright © 2011 Alex Kazeko. See LICENSE.txt for further details.