azure - 用于非事务集成任务的 Azure 辅助角色的多个实例

标签 azure architecture transactions azure-worker-roles idempotent

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

诸如 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/

相关文章:

apache-spark - Kappa 架构 : when insert to batch/analytic serving layer happens

java - hibernate 未知服务异常 :Unknown service requested as transaction completed

java - 只有一个事务数据源的 Spring @Transactional 行为

azure - Windows Azure 中的 SQL 筛选器问题

sql-server - 将文件上传到 Azure Blob 存储时触发 SSIS 包

database - 为事件流设计简单的数据库

java - 我可以在 Gradle 中创建 2 级模块结构吗?

java - 使用 JTA 和 JPA EntityManager 关闭自动事务启动

azure - 使用 Azure AD B2C 用户流(或自定义策略)进行 SAFE Stack 身份验证 - 有人解决了这个问题吗?

c# - 在 C# WPF 桌面应用程序中将 MSAL 与身份验证上下文结合使用