Итак, сценарий заключается в том, что я использую очередь SB, чтобы отключить исходящие обратные вызовы другим службам. Одна из стандартных проблем с обращением к другим службам заключается в том, что они могут быть недоступны для неконтролируемого количества времени. Предполагая, что я обнаруживаю, что цель отключена/не отвечает, каков наилучший шаблон для отказа от этого сообщения, чтобы он не появлялся сразу в очереди?
Вот некоторые подходы, о которых я либо знаю, пробовали или рассматриваю:
-
Очевидно, что если я просто использую
BrokeredMessage::Abandon(), сообщение будет разблокировано и помещено обратно в очередь. Это явно нежелательно для этого сценария и того, чего я пытаюсь избежать. -
Если я просто проигнорирую тот факт, что я столкнулся с ошибкой и никогда не вызываю Abandon, это не позволит ему немедленно появиться, но я действительно не обладаю тонким контролем над тем, как долго это будет отображаться снова и Я хотел бы реализовать разлагающуюся стратегию повтора.
-
Я подумал, может быть, я мог бы назвать
BrokeredMessage::Abandon(IDictionary<string, object>)и каким-то образом обновить свойствоScheduledEnqueueTimeUTC, но я пробовал это, и, похоже, не существует способа повлиять на это свойство за пределы начальной отправки сообщения, Имеет смысл, но мысль стоит попробовать. -
Я рассмотрел только использование
BrokeredMessage::Complete()в этой ситуации и фактически просто присвоил новую копию сообщения с помощью набора свойствScheduledEqueueTimeUTC.
Конечная пуля почти кажется слишком тяжелой, но я прихожу к выводу, что это, вероятно, правильный ответ, учитывая присущую природе очередей. Я просто подумал, что может быть более приятный способ сделать это в очередях Azure SB, которые мне не хватает.