2011-04-28 3 views
3

나는 세션 데이터를 수집하는 시스템을 가지고있다. 세션은 "세션 시작됨"및 "수행 된 X 수행"과 같이 여러 가지 고유 한 이벤트로 구성됩니다. 세션이 끝나는시기를 판별 할 수있는 방법이 없으므로 하트 비트 이벤트는 정기적 인 간격으로 전송됩니다.분산 시스템에서 이벤트가 없을 경우 어떻게 대응할 수 있습니까?

이것은 주된 복잡성입니다. 세션이 종료되었는지 확인하는 방법이 없으면 이벤트 부재 (예 : 더 이상 하트 비트가 없음)에 반응하려고 시도하는 것입니다. 어떻게 분산 시스템에서 이것을 효율적이고 정확하게 할 수 있습니까? 이벤트는 다음 세션을 나타내는 개체로 조립해야합니다

:

여기 문제에 좀 더 배경입니다. 세션 개체는 나중에 다른 시스템의 추가 데이터로 업데이트되며 결국 세션 수, 평균 세션 길이 등과 같은 항목을 계산하는 데 사용됩니다.

시스템은 수평 적으로 확장되어야하므로 수신하는 여러 서버가 있습니다 이벤트 및이를 처리하는 여러 서버가 있습니다. 동일한 세션에 속한 이벤트는 다른 서버로 보내지고 처리 될 수 있습니다. 즉, 이들이 순서대로 처리 될 것이라는 보장이 없으며 이벤트가 복제 될 수 있다는 추가 합병증이 있습니다. 또한 일부는 서버에 도달하기 전에 또는 처리 될 때 손실 될 위험이 있습니다.

이미 대부분 있지만 세션이 끝났을 때 효율적이고 정확하게 결정하는 방법에 대한 좋은 해결책이 없습니다. 지금 내가하는 방식은 주기적으로 "불완전한"세션 개체 모음을 검색하여 두 개의 하트 비트와 동일한 시간 내에 업데이트되지 않은 항목을 찾고이를 "완료"세션이있는 다른 모음으로 이동시키는 것입니다. 이 작업은 시간이 오래 걸리고 비효율적이며 수평으로 잘 확장되지 않습니다. 기본적으로 마지막 타임 스탬프를 나타내는 열의 테이블을 정렬하고 충분히 오래된 행을 필터링하는 것으로 구성됩니다. 간단하지만 병렬 처리가 어렵습니다. 너무 자주하면 다른 작업을 수행하지 않을 것이고 데이터베이스는 데이터를 필터링하는 중입니다. 자주하지 않으면 각 실행이 느려질 것입니다. 처리 하기엔 너무 비싸다.

잠시 동안 세션이 업데이트되지 않았을 때 반응하고 모든 세션을 폴링하여 업데이트되었는지 확인하고 싶습니다.

업데이트 : 규모의 감각을 부여하기 만하면됩니다. 언제든지 수십만 개의 세션이 활성화되며 결국에는 수백만 명이 생깁니다. 마음에 오는

+0

얼마나 빨리 세션이 끝났습니까? –

+0

대략적인 시간. – Theo

답변

2

하나의 가능성 : 세션이 마지막 시간을 기록합니다 (아직없는 경우) 타임 스탬프 필드를 추가, 세션 추적 데이터베이스 테이블에서

"활성" . 하트 비트가 생길 때마다 타임 스탬프를 업데이트하십시오.

세션을 만들 때 세션이 만료되어야하는지 확인하기 위해 적절한 지연 후 "타이머 이벤트"가 실행되도록 예약하십시오. 타이머 이벤트가 발생하면 타이머가 대기하는 동안 더 많은 활동이 있었는지 확인하기 위해 세션의 타임 스탬프를 확인하십시오. 그렇다면 세션은 여전히 ​​활성 상태이므로 나중에 다시 확인하도록 다른 타이머 이벤트를 예약하십시오. 그렇지 않은 경우 세션이 시간 초과되었으므로 세션을 제거하십시오.

이 방법을 사용하면 각 세션마다 서버가 만료되었는지 여부를 확인하는 책임이 있지만 항상 다른 서버가 다른 세션을 담당 할 수 있으므로 작업량이 고르게 분산 될 수 있습니다.하트 비트가 들어 오면 모든 서버간에 (아마도) 공유되는 데이터베이스의 타임 스탬프 만 업데이트되기 때문에 어떤 서버가 어떤 서버를 처리하는지 상관하지 않습니다.

아직 만료되지 않은 세션이 만료되었는지 여부를 확인할 수있는 정기적 인 타이머 이벤트가 있으므로 일부 폴링이 필요합니다. 하트 비트가 도착할 때마다 보류중인 타이머 이벤트를 취소 할 수 있지만 여러 서버가 까다로운 경우에는이를 피할 수 있습니다. 하트 비트를 처리하는 서버가 타이머를 예약 한 서버와 같지 않을 수 있습니다. 여하튼, 관련된 데이터베이스 쿼리는 가볍습니다 : 정렬이나 비항 등 비교없이 기본 키로 한 행 (세션 레코드)을 조회하면됩니다.

+0

이론을 사용하면 타이머를 사용할 수는 있지만 실제로 어떻게해야하는지 잘 모르겠습니다. 세션이 업데이트 될 때 타이머가 지연 (예 : 취소되고 새 시간으로 설정)되는지 확인하려면 어떻게합니까? 제대로하지 않으면 가짜 수표에 휩싸이게됩니다. 언제든지 수십만 (그리고 궁극적으로는 수백만)의 세션이 활성화되어 있습니다. – Theo

0

따라서 하트 비트를 수집하고 있습니다. 수집 된 하트 비트가 세션 종료를 암시하는 패턴을 찾는 일괄 처리 (또는 무언가)를 가질 수 있는지 궁금합니다.

정확도 수준은 하트 비트가 얼마나 규칙적이며 수집 된 하트 비트를 스캔하는 빈도에 따라 결정됩니다.

이점은 단일 메커니즘 (한 지점에서 모든 하트 비트를 폴링 할 필요가 없으므로 각 하트 비트를 폴링하지 않아도 됨)을 확장 처리 할 수 ​​있어야합니다. 데이터베이스 중심 솔루션 많은 데이터에 대처할 수 있어야합니다. 맞습니까?

좀 더 세련된 해결책이 있지만 내 뇌가 지금 막 가득 차 있습니다. :)

+0

하트 비트 간격을 알고 있으므로 세션이 종료되었다는 것을 알아 내면 아무 문제가 없습니다 (완벽하지는 않지만 두 개의 하트 비트가 누락되면 세션이 종료되었음을 알 수 있음). 그러나 이것은 내가 나의 질문에서 묘사하는 것입니다 ("지금하는 방식", 마지막 단락에서 세 번째 부분에 있음). 문제는이 메커니즘이 병목 현상이된다는 것입니다. – Theo

관련 문제