2011-10-17 2 views
1

나는 여러 프로세스에서 정기적으로 업데이트되는 행이있는 Azure 테이블 저장소에 테이블을 가지고 있습니다. 특정 시간 내에 행이에 업데이트되지 않았을 때 효율적으로 모니터링하고 발생하는 경우 경고를 생성하려고합니다. 나는 확실히 하나 명의 노동자를하여 푸른 기능에 본 적이Azure에서 비활성 상태를 확인하기위한 전략

대부분의 작업 스케줄러 구현은 한 번에 주어진 작업을 수행합니다. 그러나 n 분을 기다린 예약 된 작업을 설정 한 다음 작업을 수행해야하는지 확인하기 위해 최신 타임 스탬프를 쿼리하면 작업이 작업자에게 퍼지지 않으므로 비효율적 인 것으로 보입니다. 많은 레코드를 폴링해야하는 것은 일반적으로 비효율적 인 것처럼 보입니다. 이것의

예 사용은 지난 30 일 웹 사이트에 로그인하지 않은 사용자에게 이메일을 보낼 것입니다. 효율적인 알고리즘을 생성하기 위해 사용자 수가 "많은 수"라고 가정합니다.

누구나 강제로 일을하지 않고 최근 활동을 확인하는 데 사용할 수있는 전략에 대한 권장 사항이 있습니까?

답변

3

타임 스탬프가있는 LastActive 테이블을 행키 (DateTime.UtcNow.Ticks.ToString("d19"))로 유지하십시오. 이전 행을 삭제하고 새 행을 삽입하는 배치 트랜잭션을 수행하여 업데이트하십시오.

지금 비활성 사용자에 대한 쿼리는 from user in LastActive where user.PartitionKey == string.Empty && user.RowKey < (DateTime.UtcNow - TimeSpan.FromDays(30)).Ticks.ToString("d19") select user 같은 뭔가입니다. 이는 어떤 크기의 테이블에서도 매우 효율적입니다.

는 그 정보와 함께 할 건지에 따라 다음 큐에 메시지를 넣을 다음 행을 삭제 할 수 있습니다 (그래서 다시 확인 다음 번에 발견되지 않습니다). 여러 작업자가 대기열 메시지를 가져 와서 조치를 취할 수 있습니다.

난 당신은 아마 한 번만 비활성 사용자에 따라 행동하려는, 그래서 당신은 확인을 할 단 하나의 인스턴스를 원하는 ... 여러 작업자 인스턴스에서이 작업을 수행하는 당신의 욕망에 대한 혼란 스러워요. (이메일을 보내거나 당신이하고있는 어떤 다른 사람의 작품은 다음 큐를 사용하여 약 확산 될 수 있지만 초기 검사는 정확히 하나 개의 인스턴스에 의해 수행되어야합니다.)

+0

내가처럼 단순한 예를 들어 사용자를 사용했다. 내 데이터는 실제로 각 행에 대해 5 초마다 한 번씩 업데이트됩니다. 추가 테이블을 업데이트하면 수천 개의 행을 통해 테이블을 검색하는 것보다 훨씬 더 많은 오버 헤드가 발생합니다. 일반적으로 한 사람의 과도한 부하를 피하기 위해 수행 할 실제 작업을 대기열에 넣을 수도 있습니다. 그러나 대기열이 ~ 500 개의 메시지/초로 제한되어 있다고 가정 해 보겠습니다. 5000 개의 행은 대기열에 50 초가 걸립니다. 어떻게 든 직접 처리하기를 바랬습니다. –

+0

더 중요하게,이 모든 행을 동일한 PK에 넣음으로써, 500으로 할 수있는 업데이트 수/초를 제한하게 될 것입니다. 수천 개로 확장 가능하고 싶습니다. –

+0

스캔 속도가 빠르면 내가 묻는 것을 이해하지 못하는 것 같습니다. 스캔을하십시오. 한 파티션의 확장 성이 충분하지 않으면 여러 파티션을 사용하십시오. 하나의 대기열이 충분히 확장되지 않으면 여러 대기열을 사용하십시오. 전체 저장소 계정의 한계에 부딪 히면 여러 저장소 계정을 사용하거나 다른 저장소 기술을 고려할 수 있습니다. – smarx

관련 문제