如何从应用程序架构中删除此单点故障?

mmc*_*ole 5 architecture high-availability

我有一个应用程序,目前有以下设置:

  • 复制的MySQL DB
  • 分布式工作队列
  • 几个工作队列消费者/工人
  • 单个生产者,它将作业添加到队列中(下面的红色服务器)

设置看起来像这样:

工作制片查询对于需要被添加到其经常需要被添加到工作队列每N分钟的工作列表新项目的数据库.这个作业生成器是我整个架构中唯一的节点,如果失败,将导致整个过程失败.我可以让数据库服务器,队列服务器或多个工作服务器发生故障,并且该过程将继续运行.

如何修改作业生成器以使其不是单点故障?我不知道如何分发它所做的工作,即每隔N分钟查询一次数据库,并将要处理的新作业排入队列.这是一项独特的任务.

我考虑过有多个生产者,每个生产者都会使用模数来处理1/P工作,其中P是生产者的数量.

就像是:

itemsToBeProcess = db.FetchItems()
for (item in itemsToBeProcessed) {
    if item.id % producerNumber == 0) // Queue job
}
Run Code Online (Sandbox Code Playgroud)

这会将生产者的工作分成多个服务器.然而,这仍然不是理想的,因为如果单个生产者下降超过1/P值的工作将停止处理.所以,它仍然是部分失败.

任何人都可以提供任何关于我如何使这个工作生产者不是我的应用程序中的单点故障的指导?

Cyp*_*ian 2

每 N 分钟查询一次数据库有什么具体原因吗?我会以一种方式解决这样的问题,而不是 N 分钟,我将查询 N 个项目并使用“选择更新”* 更改项目状态(例如“打开”->“进行中”)(以确保项目正在由一个且只有一个生产者进行处理(检索和更新状态)。因此,您将能够毫无问题地扩展/提供 FO 等。