例如,我有一个待办事项列表,它表示为数据库中带有“IsComplete”字段的行。
在每个小时结束时,我想找到所有未标记为完成的待办事项,并向其各自的创建者发送提醒。
每小时创建数百万个待办事项,发送提醒是一个昂贵的过程。
我有一个工作人员角色,它会很高兴地每小时运行一次以获取这些不完整的待办事项,并将每个人添加到服务总线队列中,以便由一组单独的工作人员角色拾取,这些工作人员角色处理发送提醒的昂贵任务。
在这种情况下面临的问题是:
- 如果单个工作人员可能失败,则不会将待办事项添加到队列中进行处理。
- 运行工作者角色的多个实例将导致重复,因为每个实例相互竞争以将待办事项添加到队列中。
- 即使队列拒绝了这些重复,数据库也会被每个实例多次查询相同的数据,即使这些待办事项已被处理并添加到提醒队列中。
- 即使工作人员角色扫描数据库以查看待办事项是否已创建提醒,同样,如果他们碰巧同时检查,则可能有多个角色认为待办事项需要提醒。
- 扫描数据库以查找 todos 也很昂贵,因为有很多工作角色无法在它们之间分配这些工作负载。
有哪些模式可以解决或避免这种并发问题?让多个角色扫描同一张表是否会降低首先运行多个角色所提供的保护?