2012-12-13 2 views
6

Redis가 지원하는 PUB/SUB 시스템을 구축 중입니다.redis가있는 복구 가능한 PUB/SUB

게시자와 구독자가 1 명 있습니다. 가입자는 믿을만한 것이 아니며 언제든지 연결을 끊을 수 있으며 연결이 끊어진 상태에서 "복구"할 수 있어야합니다.

트위스트가 있지만 일부 수의 출하가 부족한 구독자가 까지 N 메시지까지 만 복구 할 수 있어야합니다.

사소한 해결책이다

  1. 출판사 메시지 X
  2. X는 RPUSH list message
  3. 메시지가
  4. 메시지는 소비자에게 발행되는리스트의 인덱스를 포함하는 부호화 된 목록에 푸시 발행 (색인 포함) PUBLISH channel encoded

소비자가 DS는 다시 설정합니다 :

  1. 는 그것이 가지고있는 인덱스 다음의 목록에있는 모든 값에 대한 레디 스를 요청하고 PSUBSCRIBE이 원자

여기까지 우리 모두가 좋은 실행합니다.

내 큰 질문은, N 항목에 백 로그 목록을 넣으려면 어떻게해야합니까?

계속 증가하는 색인을 유지하고 목록에 출장 된 백 로그를 유지할 수있는 방법이 있습니까?

답변

6

어때? 메시지를 게시하려면 시작할 때, 클라이언트가 global_index와 최신 인덱스 (이 또한 레디 스에 보관, 또는 다른 곳에서 할 수있다) 비교해야합니다

LPUSH list message 
LTRIM list 0 N 
INCR global_index 
PUBLISH channel global_index 

술집/하위 이상 메시지를 수신 할 수 및 따라 가기 (기본적으로 LRANGE list 0 (global_index - my_index)) 목록에서 min (global_index - my_index, N) 메시지를 읽습니다.

+0

예,이 솔루션을 많이 사용합니다. –

+0

이것을 구현했는데, https://gist.github.com/4385544 시계를 사용하지 않았고 멀티가 완전히 맞습니다. –