在阅读了大量关于 Azure WebJobs 的网络信息后,文档说工作应该是幂等的,另一方面,博客说他们使用 WebJobs 来执行诸如“向客户收费”、“发送电子邮件”等操作。
该文档说,在具有队列的多个实例上运行连续的 WebJob 可能会导致多次调用。人们真的忽略了他们可以向客户收取两次费用或发送两次电子邮件的事实吗?
如何确保可以在扩展的 Web 应用程序上运行带有队列的 WebJob,并且消息只处理一次?
在阅读了大量关于 Azure WebJobs 的网络信息后,文档说工作应该是幂等的,另一方面,博客说他们使用 WebJobs 来执行诸如“向客户收费”、“发送电子邮件”等操作。
该文档说,在具有队列的多个实例上运行连续的 WebJob 可能会导致多次调用。人们真的忽略了他们可以向客户收取两次费用或发送两次电子邮件的事实吗?
如何确保可以在扩展的 Web 应用程序上运行带有队列的 WebJob,并且消息只处理一次?
我使用数据库、带有行锁和 TransactionScope 对象的更新查询来执行此操作。
在您的 Order 表中,创建一个列来管理您在 WebJob 中执行的操作的状态。即电子邮件发送。
在 QueueTrigger 函数中开始一个事务,然后对设置了 ROWLOCK 的客户订单执行 UPDATE 查询,即设置 EmailSent = 1 和 WHERE EmailSent = 0。如果来自 SqlCommand 的返回值 = 0 则退出该函数。另一个 WebJob 已发送电子邮件。否则,如果发送成功,则发送电子邮件并在 TransactionScope 对象上调用 Complete()。
那应该提供您想要的幂等性。
希望有帮助。