我有一个包含数百万条记录的 MySQL 数据库表,如下所示:
item_id processing_time
1 01:30:00
2 16:50:00
3 23:24:00
processing_time 列表示每天应处理记录的时间。
有一个计划好的 cron 作业(使用 quartz 库)每五分钟运行一次并处理表中的记录。每次作业运行时,它都会查询接下来五分钟内具有processing_times 的记录并处理它们。
目前,此作业仅在单个服务器上运行,工作负载分布在多个线程上。由于需要处理的记录数量较多,除了线程之外,我还希望将作业分发到多个服务器上。
我的问题是如何在多个服务器之间分配作业并确保每条记录仅由单个服务器处理。
我想到的第一个解决方案是为item表中的每条记录分配一个处理节点(1-n),并将这种关系存储在另一个表中。例如。架构可能如下所示:
item_id processing_node
1 1
2 2
3 3
...
每次创建新项目时,都会在 item_processing_node 表中插入一条相应的记录。由于处理时间不是均匀分布的,因此还需要某种算法来确保具有相同处理时间的项目在处理节点之间均匀分布。
我能想到的第二个解决方案是使用排队架构。一个节点(主节点)查询要处理的项目并将其插入队列。然后所有节点从队列中读取项目。
对这两种解决方案有什么想法以及哪一个是首选?
最佳答案
您绝对在寻找排队架构,当您拥有分布式处理系统时,它是一种标准模式,特别是因为它是批处理模式。
关于mysql - 关系数据库中记录的分布式处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58636286/