我听说Rails 5(有人知道什么时候会发布吗?)将整合对websockets的支持,这将使即时消息更容易整合。但我现在正试图为一个相当成熟的应用程序设置一些东西。如果一切顺利,我可能很快就会有相当多的用户,所以它也需要扩展。
我看过Ryan Bates的Private Pub,它有点老了,Heroku的websocket示例(我部署在Heroku上),websocket -rails, actioncable,也许还有其他一些。大多数看起来都很复杂,所以我想知道我最好的选择是什么,或者如果Rails 5很快就会出来,我应该等等看?
谢谢。
我偏向于Plezi,它是为扩展(使用Redis)而构建的,可以用来轻松地为您现有的web应用程序添加websocket支持…但话说回来,我可能不太客观。
在Rails中运行Plezi有两种方式——要么合并应用程序/服务器(使用碘HTTP/Websocket服务器),要么使用Redis同步两个应用程序。
两种方式都很容易设置。
在你的Rails应用程序中使用Plezi,将plezi
添加到你的Gemfile
,并从你的Gemfile
中删除任何对"thin"或"puma"或任何其他服务器的引用-这应该允许碘自动接管。然后将Plezi.app
作为中间件放在您的应用程序中。
你可以通过要求它的文件来包含一个预先制作的Plezi应用程序,或者-更简单-你可以将代码编写到一个Rails文件中(可能使用'initializers', 'helpers'或'models'文件夹)。
尝试为聊天室服务器添加以下代码:
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
这允许我们注入一些Rails的魔法到Plezi和一些Plezi魔法到Rails…例如,很容易保存用户的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
Rails 5已经发布。我建议你升级使用actioncable。
从长远来看,它应该是最好的选择,因为它将成为Rails核心的一部分,并且由Basecamp开发、使用和维护。他们将投入足够的精力来确保它是稳定的,可扩展的,并被社区所接受。