事实证明,我需要在我的系统中执行一些定期任务,这些任务在 Windows Azure 工作者角色下运行。我想强调的是,它可能是任何平台 Azure、亚马逊、内部解决方案。就通常的系统而言,如何完成任务不是问题,但由于我们在云中,并且我的角色可能有多个实例,因此在某些时候可能会出现问题。
所以这里有几个我能想到的方法:
通常的计时器,它们是同步的,比如通过天蓝色存储,这样就不会多次运行任务。例如,您可以自己实现它或从 Lokad 获取一个。您可以在计时器事件上内联执行任务,也可以将命令发送到队列中。
优点:
- 常用方法,每个人都知道计时器以及如何烹饪它们
- 不需要有状态。实例启动后,计时器也会启动并运行
缺点:
- 在主要部分旁边还有初始化计时器和执行它们的附加逻辑,主要部分仅负责处理来自队列的命令和事件。
一旦我得到启动任务的命令,我就会发送一个命令 StartTask(30 秒)。一旦命令处理程序收到它,它确实需要完成工作,然后以 30 秒的延迟重新抛出相同的命令。
优点:
- 完美契合 CQRS 设计
- 没有与定时器相关的额外逻辑,纯反应器
缺点:
- 打破范式,CQRS 本身从一开始就很难治疗和使用。人们倾向于使用已知技术(通常的计时器),即使它不符合设计(cqrs 方法),结果我们有混乱的融合。
- 另一个破碎的范式。系统重启时是无状态的还是有状态的?我会说状态存储在代理消息传递环境中。您需要做的就是遵循消息处理规则。
我对此的看法:
就个人而言,我确实赞成第二种方法,它的所有缺点都应该转移到 Pros 部分。
问题:
这里的最佳做法是什么?我错过了什么吗?