2017-02-23 1 views
1

herehere의 설명서에 따르면 this one과 같은 수많은 질문에 따르면 대기중인 메시지가 지정된 횟수 (이 경우 5)에 실패하면 현재 메시지가 현재의 메시지 대기열에 넣고 독이있는 대기열에 자동으로 넣습니다.Azure 큐를 삭제하지 못했습니다.

불행히도 내 제한된 경험에 따르면이 작업은 작업이 최대 대기열 해제 횟수에 도달하지 못하면 자동으로 포이즌 큐에 추가되지만 원래 대기열에서 제거되지 않고 분명히 재 처리되므로 부분적으로 만 적용됩니다 10 분 후에 포이즌 큐에 동일한 메시지를 추가하고 중복을 생성하면서도 여전히 제거하지 않습니다. 난 내 자신의 IQueueProcessorFactory 클래스를 구현

DeleteMessageAsync을 덮어하면서, 사용자 정의 QueueProcessor을 만든 예외가 5 회를 던져 메소드가 예외없이 종료하지만 때, 나는 호출되는 방법을 확인할 수 있었다 큐에 남아있는 메시지 . 나는 또한 일반적인 대기열과 독 대기열을 삭제하려고 시도했다.

코드 내가 사용 : 메시지가 원래 대기열에 남아있는 것을 제외하고 예상대로

public class Program 
{ 
    private const string QUEUE_NAME = "some-queue"; 

    // Please set the following connection strings in app.config for this WebJob to run: 
    // AzureWebJobsDashboard and AzureWebJobsStorage 
    static void Main() 
    { 
     var config = new JobHostConfiguration(); 

     config.Queues.QueueProcessorFactory = new CustomFactory(); 
     var host = new JobHost(config); 
     // The following code ensures that the WebJob will be running continuously 
     host.RunAndBlock(); 
    } 

    private class CustomFactory : IQueueProcessorFactory 
    { 
     public QueueProcessor Create(QueueProcessorFactoryContext context) 
     { 
      return new CustomQueueProcessor(context); 
     } 

     private class CustomQueueProcessor : QueueProcessor 
     { 
      public CustomQueueProcessor(QueueProcessorFactoryContext context) : base(context) 
      { 

      } 

      protected override Task DeleteMessageAsync(CloudQueueMessage message, CancellationToken cancellationToken) 
      { 
       return base.DeleteMessageAsync(message, cancellationToken); 
      } 
     } 
    } 

    public static void QueueTrigger([QueueTrigger(QUEUE_NAME)] CloudQueueMessage message) 
    { 
     Console.WriteLine($"Processing message: {message.AsString}"); 
     throw new Exception("test exception"); 
    } 
} 

모든 것이 작동합니다. 나는 짐작하고있다. 실수는 내 마지막에있다. 또는 큐에 새로 왔기 때문에 내가 간과 한 바보 같은 것이지만, 정보를 얻기 위해 인터넷을 거의 2 일간 여행 한 결과 공식적으로 무엇을 할 것인지 또는 다음에 시도하십시오.

편집

우리가 서비스 버스로가는 결국 한 동안, 우리는 큐 트리거 내에서 큐 자신을 관리하기 반이었다 대안 해낸 것을 주목할 필요가있다.

이 작업은 대기열 해제 수를 확인하고 최대 대기열 해제 (재시도) 횟수를 초과 한 경우 단순히 반환합니다. 이것은 호출자에게 메시지가 "성공적으로"처리되었음을 알리고 큐에서이를 제거합니다. 이 방법을 사용하면 메시지가 약 10 분 후에 일반 큐에서 제거되는 동안 포이즌 큐에 추가되는 것으로 예상되는 동작이 거의 발생합니다.

원래의 문제를 해결할 수있는 큐의 패키지 또는 업데이트 자체에 대한 향후 릴리스의 작업을 지속적으로 수행하는 이점이 있습니다.

public class Program 
{ 
    private const int MAX_DEQUEUE_COUNT = 5; 

    static void Main() 
    { 
     var config = new JobHostConfiguration(); 
     ... 
     config.Queues.MaxDequeueCount = MAX_DEQUEUE_COUNT; 
     ... 
    } 

    public static void QueueTrigger([QueueTrigger("some-queue")] CloudQueueMessage message) 
    { 
     if (message.DequeueCount > MAX_DEQUEUE_COUNT) 
     { 
      // prevents the message from indefinitely retrying every 10 minutes and ultimately creating duplicates within the poison queue. 
      return; 
     } 

     // do stuff 
    } 

답변

0

나는 개인 경험과 내가 StackOverflow에서 본 것에 근거하여 참조되지 않은 답변을 제공하려고합니다. WebJob QueueTriggerAttributes와 관련하여 자동 데드 레터링 및 최대 대기 해제 수주에 대한 문제가있는 사람은 처음입니다. 서비스 큐 및 서비스 버스 트리거를 사용하기 위해 스토리지 큐 + 대기열 트리거의 박탈을 피하는 것이 좋습니다.

메시징 기술로서 서비스 버스 대기열은 훨씬 완벽한 기능을 갖추고 있으며 비용 대비 비교할 수 있습니다. 서비스 버스 대기열을 통해 저장소 대기열을 사용하는 유일한 이유는 분할로 서비스 버스 대기열 한도 인 80GB 이상의 메시지를 저장해야하는 경우입니다.

0

동일한 동작이 발생했으며 webjobs sdk (v2)와 저장소 클라이언트 라이브러리 v8.x 사이에 생성 된 버그로 인해 발생했습니다.

2.1.0-beta1-10851부터 수정해야합니다.단점은 현재 안정 버전 2.1.0이 아직 없다는 것입니다.

관련 문제