2014-11-25 1 views
3

현재 WebJobs SDK를 사용하여 대기열에서 발행 된 메시지를 사용하고 있습니다.QueueTrigger를 완만하게 연기하십시오

[Microsoft.Azure.WebJobs.QueueTrigger (...)] 특성이있는 하나의 매개 변수로서 내 메서드가 정상적으로 트리거되었습니다. 경우에 따라이 메서드는 메시지를 처리 ​​할 수 ​​있지만 때때로 중요한 리소스를 사용할 수있을 때까지 메시지를 거부하는 것이 좋습니다.

이 경우 예외를 발생 시키려고했으나 참조가 말하는 것과는 달리 큐 트리거가 즉시 다시 시작됩니다 (임대 시간을 기다리지 않고).

gracefuly 메시지 처리를 연기 할 수있는 방법이 있습니까? 중요한 리소스를 기다리는 스레드를 고정시키는 것이 안전할까요?

힌트를 주시면 감사하겠습니다.

+0

<< ... 대기열 트리거가 즉시 다시 시작됩니다 (임대 시간을 기다리지 않는 것 같습니다).>> 여기에 나와있는 내용 때문에 https://blogs.msdn.microsoft.com/mustafakasap/2015/12/26/azure-webjobs-jobhostconfiguration/ (이 정보가 정확하다고 가정)이 표시 될 수 있습니다. "다른 동시 처리 단계에 있지 않은 대기열에서 대기중인 메시지는 시험 간 시간 간격이 없습니다! 따라서 충분한 자원이 있으면 재 시도가 즉시 발생합니다. " – Matt

답변

1

현재 버전에서 메시지를 연기 할 수 있다고 생각하지 않습니다.

가능한 해결 방법

당신은 지연과 같은 메시지를 다시 추가 할 수 있으며, 이것은 똑바로 예외 후 큐에 메시지를 실패 보낼 것이다 MaxDequeueCount 1로 설정할 수 있습니다 중복을 피하기 위해

:

 JobHostConfiguration configuration = new JobHostConfiguration(); 
     configuration.Queues.MaxDequeueCount = 1; 

및 메시지 프로세서 - 다시 추가 지연과 던져 예외 메시지를 :

public static void ProcessMessage([QueueTrigger("resource-heavy-queue")] string message, [Queue("resource-heavy-queue")] CloudQueue originalQueue) 
    { 
     if (/*Resource unavaliable*/) 
     { 
      var messageToReAdd = new CloudQueueMessage(message); 
      originalQueue.AddMessage(messageToReAdd, null, TimeSpan.FromSeconds(10)); 
      throw new ResourcesNotAvailableException(); 
     } 
    } 

이렇게하면 리소스에 대해 일종의 백 오프 전략을 구현할 수 있습니다. 불행하게도 수동으로 몇 가지 문제를 해결해야한다 :

  • 포이즌 메시지를 처리 ​​- 당신이 NumberOfRetries 및 증가를 수행하기 위해 메시지의 모델을 확장 할 필요가 있도록, 다시 추가하면 무한 루프에 끝낼 수있는 동일한 메시지를 유지하는 경우 반복 할 때마다
  • 메시지 IdInsertionTime은 모두 을 다시 추가 할 때마다 달라져서 다시 사용할 수 없기 때문에을 다시 사용할 수 없습니다.
+0

음 메시지 타임 스탬프는 나에게 다소 중요합니다. 내가 읽은 경우 원래의 타임 스탬프를 어떤 식 으로든 유지해야 할 것입니다. – cmalosse

+1

데코레이터 패턴을 사용하여 원래의 타임 스탬프 * 및 예를 들어 * 재시도 횟수와 함께 메시지 장식 된 버전을 다시 추가 할 수 있습니다. 이런 식으로 당신은 다른 곳에서는 그것을 유지할 필요가 없습니다. – b2zw2a

0

죄송합니다. 트리거를 연기 할 수 없습니다. 원하는 것은 Azure WebJobs SDK에없는 멀티 트리거 (메시지와 리소스를 사용할 수있는 경우 트리거)입니다.

몇 가지 해결 방법이 있습니다. 대기열의 메시지에 중요한 리소스 (세마포를 구현해야 함)가 필요한 경우 스레드를 고정 할 수 있습니다. 그렇지 않으면 병렬로 실행되는 최대 수의 함수에 도달하면 SDK가 새 메시지를 처리하지 않으므로 일정이 까다로워집니다. .

대기열에서 트리거하는 대신 수행 할 작업은 중요한 리소스에 대한 트리거입니다. 자원을 사용할 수있게되면 다른 대기열에 메시지를 넣고 자원을 필요로하는 처리 할 메시지가 있는지 확인합니다.

+0

불행히도 중요한 리소스를 실행할 수 없습니다! 내가 지금하고있는 일은 스레드를 멈추고 주기적으로 리소스를 잠그는 것입니다. 재시도 횟수에는 한계가 있습니다. 도달하면 기본 중독 메시지 관리로 돌아갑니다. – cmalosse