У меня есть функция, которая извлекает сообщения из подписки и перенаправляет их на конечную точку HTTP. Если конечная точка недоступна, создается исключение. Когда это происходит, я хотел бы отложить следующую попытку этого конкретного сообщения на определенное время, например. 15 минут. На данный момент я нашел следующие решения:
- Поймать исключение, заснуть, а затем бросить. Это ужасное решение, так как с меня будет взиматься плата за использование процессора, пока он спит, и это повлияет на пропускную способность функции.
- Перехватите исключение, клонируйте сообщение, установите свойство
ScheduledEnqueueTimeUtc
и добавьте его обратно в очередь. Это более приятный способ, но он сбрасывает счетчик доставки, поэтому реальная проблема никогда не будет недоставлена, и она повторно отправляется всем подпискам, если только один подписчик не смог ее обработать. - Перехватите исключение и вместо этого поместите сообщение в очередь хранилища. Это означает поддержание очереди хранилища для соответствия каждой подписке и наличие двух функций вместо одной.
В идеале я хотел бы перехватить исключение и выйти из функции, не снимая блокировку сообщения. Таким образом, как только срок действия блокировки истечет, сообщение будет отправлено снова. Однако кажется, что после успешного завершения функция вызывает Complete()
для сообщения, а после создания исключения функция вызывает Abandon()
для сообщения. Можно ли обойти это или добиться задержки каким-то другим способом?