我一直在阅读Rails 5(任何人都知道什么时候会发布?)将整合对websockets的支持,这将使即时消息更易于合并。但我现在试图为一个相当成熟的应用程序设置一些东西。如果一切顺利,我很快就会有很多用户,所以它也需要扩展。
我看过Ryan Bates的私人酒吧,它有点陈旧,Heroku's websocket example(我已经部署在Heroku上),Websocket-rails,行动能力,也许其他一些人。大多数看起来非常复杂,所以我想知道我最好的选择是什么,或者Rails 5将很快出来,我应该等待呢?
感谢。
答案 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开发,使用和维护。他们将投入足够的精力确保其稳定,可扩展并被社区所接受。