2012-07-29 3 views
0

Windows Azure 작업자 역할에서 '긴급한'메시지를 처리하는 가장 좋은 방법은 무엇입니까?Windows Azure 작업자 역할 활성화

내가 시작하는 작업자 역할을 무한 동안 (사실) 루프를 수행하고이 루프 :

  1. 는 큐가
  2. 가이를 처리 메시지가 있는지 읽고 그들에게
  3. 을 삭제 처음에 더 작은 간격 (10 초) 동안 Thread.Sleep (간격)으로 잠들기 위해 더 이상 메시지가 없으면 잠자기 간격을 최대 2 분으로 늘립니다.
  4. 메시지가 대기열에 나타나면 대기 간격을 재설정합니다 0으로 설정하고 1 단계로 돌아갑니다.

문제는 작업자가 2 분 동안 대기하고 메시지가 대기열에 나타나면 작업자를 깨우고 나머지 시간을 기다리지 말아야한다는 것입니다.

작업자 역할의 인스턴스를 가져와 깨우기 위해 말할 수있는 방법이 있습니까? 데이터베이스에 글을 쓰려고 생각했는데 같은 역할을하는 경우에도 동일한 문제가 있습니다. 이미 잠 들어있는 다른 작업자 역할을 깨우려면 어떻게해야합니까?

답변

3

이것은 Windows Azure 저장소 큐를 사용할 때의 단점 중 하나입니다. 비용과 대기 시간 중 하나를 선택해야합니다. 비용을 최적화하고 싶다면 백 오프 정책을 구현할 것입니다.하지만 이는 메시지 처리시기 (대기 시간 증가)에 영향을 미친다는 것을 의미합니다.

Windows Azure 서비스 버스 큐를 평가하는 것이 흥미로울 수도 있습니다 (차이점 here 참조). 서비스 버스 대기열을 사용할 때의 이점은 긴 폴링을 지원한다는 것입니다. 즉, 메시지가 도착할 때까지 (또는 제한 시간 경과 후) 서버에 대한 연결을 유지합니다. 여기

QueueClient queueClient = factory.CreateQueueClient("myqueue"); 
while (true) 
{ 
    BrokeredMessage msg = queueClient.Receive(TimeSpan.FromSeconds(45)); 
    if (msg != null) 
    { 
     var request = msg.GetBody<CreateOrderMessage>(); 
     // Do something 
     msg.Complete(); 
    } 
} 

당신이 시작하는 것입니다 몇 가지 좋은 자원입니다 : 여기

는 일반적으로 작성합니다 몇 가지 예제 코드 (당신은 여전히 ​​... 예외 등을 관리해야합니다)입니다

2

적은 시간 동안 잠을 잘 수 있습니다. 왜 너는 1 초가 아니라 2 분 동안 자고 있니? 한 인스턴스에서 초당 한 번 대기열을 폴링하면 트랜잭션 당 월 $ 0.25 정도가 소요됩니다.

관련 문제