1

Rails 5 (それがいつリリースされるか知っている人はいますか?) には、インスタント メッセージングを簡単に組み込むことができる Websocket のサポートが組み込まれるということを読んでいました。しかし、私はかなり構築されたアプリのために何かを設定しようとしています。すべてがうまくいけば、すぐにかなりの数のユーザーを獲得できるので、同様にスケーリングする必要があります。

ちょっと古い Ryan Bates の Private Pub 、Heroku の websocket の例(私は Heroku にデプロイされています)、Websocket-rails、 actioncable 、およびおそらく他のいくつかを見てきました。ほとんどがかなり複雑に見えるので、私の最善の選択肢は何か、それとも Rails 5 が間もなくリリースされるので、それを待つべきなのかを考えています。

ありがとう。

4

2 に答える 2

2

私は(Redis を使用して) スケーリング用に構築され、既存の Web アプリに WebSocket サポートを簡単に追加するために使用できるPleziに偏っていますが、それについては客観的ではないかもしれません。

Rails 内で Plezi を実行するには 2 つの方法があります。アプリ/サーバーをマージする ( Iodine HTTP/Websocket サーバーを使用) か、Redis を使用して 2 つのアプリを同期します。

どちらの方法も簡単に設定できます。

Rails アプリ内で Plezi を使用するには、「thin」または「puma」またはその他のサーバーへの参照をに追加pleziして削除します。これにより、Iodine が自動的に引き継ぐことができます。アプリにミドルウェアとして配置するよりも。GemfileGemfilePlezi.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
于 2015-09-10T10:26:19.997 に答える
0

Rails5がリリースされました。アップグレードして actioncable を使用することをお勧めします。

これは Rails コアの一部となり、Basecamp によって開発、使用、保守されるため、長期的にはこれが最良の選択肢になるはずです。彼らは、それが安定し、スケーラブルで、コミュニティに受け入れられるようにするために十分な努力を払います。

于 2015-10-10T12:10:25.100 に答える