我们即将开展一个项目,需要通过各种传输方式与第三方集成以从他们那里获取数据。
诸如 WCF 端点和 Web API Rest 端点之类的东西都很好。
但是,在两种情况下,我们需要从 pop3 帐户获取包含 xml 的自动生成的电子邮件,或者从外部 SFTP 帐户提取 xml 文件。
我现在就要开始制作这些原型(prototype),但我想知道是否有关于如何在多实例 worker 角色环境中处理这些非事务性系统的标准实践、模式或指南。即
如果 2 个工作人员同时连接到 pop 帐户或同时连接到同一个 FTP,会发生什么情况。
如果一名工作人员从 FTP 删除文件,而另一名工作人员正在下载中,会发生什么情况。
控制重复不应该是一个问题,因为我们将应用程序端的所有内容记录到数据库中,并且所有内容都应该是唯一可识别的,因此我们将能够添加 if-not-exists-create-else-跳过工作人员的逻辑,但我只是想知道我是否应该考虑其他任何事情以使其更具弹性/幂等。
最佳答案
只是大声思考,因为数据主要是文件和电子邮件,您可以做的一件事是,您要做的第一件事就是将它们保存在 Blob 存储中,而不是通过您的辅助角色直接处理它们。因此,会有一些辅助角色实例定期轮询 POP3 服务器/SFTP 站点并从那里提取数据并将其推送到 Blob 存储中。当写入 blob 时,同一实例也可以从源中删除数据。使用这种方法,您不必担心重复记录,因为 blob 将被覆盖(假设每个消息/文件都有一个唯一的标识符,并且 blob 的名称就是该标识符)。
文件进入 Blob 存储后,您可以在 Windows Azure 队列中写入一条消息,其中包含有关此 Blob 的详细信息(可能是 Blob URL 等)。然后,使用 Windows Azure 队列的“获取”语义,您的辅助角色实例开始获取并处理这些消息。由于 Get
语义,一旦从队列中获取消息,其他调用者(在本例中为工作角色实例)就变得不可见。这样您就可以处理重复的消息。
更新
因此,我正在尝试阻止两个竞争实例同时从 SFTP 拉取同一文件
为此,我将介绍我最喜欢的主/从概念
:)。本质上,这个想法是每个实例都会尝试获取单个 blob 的租约。获得租约的实例成为主实例,其他实例成为从实例。主站将从 SFTP 获取数据,而从站则等待。我在我的博客文章中描述了这个概念,您可以在这里阅读:http://gauravmantri.com/2013/01/23/building-a-simple-task-scheduler-in-windows-azure/ ,尽管博客的上下文有些不同。
关于azure - 用于非事务集成任务的 Azure 辅助角色的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21623318/