[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.레디 스의 인스턴스를 세계화의 설정 / 초기화 디렉토리에 파일을 초기화 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 :: 라이브와 레디 스를 사용하여 레일의 기본 채팅 응용 프로그램을 얼마나 잘입니다. 마지막 코드는 분명히 요구 사항에 따라 매우 다른 것입니다하지만 당신은 시작한다.
일부 더 많은 자원 당신이 체크 아웃해야합니다 :
from https://stackoverflow.com/questions/29150274/how-to-use-actioncontrollerlive-along-with-resque-redis-for-chat-applicatio by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] StackExchange.Redis와 StackExchange.Redis.StrongName의 차이점은 무엇입니까? (0) | 2020.01.13 |
---|---|
[REDIS] 내 클러스터 Node.js를 / socket.io / 레디 스 펍 / 하위 응용 프로그램에서 중복 메시지를 수신하고 있습니다 (0) | 2020.01.13 |
[REDIS] 레디 스 : 어떻게 다른 키의 값과 동일한 하나의 키를 설정하는 방법? (0) | 2020.01.13 |
[REDIS] 레디 스 감시 고정 표시기 이미지 / Dockerfile (0) | 2020.01.13 |
[REDIS] 셀러리 작업을 설정하는 문제는 파이썬에서 백엔드 (0) | 2020.01.13 |