Повторный запуск функции Azure с заброшенными сообщениями служебной шины

У меня есть тема служебной шины, в которую отправлено 400 000 сообщений из функции Azure. У меня есть вторая функция Azure, которая получает сообщения в качестве триггера. Когда вторая функция была запущена, она успешно обработала 98% сообщений. У меня осталось примерно 8000 сообщений, которые не удалось. Либо из-за исключения, либо из моего кода сообщение было оставлено. У меня сейчас 8000 сообщений, находящихся в подписчике темы, и я не могу заставить функцию повторить попытку обработки.

Первоначально подписчик был настроен так, чтобы разрешить только 1 доставку сообщения. Я сделал это таким образом, потому что во время отладки я видел, как одно и то же сообщение обрабатывалось несколько раз. Я не был уверен, было ли это побочным эффектом отладки в Visual Studio локально, или сообщения будут отправляться в функцию несколько раз. Я предполагаю, что это то, что привело к тому, что в этих сообщениях функция не запускалась повторно после того, как они были заброшены (если это даже поддерживается?).

Я изменил счетчик доставки подписчикам на 5, надеясь, что он повторно доставит сообщение функции. Это не так. Что мне нужно сделать сейчас, чтобы получить оставшиеся 8000 сообщений для повторного запуска второй функции?

В худшем случае я могу удалить подписку, воссоздать подписку и снова запустить первую функцию, которая должна просто опубликовать данные, связанные с исходными отсутствующими 8000 сообщений (у меня есть логика для обработки недостающих данных в 1-й функции). Это приведет к повторному срабатыванию второй функции. Я хотел бы выяснить, как с этим справиться, когда в подписке есть такие потерянные сообщения, поскольку я испытаю это, когда продвинусь в производство. Я хочу, чтобы это было автоматизировано, и мне не приходилось заниматься очисткой вручную и повторным запуском процесса во второй раз.

Следующее показывает, что в теме не осталось сообщений, но они все еще существуют в подписке. введите здесь описание изображения

Я написал функции в C # Functions 1.0 на полной платформе.


person Johnathon Sullinger    schedule 04.04.2018    source источник
comment
вы можете получать сообщения из мертвой или опасной очереди.   -  person Thomas    schedule 04.04.2018
comment
Значит, я не могу снова запустить функцию Azure, запускаемую исходной служебной шиной? Мне нужно написать служебное приложение, чтобы получать эти сообщения?   -  person Johnathon Sullinger    schedule 04.04.2018
comment
Можете ли вы увидеть эти сообщения в очереди недействительных писем или в очереди подозрительных сообщений на своей панели управления лазурным сервером? если да, вы можете получить их   -  person Thomas    schedule 04.04.2018
comment
Нет, количество сообщений для всего в теме равно 0. В подписке 8000 сообщений, но тема пуста.   -  person Johnathon Sullinger    schedule 04.04.2018
comment
Я обновил свой OP скриншотом темы для справки.   -  person Johnathon Sullinger    schedule 04.04.2018
comment
Да, сообщения доступны внутри подписки. Тема принимает сообщения. вам нужно думать о подписке как о подпункте темы. Взгляните на это сообщение SO, чтобы получить доступ к очереди недействительных писем stackoverflow.com/questions/22681954/   -  person Thomas    schedule 04.04.2018
comment
Бла, так что мне придется написать совершенно отдельный инструмент, чтобы получать эти сообщения и как-то интегрировать его в мой конвейер выполнения? Очень жаль, что у меня нет возможности принудительно повторно доставить эти сообщения в функцию Azure.   -  person Johnathon Sullinger    schedule 04.04.2018
comment
Позвольте нам продолжить это обсуждение в чате.   -  person Thomas    schedule 04.04.2018


Ответы (1)


Если MaxDeliveryCount достигнут, сообщение будет отправлено в очередь недоставленных сообщений.
Вы можете рассматривать подписку как под-очередь, чтобы у вас все еще был доступ к этим сообщениям.

Проверьте этот пост о том, как получить доступ к очередям недоставленных сообщений:

Во-первых, ваш сценарий будет заключаться в увеличении MaxDeliveryCount.

Затем вы можете создать функцию, которая будет запускаться каждый раз, когда сообщение поступает в очередь недоставленных писем / подписку:

 [FunctionName("my-subscription-failure")]
 public static async Task RunFailure(
        [ServiceBusTrigger("%MytopicName%", "%MySubscription%/$DeadLetterQueue", Connection = "MyconnectionString")] BrokeredMessage message,
        [ServiceBus( "%MytopicName%", AccessRights.Send, Connection = "MyconnectionString")] ICollector<BrokeredMessage> queueBinding,
        TraceWriter log, ExecutionContext context)
{
    // fist check if the message can be resent (it could be a message that can't be replay)
    ...

    // If ok, resent the message
    queueBinding.Add(message);
}
person Thomas    schedule 04.04.2018