Architecture 将Azure存储表用作具有多个工作角色的队列来处理它?

Architecture 将Azure存储表用作具有多个工作角色的队列来处理它?,architecture,azure,azure-storage,Architecture,Azure,Azure Storage,我的应用程序将通过Web角色的多个实例每秒接收1000多个请求/事务。这些角色将为多个存储表中的每个事务写入一条记录(随机,以分散Azure的500个事务/秒限制)。现在,我需要一种可靠的方法来使用多个工作者角色处理/聚合这些数据,并将结果写入我的SQL数据库。AKA,这需要水平缩放 我需要在存储表的后期处理中保留/归档所有事务,这样我就可以拥有一组用于队列的表,当它们被处理时,将它们移动到归档表中,或者可能有一种方法可以在单个表上执行,但不确定 对于在这些队列中跨我的工作角色分配当前工作负载的

我的应用程序将通过Web角色的多个实例每秒接收1000多个请求/事务。这些角色将为多个存储表中的每个事务写入一条记录(随机,以分散Azure的500个事务/秒限制)。现在,我需要一种可靠的方法来使用多个工作者角色处理/聚合这些数据,并将结果写入我的SQL数据库。AKA,这需要水平缩放

我需要在存储表的后期处理中保留/归档所有事务,这样我就可以拥有一组用于队列的表,当它们被处理时,将它们移动到归档表中,或者可能有一种方法可以在单个表上执行,但不确定

对于在这些队列中跨我的工作角色分配当前工作负载的机制,您有什么建议?显然,每个角色都必须知道其他角色在做什么,因此它们只处理无人认领的事务。我认为每个角色将作为一个工作负载从队列中检索1000条记录,并且多个工作者角色可以在同一个队列上工作

我是否应该将工作者角色“状态”保存在缓存中,可能是在SQL server中


非常感谢您的建议。

我建议您使用适当的队列服务来实现此功能,而不是尝试通过表服务实现排队。这样,您就不必实现复杂的逻辑来知道已经处理了哪些记录(当考虑容错和可能的错误时,逻辑变得困难),特别是在具有非常有限事务能力的表存储之类的服务中。尝试可靠地协调多个工作人员,考虑所有可能的故障场景,同时具有可伸缩性,这是我在应用程序级别不会尝试的

例如:

  • web角色接收表示事务的请求
  • web角色将数据写入多个表
  • web角色向队列服务发送一条消息,表示具有某个唯一ID(例如,如果没有其他合适的主键,则为请求ID)的事务
  • 工作者角色从队列中提取消息
  • 对于每条消息,工作者角色从与消息的唯一标识符相对应的表存储中检索对象集
  • 工作者角色根据需要聚合数据并将其写入SQL数据库
  • 注:

  • 使用队列服务(从存储)或服务总线队列
  • 将负载分散在多个队列中以实现可伸缩性
  • 确保在所有级别上进行适当处理,以应对瞬时故障
  • 处理多次处理同一消息的可能性(处理应该是幂等的)

  • 我同意费尔南多的观点。请看一看这个话题,;它与Azure队列的大规模处理有关。这是基于我所做的一个项目,其吞吐量要求比您发布的项目更高。

    我也同意费尔南多的观点。队列服务API中的GetMessages方法允许在单个事务中取消指定数量的消息队列。如果去排队逻辑实现正确,您可能不必担心处理是幂等的,但是它会使您的解决方案更加健壮。

    < P>您可能想在CQRS上松散地考虑下面的方法。< /P> web角色验证事务并将其写入一个或多个队列。(如果遇到队列限制,可能需要以随机或循环方式写入多个队列。) 请注意,队列只是将web角色与工作者角色分离的管道,消息的格式实际上并不重要。我将尝试将事务建模为一个对象,并序列化它以获取队列消息。如果转换太大,无法作为队列消息写入,则可以写入表或blob存储,并在队列消息中引用该资源

    工作人员角色,轮询一个或多个队列(随机或以循环方式)并处理事务,根据需要写入SQL和/或表存储

    该体系结构的rational允许独立扩展web和工作者角色,并减少它们之间的依赖性。web角色只需要知道如何验证和序列化事务,而不需要知道如何持久化或处理事务


    为了提高工作者角色端的吞吐量,可以并行提取和处理消息。Azure队列保证一次只能由一个客户端检索一条消息(除非可见性超时)。您可以支持幂等性,方法是假设消息可以在较早时部分或完全处理。

    感谢您的输入Fernando!因此,如果我使用Azure存储队列(多个队列)并拥有一个工人角色场,一个接一个地检索项目,假设每次运行时我希望从队列中至少获取1000个项目,这不是有点慢吗。另外,如果我有多个工作者角色,我如何解释这个场景中的幂等处理?我认为Fernando的观点是,您将从队列中获取一条消息,然后从表存储中检索1000个相关项,因此从队列中获取消息将非常快,因为这只是一个小请求和对表存储的一个请求(如果这样写比较有效,那么将所有相关项存储在一个blob中也可能是一种选择)。幂等是指能够处理相同的数据两次,但仍能得到相同的结果。这对您的影响将取决于您所做的努力achieve@enlightenedOne,knightpfhor的评论是正确的。我的意思是,您可以存储一条代表整个“事务”的消息或者可能需要处理许多记录的命令。同样,为了提高效率,您可以