私は(Redis を使用して) スケーリング用に構築され、既存の Web アプリに WebSocket サポートを簡単に追加するために使用できるPleziに偏っていますが、それについては客観的ではないかもしれません。
Rails 内で Plezi を実行するには 2 つの方法があります。アプリ/サーバーをマージする ( Iodine HTTP/Websocket サーバーを使用) か、Redis を使用して 2 つのアプリを同期します。
どちらの方法も簡単に設定できます。
Rails アプリ内で Plezi を使用するには、「thin」または「puma」またはその他のサーバーへの参照をに追加plezi
して削除します。これにより、Iodine が自動的に引き継ぐことができます。アプリにミドルウェアとして配置するよりも。Gemfile
Gemfile
Plezi.app
ファイルを要求することで、事前に作成された Plezi アプリを含めることができます。または、さらに簡単に、Rails ファイルの 1 つにコードを書き込むことができます (おそらく、'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