首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ToDo列表上使用并行处理时防止重复

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

Stack Overflow用户
提问于 2013-09-02 19:02:32
回答 1查看 442关注 0票数 0

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

在每小时结束时,我想找到所有的待办事项没有标记为完整,并发送提醒给他们的个人创造者。

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

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

这种设想所面临的问题是:

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

有什么模式可以解决或避免这种并发问题?让多个角色首先扫描相同的表,以获得运行多个角色所提供的保护吗?

EN

回答 1

Stack Overflow用户

发布于 2013-09-02 19:17:14

您可以查看Master/Slave模式。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18579365

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档