如何在使用CQRS方法构建的系统中运行定期任务?

时间:2013-04-06 08:32:13

标签: azure architecture cloud cqrs cloud-hosting

事实证明,我需要在我的系统中执行一些在Windows Azure辅助角色下运行的定期任务。我想强调它可能是任何平台Azure,亚马逊,内部解决方案。就通常的系统而言,这不是一个如何完成任务的问题,但由于我们在云中并且可能有多个我的角色实例,因此在某些时候可能会出现问题。

所以这里有几种我能想到的方法:

  1. 通过天蓝色存储进行同步的常用计时器,以便不会多次运行任务。您可以自己实现它,或者从Lokad中获取一个。您可以在计时器事件中内联执行任务,也可以将命令发送到队列中。

    优点:

    • 通用方法,每个人都知道计时器以及如何烹饪
    • 无需拥有州。实例启动后,计时器也会启动并运行

    缺点:

    • 还有一个额外的逻辑,即初始化定时器并在主要部分旁边执行它们,主要部分仅负责处理来自队列的命令和事件。

  2. 一旦我得到启动任务的命令,我就发送命令StartTask(30秒)。一旦命令处理程序收到它,就会完成需要完成的工作,然后以30秒的延迟重新抛出相同的命令。

    优点:

    • 完全符合CQRS设计
    • 没有与定时器有关的额外逻辑,纯电抗器

    缺点:

    • 范式破坏,CQRS本身从一开始就很难治疗和使用。人们倾向于使用已知的技术(通常的计时器),即使它不适合设计(cqrs方法),结果我们有混乱的融合。
    • 另一个破碎的范例。系统重启是无状态还是有状态?我想说存储状态是在代理消息传递环境中。您需要做的就是遵循消息处理规则。
  3. 我对此的看法:

    就个人而言,我赞成采用第二种方法,并将其中的所有缺点转移到优点部分。

    问题:

    这里的最佳做法是什么?我错过了什么吗?

4 个答案:

答案 0 :(得分:1)

使用scheduler from Windows Mobile Services或Windows Azure商店Scheduler app from Aditi之类的内容怎么样?它们可用于启动任何事情,您可以让它们向您的系统发送命令。

如果你做了选项1然后是,你必须处理同步,但那里有冗余。如果您执行选项2并且处理命令的实例出现故障,请确保任务不会停止。这取决于你如何设置命令重试。

答案 1 :(得分:1)

如果您使用azure servicebus作为您的经纪人,您可以使用它的延迟消息功能将您的命令发送推迟到需要接收的时间。 http://code.msdn.microsoft.com/windowsazure/Brokered-Messaging-ccc4f879

答案 2 :(得分:1)

我的建议是选择另一个负责执行期间任务的组件。通过这种方式,您可以决定它应该如何表现,并将其与CQRS工作人员分开调整。

如果您希望在Azure中有一个实例处理这两个任务(定期和CQRS),您可以将它们转换为Windows服务并使用您的辅助角色作为安装程序和观察者。我有一个使用my solution here构建的示例。

顺便说一句,如果您使用Lokad.Cqrs,那么如果它与主要组件分开,那么您的第二种方法听起来不错。

答案 3 :(得分:0)

预定的时间流逝是一个事件 - 所以我有一个创建事件的过程,例如" ScheduleElapsedEvent"。然后,您可以实现在必要时创建/分派命令的处理程序。

您可以将事件计划保留在支持某种原子更新的数据存储中。那可能是SQL或NoSQL,就像MongoDB一样。即使使用副本集和分片进行扩展,您仍然可以使用Mongo检查和更新记录。因此,工作流程可以分别检查此计划。