Как непрерывные веб-задания Azure могут быть идемпотентными и отправлять электронную почту?
После прочтения в Интернете тонны информации о веб-заданиях Azure в документации говорится, что работа должна быть идемпотентной, с другой стороны, в блогах говорится, что они используют веб-задания для выполнения таких действий, как "оплата клиента", "отправка электронной почты".
В этой документации говорится, что выполнение непрерывного WebJob для нескольких экземпляров с очередью может привести к вызову более одного раза. Действительно ли люди игнорируют тот факт, что они могут дважды выставить счет своему клиенту или дважды отправить электронное письмо?
Как убедиться, что я могу запустить WebJob с очередью в масштабируемом веб-приложении, а сообщения обрабатываются только один раз?
1 ответ
Я делаю это, используя базу данных, запрос на обновление с блокировкой строки и объект TransactionScope.
В таблице "Заказ" создайте столбец для управления состоянием действия, которое вы выполняете в своей WebJob. т.е. EmailSent.
В функции QueueTrigger начинайте транзакцию, затем выполняйте запрос UPDATE для заказа клиента с установленным ROWLOCK, который устанавливает EmailSent = 1 с WHERE EmailSent = 0. Если возвращаемое значение из SqlCommand = 0, тогда выйдите из функции. Другой WebJob уже отправил письмо. В противном случае отправьте электронное письмо и вызовите Complete() для объекта TransactionScope, если отправлено успешно.
Это должно обеспечить идемпотентность, которую вы хотите.
Надеюсь, это поможет.