Повторить попытку задержки приложения функции Azure для служебной шины Azure - PullRequest
0 голосов
/ 01 мая 2019

Сначала позвольте мне объяснить, что у меня есть.У меня есть служебная шина Azure с приложением Azure Function.Служебная шина настроена на использование фильтров SQL для вставки сообщений определенных типов в определенные темы.Затем с помощью моего приложения-функции Azure они получат самое новое сообщение и затем обработают его.

Базовый пример

1: я отправляю запрос на мой EmailAPI

2: EmailAPIзатем отправка нового сообщения в служебную шину с типом «Электронная почта»

3: Фильтр SQL затем видит тип «Электронная почта» и помещается в тему электронной почты в Bux * 1009 службы

4: Функция EmailListener Azure отслеживает служебную шину и замечает новое сообщение

5: Соберите сообщение служебной шины и обработайте его (в основном просто отправьте электронное письмо, используя предоставленную информацию)

Теперь, скажем, по какой-то причине соединение с SMTP-сервером немного разорвано, и иногда мы получаем исключение TimeOutException при попытке отправить электронное письмо (EmailListener).Что происходит сейчас, когда выдается исключение, приложение FunctionL EmailListener попытается отправить его снова мгновенно, без ожидания, оно просто попытается отправить его снова.Он будет делать это в общей сложности 10 раз, а затем информирует служебную шину о том, чтобы поместить сообщение в очередь недоставленных сообщений.

Я пытаюсь сделать, когда выдается исключение (например, TimeOutException),мы ждем X количество времени, прежде чем пытаться обработать то же сообщение снова.Я просмотрел много разных постов, рассказывающих о host.json и пытающихся установить эти настройки, но они не сработали.Я нашел решение, однако решение требует, чтобы вы создали клон сообщения и поместили его обратно в служебную шину и дали ему задержанное время обработки.Я бы предпочел не реализовывать собственную систему ручной задержки, если приложение Azure Service Bus / Function может самостоятельно справляться с повторными попытками.

Самая большая проблема, с которой я сталкиваюсь (что, вероятно, зависит от моего понимания), заключается в том, кто находится ввина?Это параметры служебной шины для обработки политики повторных попыток или приложение-функция Azure для попытки повторной попытки после X раз.

Я предоставил некоторый код, но мне кажется, что код на самом деле не работаетчтобы помочь объяснить мой вопрос.

// Pseudo code
public static class EmailListenerTrigger
{
    [FunctionName("EmailListenerTrigger")]
    public static void Run([ServiceBusTrigger("messages", "email", Connection = "ConnectionString")]string mySbMsg, TraceWriter log)
    {
           var emailLauncher = new EmailLauncher("SmtpAddress", "SmtpPort", "FromAddress");
           try
           {
               emailLauncher.SendServiceBusMessage(mySbMsg);
           }
           catch(Exception ex)
           {
               log.Info($"Audit Log: {mySbMsg}, Excpetion: {ex.message}");
           }
    }
}

ссылка первая: https://blog.kloud.com.au/2017/05/22/message-retry-patterns-in-azure-functions/ (Thread.Sleep не кажется хорошей идеей)

ссылка две: https://github.com/Azure/azure-functions-host/issues/2192 (повторная попытка вручную)

ссылка три: https://www.feval.ca/posts/function-queue-retry/ (похоже, это относится к очередям, когда я использую темы)

ссылка четыре: Может ли AzureСлужебная шина задерживается перед повторной попыткой сообщения? (говорит об отложении сообщения, но затем вам нужно вручную вернуть его обратно в очередь / тему.)

1 Ответ

2 голосов
/ 01 мая 2019

Возможно, вам удастся решить вашу проблему с помощью Durable Functions. Например, есть встроенный метод CallActivityWithRetryAsync(), который может повторить попытку, когда функции действий выдают исключение.

https://docs.microsoft.com/en-us/sandbox/functions-recipes/durable-diagnostics#calling-activity-functions-with-retry

Ваш поток, вероятно, будет выглядеть примерно так:

  1. Функция служебной шины сработала. Этот запускает функцию оркестратора

  2. Оркестратор вызывает функцию вашей активности (используя вышеупомянутый метод)

  3. Отправка вашей электронной почты реализована в функции Activity и может выдавать исключения по мере необходимости
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...