2009-08-23 5 views
26

ASP.NET MVC 웹 응용 프로그램에서 백그라운드 처리 대기열을 구현하려면 어떻게해야합니까? 대부분의 데이터 변경, 업데이트 등은 즉시 볼 수 있어야하지만 실시간 처리가 필요없는 다른 업데이트가 있습니다. 우선 순위가 낮은 백그라운드 프로세스로 전달하여 자신의 속도대로 처리 할 것입니다. .ASP.NET MVC 웹 응용 프로그램의 대기열 기반 백그라운드 처리

예를 들어, StackOverflow의 배지 보너스 시스템을 가져 가십시오. 일반적으로 배지를 수여 할 구체적인 조치를 취할 수 있지만 실제 '배상'은 나중에 발생합니다 (일반적으로 10 분에서 몇 시간 후). 나는이 작업이 별도의 백그라운드 프로세스를 통해 이루어 졌다고 가정합니다. 그 작업이 벌어지면 즉시 배지를 수여하는 것이 중요하지 않기 때문입니다.

그래서 저는 작업을 채울 수있는 일종의 대기열 시스템을 만들려고합니다. (별도의 프로세스에 의해 결국 실행될 ITask 인터페이스를 구현하는 IT 프로세스 인터페이스를 말합니다.)

그런 시스템을 구현하려면 어떻게해야합니까? 아이디어/힌트/샘플 코드?

감사합니다.

답변

20

Windows 서비스 및 MSMQ를 사용하여 통신해야합니다 (필요한 경우).

- 편집

약간 확장하십시오.

원하는 작업에 따라 여러 가지 서비스를 만들고 다양한 수면 수준의 끝없는 스레드를 실행하여 원하는 것을 할 수 있습니다. 그런 다음 데이터베이스를 적절하게 업데이트하므로 클라이언트 측에서 아무 것도하지 않아도됩니다.

관리자의 관점에서 상호 작용할 수 있으므로 관리자 명령을 수신하는 MSMQ가있을 수 있습니다. 구현에 따라, 어떤 이유로 든 다시 시작하거나, 원하는대로 실행되도록 강제 할 수 있습니다.

그래서 MSMQ 개인 큐를 사용하여이를 수행합니다 (System.Messaging 네임 스페이스). MSMQ에 대해 알아야 할 주요 사항 중 하나는 메시지가 < 4meg가되어야한다는 것입니다. 따라서 대형 객체 그래프를 보내려는 경우 먼저 파일에 직렬화하고 파일 이름을 보내십시오.

MSMQ는 매우 아름답습니다.

{guid}\1 

다른 건 이상 버전 2.0 (작동하지 않는 : 당신이 어떤 재미있는 이유, 상관 ID는 형식이어야합니다, 필요하지만, 경우는 '상관 관계 ID'를 기반으로 보낼 수 있습니다 코드가 변경되었을 수 있음).

- 편집

예, 요청에 따라 :

using System.Messaging; 

... 


MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = new Message(); 
m.Body = "your serialisable object or just plain string"; 

queue.Send(m); 


// on the other side 

MessageQueue queue = new MessageQueue(".\\Private$\\yourqueue"); 
queue.Formatter = new BinaryMessageFormatter(); 

Message m = queue.Receive(); 

string s = m.Body as string; 

// s contains that string now 
+1

에서이 위대한 기사를 읽고 당신에 대한 예제가 있습니까 방법 MSMQ와 처음에 '연결'서비스 응용 프로그램 및 다음 ASP.NET MVC에에? 이것은 나에게 꽤 새로운 것이다. 고맙습니다! – Alex

+0

적절한 큐에 쓰기 만하면됩니다. 서비스가 호출됩니다.받는 사람과 페이지에서 메시지를 대기열로 보내려는 경우 '.Send'가 호출됩니다. 작은 예제로 업데이트하겠습니다. –

+0

업데이트 됨. 참고 대기열을 만들 수있는 코드가없는 경우 해당 코드를 표시하지 않았습니다. 그러나 그것은 System.Messaging API에서처럼 쉽게 알 수 있습니다. 특히 : MessageQueue.Create (...). 또한 적절한 권한을 가져야합니다. (.SetPermissions). –

10

제프가 신뢰할되지 않을 수도 있지만 그는 http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

에서 스택 오버플로이 원래 달성 방법을 보여주는 좋은 게시물을 가지고 그게 당신에게 옵션이라면 서비스로서, 그것은 비 필수적인 업무를 위해 나에게 과거에 잘 봉사했고, 나는 가상 호스팅 환경에서 일하도록했습니다.

5

ASP.NET MVC에서 백그라운드 프로세스를 검색 할 때이 질문을 발견했습니다. (.NET 4.5 이후에 제공됨.2)

public ActionResult InitiateLongRunningProcess(Emails emails) 
{ 
    if (ModelState.IsValid) 
    { 
     HostingEnvironment.QueueBackgroundWorkItem(ct => LongRunningProcessAsync(emails.Email)); 
     return RedirectToAction("Index", "Home"); 
    } 

    return View(user); 
} 

참고 : 개인적으로 웹 서버를 사용하여 백그라운드 작업을 실행하지 않습니다. 또한 바퀴를 재발 명하지 마십시오. Hangfire을 사용하는 것이 좋습니다.

이 Hanselman은 HowToRunBackgroundTasksInASPNET

관련 문제