Мы используем следующую настройку:
Мы используем функцию Azure с триггером очереди для обработки очереди сообщений JSON.
Каждое из этих сообщений просто пересылается в конечную точку API через HTTP POST для дальнейшей обработки.
API может возвращать 3 возможных кода состояния HTTP; 200 (ОК), 400 (неверный запрос), 500 (внутренняя ошибка сервера).
Если API возвращает 200, сообщение было обработано правильно и все в порядке. Кажется, что функция триггера очереди автоматически удаляет сообщение из очереди, и нас это устраивает.
Если API возвращает 400, у API есть логика, которая берет сообщение и добавляет его в таблицу со статусом, указывающим, что оно было искажено или по другим причинам не могло быть обработано. Поэтому нас устраивает автоматическое удаление сообщения из очереди, и функция Azure может нормально завершиться.
Если API возвращает 500, мы гарантируем, что функция повторяет отправку сообщения в API, пока код состояния не станет 200 или 400 (потому что, вероятно, проблема с API, и мы не хотим потерять сообщения). Для этого мы используем Polly. У нас он настроен так, что он, по сути, будет продолжать повторять попытки вечно при экспоненциальной отсрочке.
Однако недавно мы столкнулись с этой проблемой:
Есть определенные ситуации, когда API возвращает 500 для определенных сообщений. Эта ошибка носит временный характер и будет появляться и исчезать непредсказуемо. Повторная попытка с использованием Polly будет прекрасна, за исключением того, что не все сообщения вызывают эту ошибку, и, по сути, «плохие» сообщения блокируют обработку «хороших» сообщений.
Скажем, у меня в очереди 50 сообщений. Первые 32 сообщения в начале очереди являются «плохими» и иногда возвращают 500 из API. Эти сообщения собираются функцией Azure и обрабатываются одновременно. Остальные 18 сообщений являются «хорошими» и вернут 200. Эти «хорошие» сообщения не будут обработаны, пока «плохие» сообщения не будут успешно обработаны. По сути, плохие создают пробки для хороших.
Мое решение состояло в том, чтобы попытаться отменить выполнение функции Azure, если текущее сообщение было повторено определенное количество раз. Я думал, что, возможно, через некоторое время сообщение станет видимым, но за это время оно дает хорошим сообщениям время для обработки. Однако я понятия не имею, как отменить выполнение функции, не вызывая полного удаления сообщения очереди или помещения в опасную очередь.
Могу ли я добиться этого с помощью функции триггера очереди? Могу ли я сделать это, используя вместо этого триггер таймера?
Спасибо большое!