2009-04-08 3 views
0

페이지를 요청할 때마다 데이터베이스에 쓰기 작업을 수행하는 응용 프로그램이 있습니다. 이 db 쓰기는 시간이 중요하지 않으므로 성능상의 이유로 MSMQ를 사용하여 개체를 대기중인 페이지가 있습니다. '나는 정말 돈이 웹 사이트는 본질적으로 매우 작기 때문에, 지금ASP.NET 스레딩 + 디자인 질문

public class QueueProcessor { 
    public void Start() 
    { 
     // Create background thread to run ProcessInternal() 
    } 

    public void Stop() 
    { 
     // Stop the previously created thread 
    } 

    public void ProcessInternal() 
    { 
     while (runnable) 
     { 
      // check queue for messages, process them one at a time, 
      // then wait indefinitely for more messages 
     } 
    } 
} 

: 물론, 큐 및 프로세스 요청을 읽을 수있는 무언가를 가지고, 그래서 나는이와 비슷한 클래스를 썼다 t은 배포 루틴에 Windows 서비스를 추가해야하므로, 지금 내가하고있는 일은 Application_Start 이벤트에 새 QueueProcessor를 만들고 거기에서 시작하는 것입니다. 내 생각에 스레드가 응용 프로그램의 수명 동안 실행되며 응용 프로그램이 IIS에 의해 종료되면 다음 번에 누군가가 페이지에 액세스 할 때 응용 프로그램이 다시 시작됩니다.

응용 프로그램이 IIS에 의해 중단되어 대기중인 메시지가 처리되지 않는 오랜 기간의 유휴 시간을 방지하기 위해 응용 프로그램을 유지하면서 사이트 페이지 중 하나에서 몇 분마다 실행하도록 wget 요청을 설정했습니다 백그라운드 스레드가 계속 실행되도록합니다.

제 질문은이 디자인이 자주 나타나지 않는다는 것입니다. 잠재적 인 문제가 있는지 궁금합니다.

는 편집 :

주제에 대한 몇 가지 독서를하고 후에, 나는이 방법 (및 캐시 제거 콜백 함수와 유사한 것)와 주요 문제는 그들이가 요구되고 있었다 기능의 유형이 발견 확장 성과 관련하여 수행하십시오. 예를 들어 일괄 업데이트 등을 수행하는 경우 모든 웹 서버에서 작업을 실행하지 않는 것이 좋습니다. 업데이트와 데이터 손실이 상충 될 수 있습니다.

그러나 매우 특별한 경우 스레드는 서버의 메시지 대기열에있는 서버에서받은 요청 만 처리합니다. 따라서,이 응용 프로그램을 5 대의 서버로 확장하려면 각 스레드는 아무 문제없이 각 서버의 대기중인 메시지를 처리합니다. 데이터베이스의 레코드 순서는 그다지 중요하지 않으므로 작은 간격으로 여러 서버의 비슷한 요청이 문제가 될 수 있으므로이 솔루션이 내 문제에 대해 합리적이라고 생각합니다.

답변

1

나는 어려움없이 유지하고있는 일부 웹 사이트에서 비슷한 계획을 사용했다. 주의 할 점은 스레드의 모든 예외를 올바르게 catch하는지 확인하는 것입니다. 개발자가 알고 싶지 않은 것은 스레드가 알지 못해 죽어 버린 다음 응용 프로그램을 다시 사용할 때 자동으로 다시 시작하는 스레드입니다.

1

wget 요청을 설정하는 것이 Windows 서비스를 배포하는 것보다 훨씬 쉽다고 생각합니다. 그 외의 특정 문제는 보이지 않습니다. 안정성과 정확한 타이밍이 중요하지 않은 경우이 방법이 효과적입니다.

+0

wget 조각은 추가로 필요하지 않습니다. 다른 포스터에서 언급했듯이, 해당 스레드에 대한 모든 예외를 catch/처리하는 경우, 조기에 죽어 버릴 가능성은 거의 없습니다. 유휴 응용 프로그램이 죽으면 대기열이없는 트래픽을 의미하므로 실제로 거기에서도 OK입니다. – Chris

1

Jeff와 Co. seem to use similar hackery이 웹 사이트에서 Windows 서비스를 피하기 위해 좋은 생각이라고 생각하지는 않았지만 조엘도 FogBugz를 사용합니다. 규모와 성능이 여기에서 꽤 잘 입증되었으므로 확실히 합리적이고 실행 가능한 것처럼 보입니다.

+0

실제로 그들은이 트릭을 더 이상 사용하지 않고 Jeff의 마지막 코멘트를 읽습니다 (Joe의 질문에 대한 답변, 페이지 맨 아래). –