1

我有一个作为 Azure Web 角色托管的 ASP.NET MVC 4 应用程序。我想做一些看起来应该很标准的事情:我想创建一个我可以调用的函数,它启动 VIP 交换并在 VIP 交换操作完成时引发和事件(或调用回调)。

只是为这种情况添加一些背景信息:我的网站实施了一个大约需要一个小时(或更短时间)才能完成的工作流程。如果我要发布一个新版本的网站代码,可以先让所有当前用户完成工作流程,这样新代码就不需要处理由以前版本的代码创建的数据。因此,我网站中的管理功能首先会在数据库中插入一个值,以禁用新的工作流程;然后它会等到所有当前的工作流程都完成;然后它会调用“VIP交换”例程;最后,当 VIP 交换例程发出完成信号时,它将戳数据库值以重新启用新的工作流程。

我在这里找到了有关如何以编程方式启动 VIP 交换的 Microsoft 文档:http: //msdn.microsoft.com/en-us/library/ee460814.aspx

该过程涉及到 POST 到魔术 URL 并在 POST 中包含一些标头,然后定期执行对魔术 URL 的 GET 并检查响应代码。

我想得越多,它似乎就越不平凡。除了连接后台计时器和完成通知的基本复杂性之外,我不知道如果有的话,我可能会在 IIS 环境中尝试做这些事情。我什至可以在后台线程上执行 HTTP 操作吗?就此而言,我是否会因为尝试使用 .NET 中包含的六种左右不同的“在后台做事”机制中的任何一种而遇到麻烦?

任何帮助或指导将不胜感激。特别是,如果有人能指出这个功能的现成实现,我会欣喜若狂!

4

1 回答 1

0

我认为你不会找到一个简单的解决方案,因为结构控制器设置为在没有你参与的情况下做一些非常花哨的事情。在云计算环境中运行长达一小时的工作流程,可以从您下方拉出一个实例(从调用 OnStopping 事件开始最多 5 分钟进行清理)要求您做其他工作以确保你所有的任务都完成了。

一个简单的问题是“如果实例在工作流仍在运行时出现故障,你会怎么做?” 您是重新启动它们还是丢失了它们?如果它们迷路了,那么您无论如何都不会在意,因此终止升级的工作流程同样不重要。如果您重新启动它们,则使用相同的机制来决定节点是否应该关闭,并相应地分配作业。这种模式与Hadoop JobTracker非常相似。不要只在任何 'ol 实例上运行工作流。将它们提交给决定做什么的(工作跟踪器)服务。然后,(作业跟踪器)服务可以使用服务管理 API 来扩展您需要运行所需版本的任意数量的实例,在适当的节点上运行工作流,并在不再需要或过时时关闭它们。

不幸的是,这可能不是您正在寻找的简单解决方案,但您的架构中的某些内容需要更改,而不是试图强制 PaaS 适应您当前的方法。分解您的工作负载、创建松散耦合的服务、针对故障进行设计,以及需要考虑的其他一些云/分布式计算实践。Hadoop 以这种方式构建是有原因的——它以能够在一堆有点不可靠的商品硬件上完成工作而闻名。

于 2013-03-26T22:09:27.517 回答