2010-06-23 2 views
0

많은 수의 클라이언트의 데이터를 받아서 데이터베이스에 저장해야하는 .NET 데이터 로깅 응용 프로그램을 만들고 있습니다.자주 업데이트되는 데이터 캐싱 및 저장

클라이언트가 서버에 시작 이벤트를 보내고 하트 비트 이벤트를 보내면 데이터의 마지막 활동 시간이 업데이트됩니다. 클라이언트 응용 프로그램이 이러한 이벤트를 보낼 기회가 없기 때문에 종료 이벤트를 사용할 수 없습니다.

간단한 방법은 시작 이벤트에서 db 삽입을 수행 한 다음 각 하트 비트에서 db 업데이트를 수행하는 것이지만 많은 수의 클라이언트 각각에서 몇 초마다 하트 비트가 발생하면 매우 많은 db 집약적입니다. 데이터베이스 테이블이 커지면 업데이트도 비용이 많이 듭니다.

따라서 클라이언트에서 하트 비트 전송을 중단 할 때 데이터를 메모리에 캐시 한 다음 데이터베이스로 플러시합니다.

그래서 난에 적합한 데이터 구조와 전략이 필요 : 클라이언트가 시작 이벤트를 보낼 때

  • 는 세션 객체를 만들기
  • 하트 비트 이벤트가
  • 확인 세션을 수신 할 때 효율적으로 개체를 업데이트하는 시간이 초과되어 데이터베이스에 저장 중입니다.

주기적으로 반복되는 메모리의 해시 테이블 행을 생각하고 있습니다. 시간 초과 된 세션을 확인하기위한 타이머 트리거 이벤트.

이런 종류의 문제에 대한 더 나은 접근 방법이 있습니까?

+0

(1 - 서버의 가동 시간 pctg) – Unreason

+0

서버 장애로 인해 소량의 데이터가 손실되면 문제가되지 않습니다. 사실,이 경우 세션은 정확하지 않은 종료 시간으로 지속되는 것이 아니라 전체적으로 손실 될 수 있습니다. – DanK

답변

0

로그의 특성에 따라 (대부분의 로깅 응용 프로그램은 로그를 매우 중요하게 또는 법으로 요구하는 시나리오를 지원해야하므로) 지원되는 표준 접근 방식은 가능한 한 빨리 로그를 하드 디스크에 기록한다는 것입니다 (기록되는 응용 프로그램 환경의 관점에서만 작성하는 독립 시스템에 대한 보너스 포인트).

로그는 낮은 우선 순위로 처리, 집계 또는 분석됩니다.

물론 귀하의 유스 케이스는 다를 수 있습니다.

+0

플랫 로그 파일에 로깅을 고려하고 나중에 처리하지만 데이터에 거의 즉각적인 액세스를 제공해야하므로이를 배제했습니다. 그래도 제안에 감사드립니다! – DanK

+0

또한 확인을 위해 문제의 데이터에는 법적 문제가 없으므로 보존해야합니다. – DanK

+0

@DanK, ok then - 나는 당신의 접근 방식이 괜찮다고 생각합니다; 의미 론적 제안 - 데이터 로그를 호출하지 않습니다. - 필요할 경우 즉시 처리하기 위해 데이터의 성격이 로그가 아닙니다. – Unreason

관련 문제