나는 세션 데이터를 수집하는 시스템을 가지고있다. 세션은 "세션 시작됨"및 "수행 된 X 수행"과 같이 여러 가지 고유 한 이벤트로 구성됩니다. 세션이 끝나는시기를 판별 할 수있는 방법이 없으므로 하트 비트 이벤트는 정기적 인 간격으로 전송됩니다.분산 시스템에서 이벤트가 없을 경우 어떻게 대응할 수 있습니까?
이것은 주된 복잡성입니다. 세션이 종료되었는지 확인하는 방법이 없으면 이벤트 부재 (예 : 더 이상 하트 비트가 없음)에 반응하려고 시도하는 것입니다. 어떻게 분산 시스템에서 이것을 효율적이고 정확하게 할 수 있습니까? 이벤트는 다음 세션을 나타내는 개체로 조립해야합니다
:
여기 문제에 좀 더 배경입니다. 세션 개체는 나중에 다른 시스템의 추가 데이터로 업데이트되며 결국 세션 수, 평균 세션 길이 등과 같은 항목을 계산하는 데 사용됩니다.
시스템은 수평 적으로 확장되어야하므로 수신하는 여러 서버가 있습니다 이벤트 및이를 처리하는 여러 서버가 있습니다. 동일한 세션에 속한 이벤트는 다른 서버로 보내지고 처리 될 수 있습니다. 즉, 이들이 순서대로 처리 될 것이라는 보장이 없으며 이벤트가 복제 될 수 있다는 추가 합병증이 있습니다. 또한 일부는 서버에 도달하기 전에 또는 처리 될 때 손실 될 위험이 있습니다.
이미 대부분 있지만 세션이 끝났을 때 효율적이고 정확하게 결정하는 방법에 대한 좋은 해결책이 없습니다. 지금 내가하는 방식은 주기적으로 "불완전한"세션 개체 모음을 검색하여 두 개의 하트 비트와 동일한 시간 내에 업데이트되지 않은 항목을 찾고이를 "완료"세션이있는 다른 모음으로 이동시키는 것입니다. 이 작업은 시간이 오래 걸리고 비효율적이며 수평으로 잘 확장되지 않습니다. 기본적으로 마지막 타임 스탬프를 나타내는 열의 테이블을 정렬하고 충분히 오래된 행을 필터링하는 것으로 구성됩니다. 간단하지만 병렬 처리가 어렵습니다. 너무 자주하면 다른 작업을 수행하지 않을 것이고 데이터베이스는 데이터를 필터링하는 중입니다. 자주하지 않으면 각 실행이 느려질 것입니다. 처리 하기엔 너무 비싸다.
잠시 동안 세션이 업데이트되지 않았을 때 반응하고 모든 세션을 폴링하여 업데이트되었는지 확인하고 싶습니다.
업데이트 : 규모의 감각을 부여하기 만하면됩니다. 언제든지 수십만 개의 세션이 활성화되며 결국에는 수백만 명이 생깁니다. 마음에 오는
얼마나 빨리 세션이 끝났습니까? –
대략적인 시간. – Theo