복붙노트

[REDIS] 레디 스 연결을 close 이벤트에서 사라

REDIS

레디 스 연결을 close 이벤트에서 사라

우리 레디 스 구성에서 우리는 세트 제한 시간이 7 초

node_redis에서 우리는 레디 스 연결 준비 및 최종 이벤트를 처리

client.on("ready", function() {
      logger.info("Connection Successfully Established to ", this.host, this.port);
}
client.on("end", function() {
    logger.fatal("Connection Terminated to ", this.host, this.port);
}

샘플 로그

그러나 어떤 경우에는 (아마 대부분의 클라이언트에게 알리지 않고 연결을 닫는 레디 스) 우리는 명령 대기열이 쌓여 점점 요청이 시간까지 [응답을 얻기 위해 너무 많은 시간을내어 close 이벤트를 감지 할 수 클라이언트 노드 레디 스하는 참조 ]. 이러한 모든 경우에 명령 콜백 close 이벤트에서 사라이 오류 레디 스 연결로 반환됩니다. 심지어 대기 후 너무 많은. 그것은 일반적인 종료 이벤트가 발생하지 이후이 시간 만료로 인해 문제가되지 않는 것처럼 보인다.

http://code.google.com/p/redis/issues/detail?id=368 - 문제는 다음과 비슷한 것 같다

이 레디 스에서 일어나는 알려진 것입니까?

[전송 및 응답 다시 수신] 임계 값을 초과하는 대신 클라이언트 실속 만드는,이 경우에 오류가 응답하지 않아야을 명령의 실행을 지정하는 방법이 있나요?

또는 socket_timeout 같은 이러한 경우 가까운 이벤트를 트리거의 anyother 방법은 무엇입니까?

또는 우리는 우리의 레디 스 측에서 뭔가를 확인해야합니까? 우리는 우리의 레디 스 디버그 수준에서 로그 모니터링하고 우리는이 문제와 관련된 유용한 아무것도 발견

우리는 디버그 모드에서 노드 레디 스를 실행하면 우리는 분명히 클라이언트가 요청 명령 큐에 쌓여하기로 중단 된 지 볼 수 있습니다. 우리는 flush_on_error 기능 내부의 이유와 큐 길이를 기록. 우리는 장애인 offline_queuing 유지했다.

샘플 로그인

실패한 요청의 응답 시간 : 30388 MS [이 명령 대기열에 대기에 따라 달라집니다. 먼저 남자 대기 최대 응답 시간과 사람 덜 그 다음이 있습니다]

일반적인 응답 시간 : 1ms의

PS : 우리는 너무 node_redis에 문제를 제기했다

해결법

  1. ==============================

    1.우리는뿐만 아니라 레디 스와 관련하여 문제의 무리가 있었다. 그것이 클라이언트를 이야기하지 않고 연결을 종료 할 것 같다. 우리는 서버의 시간 제한 문제가 가능성이 있었다 것으로 나타났습니다. 이것은 우리가 사용하는 솔루션이며 우리는 7 월 이후 문제가 없었어요.

    우리는뿐만 아니라 레디 스와 관련하여 문제의 무리가 있었다. 그것이 클라이언트를 이야기하지 않고 연결을 종료 할 것 같다. 우리는 서버의 시간 제한 문제가 가능성이 있었다 것으로 나타났습니다. 이것은 우리가 사용하는 솔루션이며 우리는 7 월 이후 문제가 없었어요.

    var RETRY_EVERY = 1000 * 60 * 3;
    var startTimer = function(){
        console.log('Begin the hot tub!')
        setInterval(function(){
            try{
                client.set('hot',new Date());
                console.log(client.get('hot'))
            }
            catch(e){
                console.log(e);
            }
    
        },RETRY_EVERY)
    }();
    

    고려 그것이 성능 문제가되지 않습니다, 단 하나의 전화 3 분마다입니다)

  2. ==============================

    2.oconnecp의 대답에 관해서, 당신은 할 수 없습니다

    oconnecp의 대답에 관해서, 당신은 할 수 없습니다

    setInterval(client.ping(), 1000 * 60 * 30);
    
  3. from https://stackoverflow.com/questions/11429020/redis-connection-gone-from-close-event by cc-by-sa and MIT license