【问题标题】:Azure table storage - Distributed lockingAzure 表存储 - 分布式锁定
【发布时间】:2017-03-28 03:16:00
【问题描述】:

我将事件数据存储在表存储中。有多个工作角色实例需要访问它。每个工作角色实例都需要访问该表中的唯一行并对该数据进行一些处理,如果成功,则需要将该数据标记为已完成,以便任何其他实例都不会拾取它。在处理时,此行需要对其他工作人员不可见,以便他们也不会处理此行。

有没有设计可以解决这个问题?

【问题讨论】:

  • 不清楚您要完成什么。您提到了 Azure 服务总线以及 Azure 表。您能否更新您的问题并提供更多详细信息?
  • 添加了更多上下文

标签: azure azure-sql-database azure-storage azureservicebus


【解决方案1】:

因此,Azure Tables 没有锁定机制。它适用于 blob 和队列。

解决此问题的一种可能方法是使用Master/Slave Pattern。因此,让我们假设您有 5 个工作人员角色实例正在运行。定期(比如每 30 秒),所有这些实例都将尝试获取 blob 上的租约。只有一个实例能够成功,并且该实例将成为主实例(所有其他实例将成为从属实例)。

现在,master 要做的是从表中获取数据(比如 5 条记录)并将它们作为单独的消息插入到队列中。一旦主人这样做,它就会自动成为奴隶。 slaves 会做的是从队列中获取一条消息(通过使消息出队以便其他实例看不到该消息),处理它,然后更新表中的记录。一旦奴隶完成了它的工作,它会回到睡眠状态,然后在预定的时间后醒来。

更多详情请查看Competing Consumer Patterns

【讨论】:

    【解决方案2】:

    使用 Azure 队列和生产者消费者模式,将工作单元作为消息写入生产者端的队列,让您的工作角色使用队列中的工作并进行处理。队列将在处理消息时处理使该消息不可见以避免重复,然后每个工作角色可以在成功处理后将消息从队列中删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-17
      • 2011-02-17
      相关资源
      最近更新 更多