2012-11-17 2 views
3

클라이언트에 연결할 수있는 java에서 서버 응용 프로그램을 빌드했습니다. 클라이언트가 매 x 초마다 작은 메시지를 보내고있는 하트 비트 시스템을 구현했습니다. 서버 측에서는 클라이언트가 메시지를 보낸 시간을 HashMap에 저장하고 모든 클라이언트가 클라이언트로부터 메시지를받은 경우 매 x 초마다 TimerTask를 사용하여 확인합니다.많은 수의 클라이언트에 대한 java 하트 비트 구현

모든 것이 클라이언트의 소량에서는 작동하지만 클라이언트 수가 증가하면 (2k +) 메모리 양이 매우 많아지고 Times가 많은 TimerTask를 처리해야하고 프로그램이 많이 먹는 것으로 시작됩니다 의 CPU.

이것을 구현하는 더 좋은 방법이 있습니까? 데이터베이스를 사용하고 특정 시간 내에 업데이트를 보내지 않은 클라이언트를 선택하는 방법에 대해 생각했습니다. 이것이 더 효과적 일 것이라고 생각하십니까? 아니면 이렇게하는 것이 더 좋습니다.

+1

Q : 목록이 #/clients보다 커야하는 이유는 무엇입니까? 그리고 * 전체 * 목록을 반복하는 * one 타이머가없는 이유는 무엇입니까? – paulsm4

+1

목록이 클라이언트 수보다 클 필요는 없습니다. 그것은 클라이언트 수와 같습니다. 고객 수는 언제든지 증감 할 수 있습니다. 타이머를 하나만 가지고 반복하고 10k 클라이언트 목록을 작성하면 조금 느려지기도합니다. –

답변

3

거의 무작위 제안 :

  • 대신 각 클라이언트 당 하나 개의 타이머의, 꽤 자주받은 하트 비트 맵을 검사 하나의 글로벌 타이머 (예를 들어 초당 10 번)이있다. 그지도를 반복하고 죽은 고객을 찾으십시오. 공유 데이터 구조의 스레드 안전성을 기억하십시오!

  • 데이터베이스를 사용하려면 과 같은 경량의 메모리 내장 DB를 사용하십시오. 그러나 여전히 잔인한 소리처럼 들린다.

  • 캐시 또는 다른 만료지도를 사용하고 퇴장 할 때마다 알림을받습니다. 이 방법은 클라이언트가 하트 비트를 전송할 때 기본적으로 맵에 무언가를 넣는 것으로 주어진 시간 내에 해당 항목에 아무런 변화가없는 경우 맵 구현이이를 제거하여 일종의 리스너를 호출합니다.

  • Akka (자바 API 포함)와 같은 액터 기반 시스템을 사용하십시오. 하나의 클라이언트를 처리하는 서버 측에서 하나의 액터를 가질 수 있습니다. 그것은 하나의 스레드/타이머보다 훨씬 효율적입니다.

  • 다른 데이터 구조를 사용하십시오. 대기열. 하트 비트를 수신 할 때마다 대기열에서 클라이언트를 제거하고 마지막에 다시 넣습니다. 이제 주기적으로 가장 오래된 하트 비트가있는 클라이언트를 포함해야하는 큐의 헤드 만 확인하십시오.

관련 문제