sql >> データベース >  >> NoSQL >> Redis

ActionController::LiveをResque+Redisと一緒に使用する方法(チャットアプリケーション用)

    前提条件:

    • ルビー2.0.0+
    • Rails 4.0.0+
    • Redis
    • プーマ

    イニシエーター:

    redis.rbを作成します config/initializersの初期化ファイル ディレクトリ、redisのインスタンスをグローバル化 。 heartbeatを設定することもお勧めします スレッド(要件に応じて、5秒から5分までは問題ありません):

    $redis = Redis.new
    
    heartbeat_thread = Thread.new do
      while true
        $redis.publish("heartbeat","thump")
        sleep 15.seconds
      end
    end
    
    at_exit do
      heartbeat_thread.kill
      $redis.quit
    end
    

    コントローラー:

    ChatControllerに2つのメソッドを追加する必要があります 、pub およびsubpubの役割 チャットイベントとメッセージをredisに公開することです 、およびsub これらのイベントを購読します。次のようになります:

    class ChatController < ApplicationController
        include ActionController::Live
    
        skip_before_filter  :verify_authenticity_token
    
        def index
        end
    
        def pub
            $redis.publish 'chat_event', params[:chat_data].to_json
            render json: {}, status: 200
        end
    
        def sub
            response.headers["Content-Type"] = "text/event-stream"
    
            redis = Redis.new
            redis.subscribe(['chat_event', 'heartbeat']) do |on|
                on.message do |event, data|
                    response.stream.write "event: #{event}\ndata: #{data}\n\n"
                end
            end
        rescue IOError
            logger.info "Stream Closed"
        ensure
            redis.quit
            response.stream.close
        end
    end
    

    routesで 、 pubを作成します POST およびsub GET 、パスを/chat/publishのようなものに一致させます および/chat/subscribe

    Coffeescript / Javascript:

    チャットアプリの実際のウェブページが/chatにあると仮定します 、 Javascriptを作成する必要があります 実際にチャットメッセージを送受信します。

    理解を容易にするために、Webページにテキストボックスとボタンしかない場合を考えてみましょう。ボタンを押すと、テキストボックスのコンテンツがチャットストリームに公開されます。AJAXを使用して公開できます:

    $('button#send').click (e) ->
        e.preventDefault()
        $.ajax '/chat/publish',
            type: 'POST'
            data:
                chat_data: {
                    message: $("input#message").val()
                    timestamp: $.now()
            error: (jqXHR, textStatus, errorThrown) ->
                console.log "Failed: " + textStatus 
            success: (data, textStatus, jqXHR) ->
                console.log "Success: " + textStatus
    

    ここで、チャットメッセージをサブスクライブして受信できるようにする必要があります。 EventSourceを使用する必要があります このため。 EventSourceの使用 、イベントを受信できるようにSSEのチャネルを開き、そのデータを使用してビューを更新します。この例では、JavaScriptコンソールにのみログを記録します。

    コードは次のようになります。

    $(document).ready ->
        source = new EventSource('/chat/subscribe')
        source.addEventListener 'chat_event', (e) ->
            console.log(e.data)
    

    注: 上記の両方のコードブロックをcontrollername.coffeeに配置します ファイル。この例では、chat.js.coffeeである必要があります。 app/assets/javascriptで ディレクトリ。また、アセットパイプラインに読み込まれていることを確認する必要があります。 require application.jsにあります ファイル(まだrequire tree .

    並列リクエストを有効にする:

    開発環境では、これらの2行をconfig/environments/development.rbに追加して、並列リクエストを有効にする必要があります。 :

    config.preload_frameworks = true
    config.allow_concurrency = true
    

    次にブラウザを起動し、/chatにアクセスします 魔法を見てください。メッセージを入力してボタンをクリックすると、そのWebページのすべてのインスタンスでメッセージが受信されます。

    これが、railsで基本的なチャットアプリケーションを作成する方法です。 ActionController::Liveを使用する およびRedis 。最終的なコードは、要件によって明らかに大きく異なりますが、これで開始できます。

    チェックアウトする必要のあるその他のリソース:

    • 優しいラブメイキング-ライブですか?
    • Railscasts-#401 --ActionController ::Live
    • SitePoint-RailsとSSEを使用したミニチャット
    • Github-mohanraj-ramanujam/ライブストリーム
    • Thoughtbot-SSEを使用したチャットの例



    1. MongoDB $ toString

    2. CentOS8にApacheCouchDBをインストールする方法

    3. Mongoで更新操作のパフォーマンスを向上させる方法は?

    4. リモートredisサーバーに接続しています