Rails 4.2目前在应用程序中合并即时消息的最佳方式是什么?

时间:2015-09-09 20:14:34

标签: ruby-on-rails-4 websocket instant-messaging ruby-on-rails-5 actioncable

我一直在阅读Rails 5(任何人都知道什么时候会发布?)将整合对websockets的支持,这将使即时消息更易于合并。但我现在试图为一个相当成熟的应用程序设置一些东西。如果一切顺利,我很快就会有很多用户,所以它也需要扩展。

我看过Ryan Bates的私人酒吧,它有点陈旧,Heroku's websocket example(我已经部署在Heroku上),Websocket-rails,行动能力,也许其他一些人。大多数看起来非常复杂,所以我想知道我最好的选择是什么,或者Rails 5将很快出来,我应该等待呢?

感谢。

2 个答案:

答案 0 :(得分:2)

我偏向于Plezi,它是为缩放(使用Redis)和can be used to easily add websocket support to your existing web-app而构建的...但不过,我可能不会客观。

在Rails中运行Plezi有两种方法 - 合并应用程序/服务器(使用Iodine HTTP/Websocket server)或使用Redis同步这两个应用程序。

这两种方式都很容易设置。

要在您的Rails应用中使用Plezi,请将plezi添加到Gemfile并删除对{thin}或'puma'或Gemfile中任何其他服务器的任何引用 - 这应该允许碘自动接管。而不是将Plezi.app作为中间件放在您的应用中。

你可以通过要求它的文件包含预制的Plezi应用程序,或者 - 甚至更容易 - 你可以将代码编写到其中一个Rails文件中(可能使用'初始化程序','帮助程序'或'模型'文件夹)。

尝试为聊天室服务器添加以下代码:

require 'plezi'

# do you need automated redis support?
# require 'redis'
# ENV['PL_REDIS_URL'] = "redis://user:password@localhost:6379"

class BroadcastCtrl
    def index
        # we can use the websocket echo page to test our server, 
        # just remember to update the server address in the form.
        redirect_to 'http://www.websocket.org/echo.html'
    end
    def on_message data
        # try replacing the following two lines are with:
        # self.class.broadcast :_send_message, data
        broadcast :_send_message, data
        response << "sent."
    end
    def _send_message data
        response << data
    end
end

route '/broadcast', BroadcastCtrl

这允许我们在Plezi中注入一些Rails魔法,在Rails中注入一些Plezi魔法......例如,保存用户的websocket UUID并向其发送更新很容易:

require 'plezi'

# do you need automated redis support?
# require 'redis'
# ENV['PL_REDIS_URL'] = "redis://user:password@localhost:6379"

class UserNotifications
    def on_open
        get_current_user.websocket_uuid = uuid
        get_current_user.save
    end
    def on_close
        # wrap all of the following in a transaction, or scaling might
        # create race conditions and corrupt UUID data
        return unless UsersController.get_current_user.websocket_uuid == uuid
        get_current_user.websocket_uuid = nil 
        get_current_user.save
    end
    def on_message data
         # get data from user and use it somehow
    end
    protected
    def get_current_user
         # # use your authentication system here, maybe:
         # @user ||= UserController.auth_user(cookies[:my_session_id])
    end
    def send_message data
        response << data
    end
end

route '/', UserNotifications

# and in your UserController 

def UserController < ApplicationController
    def update
        # your logic and than send notification:
        data = {}
        UserNotifications.unicast @user.websocket_uuid, :send_message, data.to_json
    end
end

答案 1 :(得分:0)

Rails 5已经发布。我建议你升级并使用actioncable。

从长远来看,它应该是最好的选择,因为它将成为Rails核心的一部分,它由Basecamp开发,使用和维护。他们将投入足够的精力确保其稳定,可扩展并被社区所接受。