1

실시간 알림을 지원하는 Rails/Javascript 애플리케이션을 구축 중입니다. 자바 스크립트는 다음과 같습니다레일 : 응답 할 데이터가있을 때까지 sleep (스트리밍 + 멀티 스레딩)

var chat; 

$(document).ready(function(){ 
    chat = $('#chat'); 
    chat.append('mmm'); 
    (function poll(){ 
     $.ajax({ url: "http://localhost:3000/get_messages", success: function(data){ 
      //Update your dashboard gauge 
      chat.append(data); 
     }, dataType: "json", complete: poll, timeout: 30000 }); 
    })(); 
}); 

경로 : 여기

match 'get_messages', to: 'real_time_notifs#get_messages', :via => :get 

컨트롤러의 방법입니다 :

def get_messages 
    # sleep ??? will it stop the whole application? 
    render :json => ['message body'] 
end 

나는 자바 스크립트에 대한 표시 일 (있는 경우에만 답변을 받게 될 것이라고합니다 예를 들어, 데이터베이스 테이블에 새 메시지가 나타남) 전체 애플리케이션을 중지하지 않아도됩니다. get_messages 방법을 구성하는 방법을 제안 해 주시겠습니까?

기다리는 동안 나머지 응용 프로그램을 차단하지 않는 솔루션이 필요합니다.

답변

2

나는 큰 경험, 당신은 (단지 아약스 설문 조사 요청을 전송하지 않음) 다른 관점에서 그것에 대해 생각해야하지 않지만이

을 달성하기 위해 여러 가지 방법이 있습니다


SSE's (Server Sent Events)

나는 (그 자체를 사용하면 SSE의

보낸 된 업데이트가 일반적인 HTTP 범위에없는 사용하는 것이 좋습니다 것입니다 mime type - 나는 그들이 당신이) 응용 프로그램 등으로하고있는

SSE의는 기본적으로 JS listener를 배포하여 프런트 엔드를 통해 이루어집니다 중요하지 않습니다 (완전 비동기 의미 믿는다 text/event-stream). 이 여론 조사 업데이트를 위해 서버,하지만 아약스는 달리, 단지 text/event-stream 마임을 청취가) :

var source = new EventSource("demo_sse.php"); 
source.onmessage = function(event) { 
    alert(event.data); 
}; 

효율적인 부분은 다음 레일에 ActionController::Live::SSE와이를 업데이트 할 수 있다는 것입니다. 나는이 어떤 경험이없는,하지만 기본적으로 당신이 text/event-stream MIME 형식을 통해 업데이트를 보낼 수 있습니다


WebSockets

WebSocket을 기본적으로 콘텐츠를 수신 할 수 있도록, 서버와 영구적 인 연결을 엽니 다

내 경험이 "기본"웹 소켓으로 확장되지 않았습니다. (우리는 성공적으로 Pusher을 사용했으며 자체 웹 스택 구현을 위해 노력하고 있습니다.); 기본적으로 SSE의 심층 버전이라고 할 수 있습니다.

JS를 사용하여 클라이언트 - 서버 연결을 인증해야하며 일단 연결되면 브라우저에서 listen 업데이트를 수행합니다.나는이의 MIME 타입에 대해 잘 모르겠지만, ActionController::Live에 독서하는 것은 당신 만 전송/업데이트를받을 (필요로 할 것입니다 그것은


어느 다음 방법 중 하나를 작동하는 방법에 대한 통찰력을 줄 것이다 사용 가능할 때)

+1

SSE는 훌륭하지만 문제가 있습니다. 우리는 여전히 동작이있는 컨트롤러가 필요합니다. 여기에는 스트림에 쓰는 루프가 있습니다. 이 글은 PostgreSQL에 의해서만 지원되는'connection.raw_connection.wait_for_notify'를 기반으로하는 시작/정지 메커니즘에 의해 제어됩니다. 질문은 :이 메커니즘을'ActiveSupport :: Notifications.subscribe'로 대체 할 수 있을지 어떨지입니다. – Paul