0

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

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

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

我有一个工作人员角色,它会很高兴地每小时运行一次以获取这些不完整的待办事项,并将每个人添加到服务总线队列中,以便由一组单独的工作人员角色拾取,这些工作人员角色处理发送提醒的昂贵任务。

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

  1. 如果单个工作人员可能失败,则不会将待办事项添加到队列中进行处理。
  2. 运行工作者角色的多个实例将导致重复,因为每个实例相互竞争以将待办事项添加到队列中。
  3. 即使队列拒绝了这些重复,数据库也会被每个实例多次查询相同的数据,即使这些待办事项已被处理并添加到提醒队列中。
  4. 即使工作人员角色扫描数据库以查看待办事项是否已创建提醒,同样,如果他们碰巧同时检查,则可能有多个角色认为待办事项需要提醒。
  5. 扫描数据库以查找 todos 也很昂贵,因为有很多工作角色无法在它们之间分配这些工作负载。

有哪些模式可以解决或避免这种并发问题?让多个角色扫描同一张表是否会降低首先运行多个角色所提供的保护?

4

1 回答 1

0

你可以看看Master/Slave模式。

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

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

于 2013-09-02T19:17:14.060 回答