【问题标题】:How continuous Azure Web Jobs can be idempotent and send email?Azure Web Jobs 的连续性如何才能实现幂等性和发送电子邮件?
【发布时间】:2015-06-21 01:55:15
【问题描述】:

在网上阅读了大量关于 Azure WebJobs 的信息后,文档说工作应该是幂等的,另一方面,博客说他们使用 WebJobs 来执行诸如“向客户收费”、“发送电子邮件”等操作”。

This documentation 表示在具有队列的多个实例上运行连续 WebJob 可能会导致多次调用。人们真的会忽略他们可以向客户收取两次费用或发送两次电子邮件的事实吗?

如何确保我可以在扩展的 Web 应用程序上运行带有队列的 WebJob,并且消息只处理一次?

【问题讨论】:

    标签: email azure azure-webjobs idempotent


    【解决方案1】:

    我使用数据库、带有行锁和 TransactionScope 对象的更新查询来执行此操作。

    在您的 Order 表中,创建一个列来管理您在 WebJob 中执行的操作的状态。即电子邮件发送。

    在 QueueTrigger 函数中开始一个事务,然后对设置了 ROWLOCK 的客户订单执行 UPDATE 查询,即设置 EmailSent = 1 和 WHERE EmailSent = 0。如果来自 SqlCommand 的返回值 = 0 则退出该函数。另一个 WebJob 已发送电子邮件。否则,如果发送成功,则发送电子邮件并在 TransactionScope 对象上调用 Complete()。

    这应该提供你想要的幂等性。

    希望对您有所帮助。

    【讨论】:

    • 我认为这是我最后的解决方案。但是,如何管理故障?如果其中一台服务器完成且没有失败并且没有发送电子邮件,那么另一台服务器没有完成并且有错误,那么这里将如何管理故障?会重新触发吗?去毒?或完全忽略错误?我觉得这是微软的一个半成品功能。锁应该在 SDK 级别实现。
    • 我知道这是一个老问题,但您还可以在该表中添加一个时间戳,以便在它被锁定时进行记录,因此如果该时间戳超过 X 分钟,则假设它失败并清除它允许下一条消息处理它。你是对的,这并没有在 SDK 中完全实现,但这不是 SDK 本身可以处理的,因为每种情况都不同。我的意思是,如果您没有 SQL Server 数据库怎么办?你显然必须有一个不同的解决方案。 SDK如何知道幂等性的范围是什么?同样,这会根据具体情况而变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-03
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多