2010-01-26 4 views
2

.NET Windows 서비스의 타이머 간격을 10 초로 설정했습니다. 10 초마다 데이터베이스에서 수행 할 작업을 쿼리하고 상위 3 개의 작업 항목을 선택하여 처리합니다. 각 작업 항목을 처리하는 데 걸리는 시간은 사용자에 따라 다릅니다. 몇 초에서 몇 분 정도 걸릴 수 있습니다.최적의 타이머 간격은 무엇입니까? .NET Windows 서비스

10 초가 너무 짧습니다. 사용자가 프로세스가 완료 될 때까지 기다리는 동안 (프로세스가 프런트 엔드에서 진행률 표시 줄을 볼 때) 낮은 간격을 선택했으며 서비스가 작업을 빨리 수행할수록 더 좋습니다. 또한 작업 항목 수 (3 개)가 무작위로 선택되었습니다.

하나의 스레드가 다른 스레드로 넘어 가지 않도록 내 코드에 "잠금 (this)"이 있습니다. 프로덕션 환경에서 10 초의 짧은 시간이 괜찮습니까?

EDIT : 또한 처리 할 때마다 매 3 개의 항목 만 선택한다는 의미입니다.

+0

타이머가 10 초마다 실행되지만 어떤 이유로 요청을 처리하는 데 30 초가 걸리는 경우 어떻게됩니까? –

+0

쿼리와 통신 단계를 완료하는 데 걸리는 시간 (데이터베이스가 서비스에 로컬 인 경우 쿼리 만)과 해당 프로세스가 리소스를 많이 차지하는 정도에 따라 전적으로 다릅니다. – Jay

+0

나는 DB를 쿼리하는 것이 유일한 일은 아니며 몇 분이 걸릴 수도있는 프로세스를 시작한다는 것을 잊어 버렸다. – Nick

답변

1

... 또한, 내가 위험 할 수 데리러 항목의 하드 수를 갖는 단 3 항목을 처리 할 때마다 ...

을 따기하고 의미가 없습니다. 항목을 처리 할 수있는 것보다 빠르게 대기열에 입력 할 가능성이 있습니다. 10 초마다 3 개 이상의 항목이 대기열에 포함되면 어떻게 될지 고려하십시오. 아이템을 처리하는 데 시간이 오래 걸린다는 것을 알게 될 것입니다.

추가 스레드를 생성하거나 이벤트 중심 접근 방식을 사용하는 것이 더 좋을 수도 있습니다.

0

당신의 질문이 얼마나 복잡한가에 달려 있다고 생각합니다. 즉각적으로 반환되는 간단한 쿼리이고 매 10 초마다 단일 서비스에 의해서만 실행되는 경우 문제가 될 것이라는 점은 의심 스럽지만 환경에 대해 아무 것도 모를 정도로 저를 붙잡아 두지 마십시오.

다른 솔루션을 모두 찾고 있다면 폴링 대신 메시징 아키텍처를 살펴볼 수 있습니다.

기본적으로이 시나리오에서는 처음부터 데이터베이스에 작업을 추가하는 시스템이 있으면 서비스에 메시지를 보내서 수행 할 작업이 있음을 알릴 수 있습니다. 그런 다음 서비스가 아무 것도 폴링 할 필요가 없으면 데이터베이스를 확인해야한다는 알림이 표시되고 대기합니다. 또는 메시지 자체에 할 작업을 포함시키고 서비스가 처리하도록하고 데이터베이스 자체에 저장해야 할 것을 저장할 수 있습니다.

메시징에 관심이 있으시면 NServiceBus를 살펴보십시오. 기본적으로 MSMQ를 감싸는 포장지이며 상호 연결된 시스템에 관한 완전히 새로운 아이디어의 세계에 마음을 열 것입니다.

옵션은 실제로 끝이 없습니다.

+0

메시지의 일부로 작업을 보내는 데 문제가 있습니다. 서비스가 중단되면 수행 할 작업이 손실 될 수 있습니다. 또한 처리 서비스가 메시지를 수신 할 수없는 경우 수행 할 작업이 있음을 알지 못해 결코 처리되지 않는 작업이 발생할 수 있습니다. 중앙 영구 저장소 (예 : 데이터베이스 =)에 메시지 큐를 배치하면 이러한 문제를 방지 할 수 있습니다. –

+0

반대로. MSMQ와 같은 실제 메시징 서비스를 사용한다면 배달이 보장됩니다. 서비스가 다운되었거나 청취하지 않거나 어떤 경우이든 상관없이, 서비스는 다음 기회를 포착합니다. –

0

10 초 간격으로 사용합니다.
사용자 프로세스가 완료 될 때 다른 검사 수행 (불필요한 10 초 대기를 방지하기 위해)

