Faye Online user list and time count


  1. Add it to Gemfile
gem 'faye-online'
  1. add faye related table
bundle exec rake db:migrate
  1. faye server Create a faye.ru at your rails app root, configure it,
$faye_server = FayeOnline.get_server(:host=>"localhost",
run $faye_server

and start faye server

bundle exec rake faye:start
DEBUG_FAYE=true DEBUG=true bundle exec rackup faye.ru -s thin -E production -p 9292
  1. faye client
eoe.faye = Faye.init_online_client({
  faye_url: faye_url,
  client_opts: {},
  auth_opts: {
    room_channel: eoe.class_channel,
    time_channel: eoe.lesson_channel,
    current_user: eoe.current_user

Date Storage Stucture

  • mysql.table.faye_channels channel name to id, use for key value cache.
  • mysql.table.faye_channel_online_lists online user list, store as Set data structure, add and delete.
  • mysql.table.faye_user_online_times user online time, store every start time and spend time.
  • mysql.table.faye_user_login_logs verbose user login log, used for caculate online times alternately.
  • .
  • redis.hashes.ns/uid_to_clientids/room_channel all clientids of one uid in a room_channel
  • redis.hashes.ns/uid_to_clientids/time_channel all clientids of one uid in a time_channel
  • redis.keys.ns/clientid_auth/clientid map clientid to user info
  • redis.keys.ns/clientid_status/clientid current clientid is login or logout

Glossary of Terms


客户端(一般是浏览器里的javascript)连到服务器后自动分配一个clientId。 示例数据为:

    "current_user"=>{"uid"=>470700, "uname"=>"mvj3"}

User Login

有很多个clientId连到server。其中可能多个clientId关联的是一个user,这个在 Faye.init_online_client 可以配置。

User Logout

一个user关联的所有clientId失去连接后才算离线。 server判断一个user离开房间的两种机制:

  1. client端主动触发disconnect发消息,对于的实际操作是关闭所有相关页面。

  2. 网络掉线。在 FayeOnline.get_server 设置gc参数让server端定时ping所有的clientId,具体方法在faye-redis-ruby.gem里的 EventMachine.add_periodic_timer(gc, &method(:gc)) 。如果检测是失去连接,那么server就给自己发个伪装的disconnect消息,从而清理失去网络连接的clientId。






1, 这样如果浏览器真的关掉了,那就和原来的autodisconnect发送的"/meta/disconnect"消息一样。

2, 如果浏览器被用户选择否定关掉,那浏览器里的client对象还是没被销毁,而继续存活。


  1. FayeOnline.faye_online_status 通用化
  2. Cluster front end https://github.com/alexkazeko/faye_shards
  3. use rainbows server, see faye-websocket README。一些尝试见rainbows.conf, https://groups.google.com/forum/#!msg/faye-users/cMPhvIpk-OU/MgRcFhmz8koJ
  4. 英文化
  1. https://github.com/ryanb/private_pub Private Pub is a Ruby gem for use with Rails to publish and subscribe to messages through Faye. It allows you to easily provide real-time updates through an open socket without tying up a Rails process. All channels are private so users can only listen to events you subscribe them to.

  2. http://blog.edweng.com/2012/06/02/faye-extensions-tracking-users-in-a-chat-room/ only track clientId

  3. http://faye.jcoglan.com/ruby/monitoring.html tech detail about track connect and disconnect in faye