Веб-задания Azure инициализируются случайным образом

У нас есть веб-задания, состоящие из нескольких методов в одном файле Functions.cs. У них есть триггеры служебной шины по теме / очередям. Следовательно, продолжайте слушать тему / очередь для BroredMessage. Как только сообщение приходит, у нас есть логика обработки, которая делает много вещей. Но иногда мы обнаруживаем, что все веб-вакансии внезапно переинициализируются. Я нашел несколько статей на веб-сайте, в которых говорится, что веб-задания инициализируются, и это обычно.

Но не уверен, что это единственный способ, и можем ли мы предотвратить его повторную инициализацию, когда мы вызываем BroredMessage.Complete, как только мы получаем BroredMessage, поскольку мы не хотим, чтобы оно продолжало обрабатываться снова и снова?

Кроме того, у нас есть несколько веб-заданий в одной службе приложений и несколько веб-заданий в другой службе приложений. И мы обнаруживаем, что все веб-задания из обеих служб приложений повторно инициализируются одновременно. Не уверен, почему?




Ответы (1)


Вы должны спроектировать свой процесс так, чтобы иметь возможность справляться со случайными отключениями и сбоями, поскольку это «функция» или приложения, живущие в облаке.

Используйте транзакцию для управления критической областью вашего кода.

Псевдо / закомментированный код ниже и ссылка на документация Microsoft находится здесь.

var msg = receiver.Receive();

using (scope = new TransactionScope())
{
    // Do whatever work is required
    // Starting with computation and business logic.

    // Finishing with any persistence or new message generation, 
    // giving your application the best change of success. 
    // Keep in mind that all BrokeredMessage operations are enrolled in 
    // the transaction. They will all succeed or fail. 
    // If you have multiple data stores to update, you can use brokered messages 
    // to send new individual messages to do the operation on each store,
    // giving eventual consistency. 

    msg.Complete(); // mark the message as done 
    scope.Complete(); // declare the transaction done
} 
person Murray Foxcroft    schedule 05.01.2018
comment
Наша логика включает в себя множество вызовов API и обработку огромных файлов в виде полезной нагрузки, которая занимает много времени, иногда 1-2 часа. Что произойдет в случае повторной инициализации веб-задания, если мы воспользуемся указанной выше моделью на основе транзакций? Будет ли сообщение отправлено повторно или оно не будет инициализировано до завершения транзакции? Кроме того, если у нас есть msg.complete в конце, сообщение будет повторяться снова и снова через определенный интервал без полной обработки первого сообщения? - person Vicky; 06.01.2018
comment
Несколько повторных попыток должны привести к возникновению очереди недоставленных сообщений для ручного исправления. Шаблон, который вам нужно искать, - это конечная согласованность, координирующая ряд длительно выполняемых заданий, чтобы все они достигли окончательного согласованного состояния в какой-то момент в будущем. Логика обработки файлов также должна быть идемпотентной, поскольку она не может участвовать в транзакции. - person Murray Foxcroft; 06.01.2018