0

我们有一个即将到来的项目,我们需要通过各种传输方式与第 3 方集成以从他们那里获取数据。

WCF Endpoints & Web API Rest Endpoints 之类的东西很好。

然而,在 2 个场景中,我们需要从 pop3 帐户中提取包含 xml 的自动生成的电子邮件,或者从外部 SFTP 帐户中提取 xml 文件。

我现在将开始对这些进行原型设计,但我想知道在多实例工作者角色环境中是否有关于如何处理这些非事务性系统的标准实践、模式或指南。IE

如果 2 个工作人员同时连接到 pop 帐户或同时连接到同一个 FTP,会发生什么情况。

如果 1 个工作人员从 FTP 删除文件,而另一个工作人员正在下载,会发生什么情况。

控制重复应该不是问题,因为我们会将应用程序端的所有内容记录到数据库中,并且所有内容都应该是唯一可识别的,因此我们将能够添加 if-not-exists-create-else-skip 逻辑工人,但我只是想知道我还应该考虑其他什么来使其更具弹性/幂等性。

4

2 回答 2

1

看看最近发布的云设计模式。您也许可以找到所需的相应模式和示例代码。

于 2014-02-07T10:32:26.310 回答
1

只是大声思考,因为数据主要是文件和电子邮件,您可以做的一个可能的事情是,您可以做的第一件事是将它们保存在 blob 存储中,而不是通过您的工作角色直接处理它们。所以会有一些工作角色实例会定期轮询 POP3 服务器/SFTP 站点并从那里提取数据并将它们推送到 blob 存储中。写入 blob 时,同一个实例也可以从源中删除数据。使用这种方法,您不必担心重复记录,因为 blob 将被覆盖(假设每个消息/文件都有一个唯一标识符,并且 blob 的名称就是该标识符)。

一旦文件在您的 blob 存储中,您可以在 Windows Azure 队列中写入一条消息,其中包含有关此 blob 的详细信息(可能是 blob URL 等)。然后使用 Windows Azure 队列的“获取”语义,您的工作角色实例开始获取和处理这些消息。由于Get语义的原因,一旦从队列中获取消息,其他调用者(在这种情况下为工作角色实例)就看不到它了。这样您就可以处理重复的消息处理。

更新

So I'm trying to combat against two competing instances pulling the same file at the same moment from the SFTP

为此,我会推销我最喜欢的Master/Slave Concept:)。本质上,这个想法是每个实例都将尝试获取单个 blob 的租约。获得租约的实例成为主人,其他人成为奴隶。Master 会从 SFTP 获取数据,而 slave 会等待。我在我的博客文章中描述了这个概念,你可以在这里阅读:http: //gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/,尽管上下文的博客有些不同。

于 2014-02-07T12:24:21.970 回答