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 개의 파티션이있는 로컬에서는 문제가되지 않습니다.
저는 혼란스럽고 혼란 스럽습니다. 감사합니다.
오, 나는 너에게 맥주를 빚지고있다. 문제의 세계를 일으키는 것은 취소 토큰이었습니다. 감사 –