2012-07-06 1 views
0

Beanstalkd를 사용하여 일부 작업을 다른 컴퓨터로 오프로드합니다. 설정이 약간 비정상적인 경우, 서버가 인터넷 (공개 IP)에 있지만 소비자가 일부 사람들의 집에서 adsl 행 뒤에 있습니다. 그래서 리눅스 서버가 동적 IP를 통해 나가고 서버에 연결되어 작업을하게됩니다. 그것은 모두 PHP이고 나는 pheanstalk 라이브러리를 사용하고 있습니다.Pheanstalk과의 오래된 연결

모든 것이 원활하게 실행되지만 adsl이 IP를 변경하면 (제공자가 연결 해제를 다시 시도 할 때마다 24 시간마다 다시 연결됨) 클라이언트가 멈추지 않고 "예비"에서 벗어나지 않습니다.

예비역에 시간 제한을 두는 것이 도움이 될 것이라고 생각했지만 그렇지 않았습니다. 클라이언트는 명령을 실행하고 차단하므로 타임 아웃을 확인하지 않습니다. 단지 (예비 예비 대신) reserve-with-timeout을 발행하고 타임 아웃이 발생할 때 TIME_OUT을 리턴하는 것은 서버의 책임입니다. 문제는 연결이 끊어졌습니다 (그러나 TCP/IP는 그 중 어느 쪽이라도 상대방과 통신을 시도 할 때까지 알지 못합니다). 클라이언트가 읽기를 차단하면 결코 반환되지 않습니다.

라이브러리는 로컬로 (예를 들어 서버에 연결을 시도 할 때) 일종의 타임 아웃을 지원하는 것으로 보이지만이 시나리오는 고려하지 않는 것 같습니다.

부실 연결을 감지하여 다시 연결하려면 어떻게해야합니까? 프로토콜 (그리고 pheanstalk 자체)에 어떤 종류의 keepalive가 있습니까?

감사합니다.

답변

1

요청에 응답 한 직후 각 연결을 닫고 매번 새 연결을 다시 열어 볼 수 있습니다.

close() 기능이 없지만 unset($pheanstalk) 인 Pheanstaly 개체를 삭제하면 해당 기능이 종료됩니다.

이 설명

은 매우 도움이된다 : Pheanstalk (PHP client for beanstalk) - how do connections work?

+0

어떻게 도움이 될지 모르겠습니다. 새로운 연결을 만든 다음'reserve()'를 호출하여 작업을 기다린다. 서버가 다운되면 영원히 기다릴 것입니다. 이전에 열린 연결에서'reserve()'를 호출하는 것과 다른 점은 무엇입니까? 이 작업이 도움이되는 유일한 경우는 작업을 반환 한 직후 서버가 다운되면 재개 시도가 실패합니다. – Barmar

+0

네, 맞습니다. 그냥 생각하고;) – rubo77

+0

'reserve()'는 인자로 직접 타임 아웃을 가질 수있다. 그래서 아마 특정 시간 동안'reserve()'함수를 설정할 수있다. 5 분이라고 말하면 예약을 중단하고 새로운 것을 시작한다. 'reserve()'호출은 즉시? – rubo77

0

나는 아직 그것을 시도하지 않은,하지만 내가 SSH 터널을 통해 콩나무 서버에 연결하는 아이디어를 내놓았다. 터널에서 ServerAliveCountMaxServerAliveInterval 옵션을 활성화하여 네트워크 또는 서버에 장애가 발생하면 터널이 닫힙니다. 이렇게하면 pheanstalk 클라이언트가 오류를보고하게됩니다.