2

我有一个 Windows 服务,它侦听Azure 服务总线队列消息,以便从我的 WebApi 应用程序分发处理。我还需要处理重复性任务(每晚/每周),我认为最好使用相同的系统来处理这些任务。

例如,假设我有一个“CleanupDb”队列,每天午夜删除陈旧的数据库节点:

var client = QueueClient.Create("CleanupDb");
var options = /* ... */

client.OnMessage((message) => {
    client.Send(new BrokeredMessage() {
        ScheduledEnqueueTimeUtc = DateTime.Today.AddDays(1)
    });

    // do DB Cleanup
}, options)

理论上这应该可行,但我觉得我错过了一种更明显的处理方式。有没有更好的办法?

4

1 回答 1

1

是的,这会起作用,但我不推荐这种方法,比如每天触发一次。我看到的问题是:

  • 即使您提供了一个相当健康的退避策略,这仍然可能是花费事务或保持与几乎总是空的队列的连接。我认为这是对资源的浪费。
  • 如果托管此服务的任何内容出现故障,那么您的操作将不会被处理。
  • 可能会发生异常,这意味着处理的消息没有放在第二天的队列中。

Thiago 在上面的评论中提到了运行 Azure WebJob 作为选项,我同意这一点。它可以被调度并且在需要之前不使用任何其他资源。另一种选择,特别是如果您还没有托管 Azure 网站,正在查看 Azure 自动化,它对于每天的计划应该可以正常工作(只需了解长时间运行的任务可能会被暂停,因此作为 Azure WebJob 可能会更好地工作) .

于 2015-02-14T03:14:42.420 回答