2014-04-16 5 views
3

현재 다중 프로세스/다중 호스트 nodeJS 앱에서 작업하고 있습니다. 문제가 발생하여 도움이 필요합니다.게시자/하위 채널 구독자 수 및 시간 초과

내 앱은 프로세스로 구성되며 각각 고유 한 작업을 호스팅 할 수 있습니다. 작업이 현재 실행 중이거나 내 시스템에 없는지를 실시간으로 알아야합니다. 여기

내 현재의 솔루션입니다 :

각 작업 프로세스가 작업이 현재 I가 "job.JOB_UUID"밀어 실행되고 있는지 알고 싶은 경우 채널 "job.JOB_UUID"
  • 에 가입
    • 가입자 수를 확인하십시오. 1 = ok이면이 작업이 실행되고 0이면 그렇지 않습니다.

    이 솔루션은 네트워크 문제가 발생하는 경우를 제외하고는 아주 잘 작동합니다. 그것의 아마 레디 스 펍/서브는 시간 제한이없는 사실로 인해 :

    Note that the timeout only applies to number clients and it **does not apply** to Pub/Sub clients, since a Pub/Sub connection is a push style connection so a client that is idle is the norm. 
    

    레디 스 유령 가입자를 유지하는 것 같다 내가 채널에 게시 할 때 나에게 한 가입자를 반환하지만이 정말 존재하지.

    이 사례를 관리 할 생각이 있습니까?

    추신 : 내 이전 솔루션이었다

    • 각 작업이 5 초로 설정 TTL와 레디 스의 핵심 "job_UUID"로 설정하십시오. 작업이 존재하는 경우
    • 의 TTL은 "job_UUID"키가 문제가 실시간에없는 것입니다 존재하는 경우 난 그냥 확인, 확인하기 위해 각 작업
    • 하여 매 초마다 업데이트됩니다.
  • 답변

    0

    작업이 중단되지 않을 것이라는 것을 보장 할 수 있다면 언제든지 원래 솔루션을 변형 할 수 있습니다.

    각 작업은 TTL을 N으로 설정하여 "작업 _UUID"키를 설정합니다 (프로세스가 완료 될만큼 큰 숫자, 시간 초과로만 작동합니다) 작업이 완료되고 실행 중에 예외가 발생합니다. 작업이 완료되면 재 다이얼에서 키를 제거합니다.

    이 시나리오에서는 항상 실시간으로 작업 할 수 있습니다. 프로세스가 실행되는 동안 값이 표시됩니다. 값을 삭제하지 않고 직장이 사망 한 경우에만 불일치가 표시됩니다. TTL은 세이프 가드 타임 아웃이 지나면 자동으로 값을 제거합니다.

    실시간으로 더 강력한 기능이 필요한 경우 잘못된 도구를 사용하고있을 수 있습니다. 프로세스 조정을 위해서 ZooKeeper는 아주 훌륭합니다. Redis만큼 일반적인 것은 아니며 문제의 분산 특성으로 인해 설정이 다소 복잡하지만 프로세스 조정 및 실시간 장애 조치에 매우 적합합니다.