Multithreading 在ToDo列表上使用并行处理时防止重复

Multithreading 在ToDo列表上使用并行处理时防止重复,multithreading,azure,parallel-processing,azure-sql-database,azure-worker-roles,Multithreading,Azure,Parallel Processing,Azure Sql Database,Azure Worker Roles,例如,我有一个todo列表,表示为数据库中带有“IsComplete”字段的行 在每小时结束时,我希望找到所有未标记为完成的待办事项,并向其各自的创建者发送提醒 每小时有数以百万计的待办事项,发送提醒是一个昂贵的过程 我有一个单独的工作者角色,它将愉快地每小时运行一次,以获取这些不完整的TODO,并将每个角色添加到服务总线队列中,由一组单独的工作者角色负责处理发送提醒的昂贵任务 这种情况下面临的问题是: 如果单个工作进程可能失败,导致没有TODO 已添加到队列以进行处理 运行worker角色的多

例如,我有一个todo列表,表示为数据库中带有“IsComplete”字段的行

在每小时结束时,我希望找到所有未标记为完成的待办事项,并向其各自的创建者发送提醒

每小时有数以百万计的待办事项,发送提醒是一个昂贵的过程

我有一个单独的工作者角色,它将愉快地每小时运行一次,以获取这些不完整的TODO,并将每个角色添加到服务总线队列中,由一组单独的工作者角色负责处理发送提醒的昂贵任务

这种情况下面临的问题是:

  • 如果单个工作进程可能失败,导致没有TODO 已添加到队列以进行处理
  • 运行worker角色的多个实例将导致重复,因为每个实例相互竞争以将TODO添加到que中
  • 即使队列拒绝这些重复项,每个实例也会多次查询数据库中的相同数据,即使这些TODO已被处理并添加到提醒中
  • 即使工作人员角色扫描数据库以查看todo是否创建了提醒,如果他们碰巧同时检查,也可能有多个角色认为todo需要提醒
  • 扫描数据库中的TODO也很昂贵,因为TODO太多了,工作者角色无法在他们之间分配工作负载

  • 有哪些模式可以解决或避免这种并发问题?让多个角色扫描同一个表是否是一开始就运行多个角色所提供的保护的退步?

    您可以查看主/从模式

    假设您有
    x
    个工作人员角色。在每小时开始时,来自
    x
    worker角色的一个worker角色将成为master。这可以通过获得blob的租约来实现。所有实例都将尝试获取同一blob上的租约,只有一个实例将成功。成功的将被指定为
    Master

    现在,
    Master
    可以从数据库中获取数据并将消息推送到队列中。所有
    Slave
    实例将轮询此队列,当消息开始到达队列时,Slave实例将
    获取一条或多条消息并对其进行处理。如果一个实例无法处理该消息,它将在一段时间后(可见性超时)重新出现在队列中,以便其他实例现在可以获取该消息并处理它