2016-11-15 1 views
0

1000 개의 파티션과 1 개의 복제본이있는 상태 저장 서비스가 있습니다.서비스 패브릭 신뢰할 수있는 큐 FabricNotReadableException

이 서비스는 RunAsync 메서드에서 메시지를 가져 오기 위해 신뢰할 수있는 큐를 호출하는 동안 순환이 발생합니다. 메시지가 없으면 5 초 동안 기다린 다음 다시 시도하십시오. 정확하게 Azure Storage Queue를 사용하여 성공했습니다.

그러나 서비스 패브릭을 사용하여 FabricNotReadableExceptions이 발생하면 서비스가 불안정 해지고 업데이트 할 수 없거나 삭제할 수 없으므로 전체 클러스터를 취소해야합니다. 나는 그것을 업데이트하려고 노력했다. 그리고 18 시간 이후 아직도 붙이게되었다. 그래서 내가하고있는 것에 끔찍한 무엇인가 틀린 무엇인가있다.

메소드 코드 :

public async Task<QueueObject> DeQueueAsync(string queueName) 
     { 
    var q = await StateManager.GetOrAddAsync<IReliableQueue<string>>(queueName); 
     using (var tx = StateManager.CreateTransaction()) 
     { 
      try 
      { 
       var dequeued = await q.TryDequeueAsync(tx); 
       if (dequeued.HasValue) 
       { 
        await tx.CommitAsync(); 
        var result = dequeued.Value; 
        return JSON.Deserialize<QueueObject>(result); 
       } 
       else 
       { 
        return null; 
       } 
      } 
      catch (Exception e) 
      { 
       ServiceEventSource.Current.ServiceMessage(this, $"!!ERROR!!: {e.Message} - Partition: {Partition.PartitionInfo.Id}"); 
       return null; 
      } 
     }} 

이것은 RunAsync

protected override async Task RunAsync(CancellationToken cancellationToken) 
{ 
    while (true) 
    { 
     var message = await DeQueueAsync("MyQueue"); 
     if (message != null) 
     { 
      //process, takes around 500ms 
     } 
     else 
     { 
      Thread.Sleep(5000); 
     } 
    } 
} 

나는 또한 Task.Delay로 (5000)에 Thread.sleep 변경 및 수천을 가졌다입니다 "A 작업이었다 취소됨 "오류가 표시됩니다.

내가 여기에 누락 되었습니까? 주기가 너무 빠르며 SF가 다른 복제본을 제 시간에 업데이트 할 수 없습니까? 하나만 남기고 모든 복제본을 제거해야합니까?

대신 새로운 ConcurrentQueue를 사용해야합니까?

프로덕션 환경에서 문제가 있으며 50 개 또는 1000 개의 파티션이있는 로컬에서는 문제가되지 않습니다.

저는 혼란스럽고 혼란 스럽습니다. 감사합니다.

답변

0

RunAsync 구현에 전달 된 cancellationToken을 기려해야합니다. 서비스 패브릭은 업그레이드를 포함하여 어떤 이유로 든 서비스를 중지하려고 할 때 토큰을 취소하고 토큰을 취소 한 후에 RunAsync가 반환 될 때까지 무기한 대기합니다. 이렇게하면 응용 프로그램을 업그레이드 할 수없는 이유를 설명 할 수 있습니다.

루프 내부에 cancellationToken.IsCancelled을 확인하고 취소되면 철수하는 것이 좋습니다. this question에 대한 대답은 포괄적 인 설명을 가지고 있지만, 테이크 아웃은

당신이 FabricNotReadableException을 다시 시도 할 수 고려할 수 -

FabricNotReadableException는 다양한 이유로 발생할 수 있습니다. 이 메시지가 표시되면 다시 전화를 걸면 결국 NotPrimary 또는 Granted로 해석됩니다.

+0

오, 나는 너에게 맥주를 빚지고있다. 문제의 세계를 일으키는 것은 취소 토큰이었습니다. 감사 –

관련 문제