2009-03-24 4 views
3

우리는 Java로 작성된 RMI 클라이언트 응용 프로그램을 가지고 있습니다.이 응용 프로그램은 주기적으로 "활성 상태 유지"메시지를 서버 응용 프로그램에 보내야합니다. 이것을 별도의 하트 비트 쓰레드로 구현했습니다. 이는 서버에 연결 유지 메시지를 보내고 Thread.sleep()을 사용하여 15 초 동안 휴면합니다. 클라이언트가 실행되고있는 상자가 CPU를 많이 사용하는 경우, 우리는 하트 비트 놓친 것을 발견"살아있는 체재"하트 비트가 보내지는 것을 어떻게 보장 할 수 있습니까?

그러나
Thread heartbeatThread = new Thread(new HeartbeatRunnable(server)); 
heartbeatThread.setPriority(Thread.MAX_PRIORITY); 
heartbeatThread.start(); 

, 가정 서버를 발생합니다

스레드는 높은 우선 순위로 설정되어 우리의 클라이언트 응용 프로그램이 사망했습니다.

내 주 스레드에서 Thread.yield() 호출을 추가했지만 문제가 없어지지는 않았습니다.

응용 프로그램이 실행 중일 때 정시에 하트 비트를 전송할 수있는 방법이 있습니까?

답변

1

코드에 자체 작성된 "yield"함수를 자유롭게 분산시켜 비 스레드 환경에서 사용자 모드 스레딩을 구현할 수 있습니다.

마찬가지로, 코드에서 하트 비트 검사 함수 호출을 자유롭게 분산시킬 수 있습니다. 스레드를 잊어 버리면 하트 비트를 아직 보내야하는지 확인하기 위해 정기적으로 하트 비트 함수를 호출하십시오.

이것은 근본적인 해결책이지만, 적절한 해결책을 시도했지만 제대로 작동하지 않는다면, 아마도 여러분은 뒤로 물러나야 만합니다.

실제로 모든 함수 호출의 시작 부분에 매크로를 두는 것이 좋습니다. 매크로는 시간을 빠르게 확인하고 필요한 경우 하트 비트 함수를 호출합니다.

(아, 자바에 매크로가 있습니까? 아닙니다.하지만 아이디어는 얻을 수 있습니다.)

3

정말 보장 할 수 없습니다. 지연에 하트 비트를 전송하는 데 걸리는 시간을 막기 위해 다른 스레드에서 하트 비트를 전송할 수 있습니다. 또한 두 개의 하트 비트 사이의 지연을 서버가 클라이언트가 죽었다 고 결정하는 데 사용하는 시간의 절반으로 설정하는 것이 좋습니다 (예 : 서버가 15 초 후에 클라이언트를 시간 초과 한 경우 7.5 초마다 하트 비트를 보내려합니다).

+0

응답 해 주셔서 감사합니다. 우리는 이미 별도의 스레드에서 하트 비트를 보내고 있으며 서버는 90 초 동안 하트 비트가 없어진 후에 우리를 잘라냅니다. 따라서 15 초마다 보내는 것은 보수적 인 것처럼 보였습니다. –

+1

실제로 매우 보수적입니다. 그러나 90 초 동안 하트 비트를 보내는 것을 관리하지 않으면 매 15 초마다 상자를 보내려고하면 상자가 심각하게 과부하되고 클라이언트가 실제로 죽은 것으로 간주되어야합니다. 피트의 대답을보십시오. – Bombe

2

어떤 프로세스가 CPU를 사용하는지에 따라 다릅니다.

프로세스가 아니기 때문에 클라이언트 프로세스가 실제로 응답하지 않으면 모든 의도와 목적이 살아 있지 않으므로 하트 비트를 보내는 것이 적절합니다. 상자에 너무로드되어있을 때 '나는 메시지를 처리 ​​할 수 ​​있습니다'라는 하트 비트 메시지가 있으면 오해의 소지가 있습니다.

하트 비트 메시지의 의도가 '이 프로세스가 실행 중이지만 다시 돌아올 때까지 30 분이 될 수 있습니다.'라고 말하면 처리중인 모든 작업을 서버에 보내십시오. 또는 클라이언트의 응답성에 맞는 시간 초과를 설정하십시오.

+0

니스! – Learning

0

아마도 가장 좋은 해결책은 타이머의 scheduleAtFixedRate을 사용하는 것입니다. 이를 통해 하나의 실행이 지연되면 (Java에서는 피할 수 없음) 후속 호출이 영향을받지 않습니다.

0

서버가 작동 중임을 알리려면 열린 소켓을 제공하는 것이 좋습니다. 클라이언트에서 간단히 해당 소켓을 읽습니다. 서버가 아무 것도 쓰지 않기 때문에 차단 될 것이고, 서버가 사라지거나 종료되면 클라이언트는 서버 소켓/포트가 사라 졌다는 것을 나타내는 IOException을 받게 될 것입니다.

이것은 적시의 하트 비트를 제공하는 서버에 종속되지 않습니다. (서버 끝의 TCP 포트와 대역폭이없는) 리소스를 거의 사용하지 않으며 서버 (또는 서버 컴퓨터)를 사용할 수 없게되면 적시에 나타납니다.

+0

그 자체가 서버 자체가 살아 있는지 여부를 추적하지 않습니까? TCP/IP 스택이 더 현명하지 않아도 대상 프로세스가 중단되거나 적어도 좀비로 변할 수 있습니다. –

+0

아니요. 운영 체제가 그걸 살펴볼 것입니다. 소켓/포트 조합의 상위 프로세스가 가동 중인지 여부를 추적합니다 –

1

클라이언트를 사용할 수 없음을 결정하기 전에 서버가 기다리는 "부재 중 하트 비트"의 수를 구성해야합니다.

예를 들어, 하트 비트 간격이 15 초이고 하트 비트가 누락 된 횟수가 4 인 경우, 서버는 클라이언트가 도달 할 수 없다고 결정하기 전에 최대 60 초 (1 분)까지 대기합니다.