복붙노트

[REDIS] (채팅 응용 프로그램) Resque + 레디 스과 함께 ActionController :: 라이브를 사용하는 방법

REDIS

(채팅 응용 프로그램) Resque + 레디 스과 함께 ActionController :: 라이브를 사용하는 방법

내 레일 응용 프로그램에 대한 채팅 기능을 구축을 위해 노력하고 있습니다. 나는이에 대한 라이브 ActionController ::, 퓨마, Resque, 레디 스를 사용하고 있습니다. 그래서 기본적으로이 경우, 레디 스이 방법은 resque를 사용하여 백그라운드에서 실행되고 가입. 사용자가 양식 필드 즉, 채팅 상자 아래에 텍스트를 입력 할 때마다 지금까지 내가 한 일이다

    <%= form_tag chat_box_publish_path, method: :get do %>
        <%= text_field_tag :query, params[:query], class: "form-control", id: "chatSearchBox",
            placeholder: 'Search' %>
    <% end %>

용맹 한 요청 ChatBoxController의 방법을 게시오고있다.

def publish
    $redis.publish("chat_message:1:1", "#{params[:query]}")
    respond_to do |format|
        format.js {render nothing: true}
    end
end

난 배경 아래 Resque 작업이 목적을 테스트하기위한 코드보다 실행이 ..now. 채팅 메시지가 게시 될 때마다 그래서 그 괜찮 데이터를 인쇄. 하지만 내가 어떻게 ActionController을 추가 할 수 있습니다 : 라이브 기능을 백그라운드 작업으로? 또는 내가 어떻게이 구현 가야합니까? 이 디자인과 도움이 필요하십니까.

class ChatBoxInitiator
    @queue = :chat_box_initiator

    private
    def self.perform
    $redis.subscribe('chat_message:1:1') do |on|
            on.message do |event, data|
                puts "====#{data}"
                return data
            end
        end
    end
end

그리고 난 사용자 / 쇼 페이지에 알림 ActionController :: 라이브와 함께 서버 전송 이벤트 (SSE)를 보여주고 싶은

해결법

  1. ==============================

    1.레디 스의 인스턴스를 세계화의 설정 / 초기화 디렉토리에 파일을 초기화 redis.rb을 만듭니다. 또한 (요구 사항에 괜찮 따라되는 5 분 오초에서 아무거나) 하트 비트 스레드를 설정하는 것이 좋습니다 :

    레디 스의 인스턴스를 세계화의 설정 / 초기화 디렉토리에 파일을 초기화 redis.rb을 만듭니다. 또한 (요구 사항에 괜찮 따라되는 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, 술집 및 하위에 두 가지 방법을 추가해야합니다. 술집의 역할은 이러한 이벤트에 가입 채팅 이벤트와 레디 스에 메시지 및 하위를 게시하는 것입니다. 이 모양은 다음과 같습니다

    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
    

    당신의 경로에, POST 및 서브에게 GET을 펍 확인하고 / 채팅 /과 / 채팅 / 회원님의 사이트에 같은 경로를 일치합니다.

    채팅 앱 실제 웹 페이지를 가정하면 / 채팅에, 당신이 실제로 보내고 채팅 메시지를 수신하려면 몇 가지 자바 스크립트를 작성해야합니다.

    이해의 용이성 들어, 웹 페이지는 텍스트 상자와 버튼이 가정하자. 채팅 스트림에 텍스트 상자의 내용을 게시해야 버튼을 눌렀을, 우리는 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에 대한 채널을 열고 사용. 이 예제에서, 우리는 자바 스크립트 콘솔로 기록합니다.

    코드는 다음과 같이 보일 것입니다 :

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

    참고 : controllername.coffee 파일에 위의 장소 모두 코드 블록이,이 예제를 위해 앱 / 자산 / 자바 스크립트 디렉토리에 chat.js.coffee해야한다. 당신은 또한 확인이 자산 파이프 라인에로드되는 것 확인해야합니다. (이미 나무를 필요로 호출하지 않는 경우.) 당신의 application.js 파일에 필요합니다.

    개발 환경에서이 두 줄을 추가하여 병렬 요청을 가능하게 할 것이다 당신의 설정 / 환경 / development.rb :

    config.preload_frameworks = true
    config.allow_concurrency = true
    

    이제 / 채팅에 브라우저, 찾아보기를 발사하고 마법을 참조하십시오. 당신이 메시지를 입력하고 버튼을 클릭하면 메시지가 해당 웹 페이지의 모든 인스턴스를 수신합니다.

    당신이 ActionController :: 라이브와 레디 스를 사용하여 레일의 기본 채팅 응용 프로그램을 얼마나 잘입니다. 마지막 코드는 분명히 요구 사항에 따라 매우 다른 것입니다하지만 당신은 시작한다.

    일부 더 많은 자원 당신이 체크 아웃해야합니다 :

  2. from https://stackoverflow.com/questions/29150274/how-to-use-actioncontrollerlive-along-with-resque-redis-for-chat-applicatio by cc-by-sa and MIT license