2014-01-09 2 views
2

하늘 대기열 저장소를 사용하여 전자 메일을 보내고 있습니다. 전자 메일은 큐 저장소에 저장되고 큐는 한 번에 20 개의 전자 메일을 보냅니다.Azure 대기열 저장소에서 대기열 메시지를 보내지 않음

//Checks for messages inn the queue 
foreach (CloudQueueMessage msgin sendEmailQueue.GetMessages(20, TimeSpan.FromSeconds(50))) 
    { 
     ProcessQueueMessage(msg); 

    } 

오전 데 문제는 이메일 (즉 잘못된 암호) 잘못된 SMTP 세부 사항을 가진 큐에 추가 될 때 보낼 실패하고 큐에 다른 메시지를 방지로, 메시지가 큐에 남아 있다는 것입니다 보내기. 내가 시도

private void ProcessQueueMessage(CloudQueueMessage msg) 
{ 
    try 
    { 
    //We try to send an email 
    SendEmail(emailRowInMessageTable, htmlMessageBodyRef, textMessageBodyRef); 

    } catch (SmtpException e) 
    { 
    string err = e.Message; 

    //When an error occurs we check to see if the message failed to send certain no. of  
     times 
    if (msg.DequeueCount > 10) 
    { 
     //We delete the message from queue 
     sendEmailQueue.DeleteMessage(msg); 

     return; 
    } else 
    { 
     //delete from top of queue 
     sendEmailQueue.DeleteMessage(msg); 

     //insert into end of queue 
     sendEmailQueue.AddMessage(msg); 

     return; 
    } 
    } 
} 

이 솔루션은 오류가 발생했을 경우 큐에서 메시지를 삭제하고 발송되는 올바른 이메일의 결과로 큐의 끝에 다시 을 추가했다. 그러나 메시지를 삭제하고 큐에 다시 넣으므로 메시지를 대기열에 영구히 저장하지 않기 위해 dequeue 속성을 사용하고 있으므로 이상이 아닌 dequeue 속성이 재설정됩니다.

이 상황에서 가장 좋은 해결책은 무엇입니까?

답변

1

메시지를 삭제하고 추가 할 필요는 없습니다. 메시지의 visibility timeout 마침표 (귀하의 경우에는 50 초)가 만료되면 대기열에 자동으로 다시 나타납니다. 이렇게하면 같은 메시지가 대기열에서 제외되고 다시 대기열에 포함되기 때문에 DequeueCount 논리가 작동합니다.

Windows Azure 대기열은 최선 노력의 FIFO이므로 ... 반드시 필요한 것은 아니며 메시지가 추가 된 시간을 기준으로 선택됩니다. 당신은 몇 가지를 할 수 :

  • 는 재시도 횟수를 줄입니다 (현재는 10을 가지고, 당신은 5로 줄일 수 있습니다) 또는 실제 예외
  • 확인합니다. 잘못된 자격증 명으로 인해 프로세스가 실패하면 다음에 다음 번에 실패합니다. 그 메시지를 다시 시도 할 필요는 없습니다. 나중에 해당 메시지를 검사 할 수 있도록 해당 메시지를 포이즌 큐로 이동할 수 있습니다.
+0

첫 번째 30 개의 메시지가 대기열 (즉, 잘못된 비밀번호)을 차단하고 있다면 처음 30 개의 메시지가 항상 대기열에 있으므로 다음 20 개의 올바른 메시지는 전송되지 않습니다. 그래서 처음 20 개의 메시지를 지우고 큐 끝에 추가하여 20 개의 올바른 메시지를 보낼 수 있습니다. – Kaladin

+0

내 대답이 업데이트되었습니다. HTH. –

+0

잘못된 전자 메일 ID 등의 잘못된 메시지를 이미 확인하고이를 포이즌 큐로 이동합니다. 올바르지 않은 암호는 예제 일 뿐이 었으며 SMTP 서버가 다운 된 경우를 생각하고있었습니다. 우리 솔루션에 대해 좀 더 자세히 설명하겠습니다. 여러 개의 SMTP 서버가 있으며 메시지를 처리하기 위해 두 개의 큐를 사용하기로 결정했습니다. 첫 번째 메시지는 5 번 시도하고 실패하면 두 번째 큐로 이동합니다. 첫 번째 대기열은 매분마다 메시지를 시도하고 두 번째 대기열은 60 분마다 메시지를 시도합니다. – Kaladin