데이터베이스 이벤트를 잡기 위해 SQLDependency 클래스를 조사 할 수 있습니다. 그것은 더 나아질 것이지만 구현하기가 조금 더 어렵습니다. 보고 여기 SQLDependecy에 대한 자세한 내용은

는 : 나는 현재 저장 프로 시저에서 작업을 가져 오는 주요 타이머 직장에서 이런 일을 처리하고 http://www.codeproject.com/KB/database/chatter.aspx

1

각 초 (1000 밀리 초) 할 수
.

하지만 가져 오기는 X 항목 (예 : 3 개)에만 국한되지 않습니다.
필요한만큼의 스레드를 추가하고 프레임 워크가 올바르게 처리하도록하십시오.

모든 코드를 디코드하려고했는데 어떤 코드도 사용하지 않아도됩니다. lock.

나는 모든 로그 정보를 db에 저장하고 다른 타이머 (30 분 간격)를 사용하여 결국 오류를 가져 와서 나에게 메일을 보냅니다.

모든 작업을 타이머 1과 다른 다른 스레드에 제공한다고 가정 할 때 1 초 타이머에 문제가 없어야합니다.

+0

+1 좋은 해결책. – Walter

0

답변이 어려운 질문입니다. 프로덕션 환경이 비교 환경보다 큰 하드웨어 구성을 가질 수 있으므로 큐가 현재 값보다 빠르게 처리 될 수 있습니다.

추측하고 싶지 않은 경우 대기열 기반 winservice를 구현하십시오. 이 서비스는 MSMQ 대기열을 읽고 시간에 작업 항목을 가져 와서 처리합니다. 따라서 작업 항목을 처리해야하는 경우 해당 대기열을 요청하면됩니다. 원하는 모든 빈도 (1 초)로 처리 할 수 ​​있습니다. Why lock(this) is bad :

가장 중요한 것은 당신이 아직 ...이

BTW, 당신은 반드시 숙지해야 할 일을하면서 더 많은 작업 항목을 얻을하지 않습니다 있는지 확인하는 것입니다.

1

서비스 간격은 UI와 관련이 없어야합니다. 이를 수행하는 한 가지 방법은 데이터베이스에서 "새로운", "진행중인"또는 "완료 됨"으로 표시하는 각 작업 항목에 플래그를 지정하는 것입니다. 귀하의 서비스가 한 번에 하나의 물건을 가져 와서 그것을 "진행중"으로 표시하고, 필요한 것을하고, 완료되면 "완료"로 표시하십시오.

사용자의 UI는이 테이블을 폴링하고 필요에 따라 사용자가 최근에 수정 한 각 행의 상태를 업데이트합니다.

이렇게하면 UI 대기 시간 이외의 다른 고려 사항에서 타이머 간격이 중요하지 않게됩니다. 또한 효율성을 희생하지 않고 여러 서비스 스레드를 실행할 수 있습니다 (3 개의 스레드가 3 개를 처리하는 대신 3 개의 스레드가 한 번에 하나씩 처리하는 경우 3 개의 스레드가 처리 할 수 ​​있음), 경쟁 조건 등이 거의 또는 전혀없는 경우

또한 처리하는 동안 타이머를 사용하지 않도록 설정하거나 처리 방법을 재진입 (자체 방해) 할 수있는 위험을 감수해야합니다.

+0

정확히 구현 한 방법입니다. "이런 식으로 타이머 간격은 UI 대기 시간 이외의 다른 고려 사항과 관련이 없습니다." -> 사실,하지만 사용자가 너무 오랫동안 기다리게하는 것을 원하지 않습니다. 각 스레드가 1 개의 항목을 선택하면 3 번째 항목을 처리하는 데 최악의 경우 30 초가 걸리므로 3 번째 사용자가 너무 오래 대기하게됩니다. 3 개의 요청이 모두 10 초 내에 완료 될 수 있습니다.이 경우 하나의 스레드가 3 개의 항목을 선택하면 더 좋지 않겠습니까? – Nick

+0

나는 한 번에 3 번하는 것이 낫다는 것에 동의하지 않는다. 이상적으로는 가져 오기/업데이트 시간이 필요한 처리 시간에 비해 중요하지 않아야합니다. 중요한 성능 이점이 없으면 X 항목을 임의로 선택하지 않습니다. 위의 예에서 UI는 "작동중인"표시기와 함께 일종의 "진행중인"항목을 표시 할 수 있으므로 UI ​​환경이 개선됩니다. 3 개의 코어에 3 개의 스레드가있는 경우 각 항목은 거의 동시에 완료됩니다. 희망이 도움이됩니다. –

관련 문제