rails上利用message_bus实现websocket即时通讯

最近在玩websocket,看了一下rails下的websocket方案主要有faye与message_bus等,研究了下感觉message_bus比较好集成,就是文档太少了,于是自己研究了下怎么在rails下使用。

个人原创,版权所有,转载请注明出处,并保留原文链接:

https://www.embbnux.com/2015/11/25/rails_use_message_bus_for_websocket_real_time/

一、添加message_bus到rails

添加gem ‘message_bus’到Gemfile, bundle install安装,重启rails

redis配置: config/initializers/message_bus.rb


MessageBus.redis_config = { url: "redis://127.0.0.1:6379/1" }

二、message_bus主机和客户端

message_bus分为主机和客户端,主机发送信息,而客户端订阅信息

这里的服务器为主机,用于向客户端发布信息,环境为ruby, rails

由于是网站,所以客户端为浏览器,环境即js

主机可以在数据after_save的时候向订阅用户客户端发送信息

三、实现

rails里面: models/message.rb


after_create :notify_has_new_message

private
def notify_has_new_message
  data = {
    message: self.content
  }
  MessageBus.publish "/real_time_channel/#{to_user.id}", data
end

 

assets/javascripts/application.js:


//= require message-bus
if(window.App.user.is_login){
  MessageBus.start();
  MessageBus.callbackInterval = 500;
  MessageBus.subscribe("/real_time_channe/1", function(data){
   alert(data.message);
  });
}

四、进一步

基本的使用上面就可以了,为了安全,可以给每个用户分配一个access_token,订阅的频道就不用id来区分不同用户了。

部署的时候,puma unicorn等还需进一步配置,请查看官方readme

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

Time limit is exhausted. Please reload the CAPTCHA.

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据