我有一个应用程序,目前有以下设置:
设置看起来像这样:
作业生产者在数据库中查询需要添加到每N分钟需要添加到工作队列的定期作业列表中的新项目。这个作业生成器是我整个架构中唯一的节点,如果失败,将导致整个过程失败。我可以让数据库服务器,队列服务器或多个工作服务器发生故障,并且该过程将继续运行。
如何修改作业生产者,使其不是单点故障?我不知道如何分发它所做的工作,即每隔N分钟查询一次数据库并将要处理的新作业排入队列。这是一项单一的任务。
我考虑过有多个生产者,每个生产者都会使用模数来处理1 / P工作,其中P是生产者的数量。
类似的东西:
itemsToBeProcess = db.FetchItems()
for (item in itemsToBeProcessed) {
if item.id % producerNumber == 0) // Queue job
}
这会将生产者的工作分成多个服务器。然而,这仍然不是理想的,因为如果单个生产者下降超过1 / P值的工作将停止处理。所以,它仍然是部分失败。
任何人都可以就如何使这个工作生产者在我的申请中成为单点失败提供任何指导吗?
答案 0 :(得分:2)
有没有具体的理由每N分钟查询一次数据库?我会用一种方式来解决这个问题,而不是N分钟我会查询N个项目并使用“select for update”*来改变项目状态(例如“打开” - >“正在进行中”)确定一个项目正在处理(检索并更新状态)由一个且只有一个生产者)。多亏了你,你可以毫无问题地扩展/提供FO等。