2012-04-09 3 views
7

Redis pubsub 채널을 사용하여 작업자 프로세스 풀에서 ASP.NET 응용 프로그램으로 메시지를 보냅니다. 메시지가 수신되면, 어플리케이션은 SignalR로 클라이언트의 브라우저로 메시지를 전달합니다.Booksleeve로 열린 Redis PubSub 구독 유지

Redis에 열린 연결을 유지하기 위해 this solution을 찾았지만 연결을 다시 만들 때 구독을 고려하지 않습니다.

나는 현재 내에서 Global.asax 파일에 레디 스의 pubsub 메시지를 처리 ​​해요 :

public class Application : HttpApplication 
{ 
    protected void Application_Start() 
    { 
     var gateway = Resolve<RedisConnectionGateway>(); 
     var connection = gateway.GetConnection(); 
     var channel = connection.GetOpenSubscriberChannel(); 

     channel.PatternSubscribe("workers:job-done:*", OnExecutionCompleted); 
    } 

    /// <summary> 
    /// Handle messages received from workers through Redis.</summary> 
    private static void OnExecutionCompleted(string key, byte[] message) 
    { 
     /* forwarded the response to the client that requested it */ 
    } 
} 

현재 RedisConnection가 어떤 이유로 폐쇄 될 때 문제가 발생합니다. 가장 간단한 해결책은 연결이 재설정되었을 때 RedisConnectionGateway 클래스에서 이벤트를 시작하고 새로운 RedisSubscriberChannel을 사용하여 다시 구독하는 것입니다. 그러나 연결이 재설정되는 동안 채널에 게시 된 모든 메시지는 손실됩니다.

이 상황을 처리하는 데 권장되는 방법의 예가 있습니까?

+0

내 솔루션은 이미 열려있는 경우 Redis 연결을 반환하거나 그렇지 않으면 하나를 엽니 다. "재래식 사용"에서 연결은 열린 상태로 유지되고 PubSub 스키마에서 연결이 끊어지지는 않을 것이라고 생각합니다. 어떤 이유로 연결이 닫히는 드문 경우에 새 연결이 생기고 연결을 재설정하는 동안 채널에 게시 된 메시지가 손실됩니다. 그러나 그것은 매우 짧은 시간 동안이며, 정기적으로 일어나는 것으로 생각하지 않습니다. 어쨌든, BookSleeve의 저자가 이것을 강조하겠습니다 (CC @ marcgravell). –

+0

@OferZelig 감사합니다. 그러나'@ someone'은 내가 어떻게 든 포스트에 이미 관련되어 있지 않으면 작동하지 않습니다; p –

+0

@MarcGravell 나는 그것을 몰랐습니다. 어쨌든 : 1) 어떻게 다른 SE 사용자와 대화하여 뭔가에 관심을 갖게 할 수 있습니까? 내 말은 - SE 사이트 내에서 프로필을 확인하지 않고 자신의 블로그 등으로 이동합니다. 2) SE에서 경고 및 경고를 식별하는 기능을 구현할 수 있습니다 ( xxx 패턴, 여기서 xxx는 알려진 SE 사용자 이름 임). 감사! –

답변

7

예, 연결이 끊어지면 (네트워크 불안정성, 재 마스터링 등) 사용자가 만든 모든 구독을 다시 적용해야합니다. 다시 연결하고 다시 가입하는 이벤트는 매우 정상적이며 여기서는 SE/SO에서 사용하는 것과 매우 다르지 않습니다 (일반적으로 더 세분화 된 구독을 추적하고 모든 것을 처리하는 래퍼 코드가 있음).

예, 연결이 끊어진 동안 게시 된 모든 이벤트가 사라졌습니다. 저것은 redis pub/sub의 본질이다; 연결이 끊어진 클라이언트에 대한 배달을 보장하지는 않습니다. 이 이것을 약속하거나 redis를 사용하여 대기열을 구동하는 대신 목록의 반대쪽으로 /에서 터벅 터벅 터벅으로 이동하는 것은 일반적으로 합리적인 대안이며 손실되지 않도록합니다 (소프트웨어가 ' 목록에서 그것을 터뜨린 후 드롭하십시오). 도움이된다면 블로킹 팝 방법을 추가하라는 요청을 내 목록에 올렸습니다. 멀티플렉서의 의도를 완전히 파기했지만 어떤 경우에는 진정한 용도로 사용하기 때문에 추가하는 것이 아닙니다.

+0

나는 API에 추가 된 팝업 메쏘드를 차단하는 것을 보았습니다. 지금 내 웹 프로젝트는 Booksleeve를 사용하고 있지만 내 웹 앱을 서비스하는 직원은 Popup Blocking API를위한 ServiceStack.Redis에 의존합니다. –

+1

@Justin 그것이 추가 될 것이다 - 희망이 있 이번 주 –

+0

그것은 굉장 할 것이다! 감사! –

관련 문제