在待办事项列表上使用并行处理时防止重复

时间:2013-09-02 19:02:33

标签: multithreading azure parallel-processing azure-sql-database azure-worker-roles

例如,我有一个待办事项列表,表示为具有“IsComplete”字段的数据库中的行。

在每个小时结束时,我想找到所有未标记为完整的待办事项,并向其各个创作者发送提醒。

每小时创建数百万个待办事项,发送提醒是一个昂贵的过程。

我有一个工作人员角色,每个小时都会愉快地运行以获得这些不完整的待办事项,并将每个角色添加到服务总线队列中,由一组独立的工作人员角色接收,这些角色处理发送的昂贵任务。提醒。

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

  1. 如果单个工作人员可能会失败,导致没有任何待办事项 添加到队列中进行处理。
  2. 运行辅助角色的多个实例将导致重复,因为每个实例彼此竞争以将待办事项添加到该代码。
  3. 即使队列拒绝这些重复项,每个实例也会多次查询数据库的相同数据,即使这些待办事项已经处理并添加到提醒队列中。
  4. 即使工作者角色扫描数据库以查看待办事项是否已创建提醒,再次,如果他们碰巧同时检查,则可能有多个角色认为待办事项需要提醒。
  5. 扫描数据库中的待办事项也很昂贵,因为有太多,工作者角色不能在它们之间分配这个工作量。
  6. 哪些模式可以解决或避免这种并发问题?是否有多个角色扫描相同的表格,以便首先运行多个角色提供保护?

1 个答案:

答案 0 :(得分:0)

您可以查看Master/Slave模式。

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

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