gpt4 book ai didi

mysql - 如何在不终止数据库的情况下使用 Gearman 进行文件处理?

转载 作者:搜寻专家 更新时间:2023-10-30 20:30:58 25 4
gpt4 key购买 nike

我目前正在设计一个处理上传文件的系统。

文件通过 LAMP 网络前端上传,必须经过多个阶段处理,其中一些阶段是顺序的,其他阶段可能并行运行。

几个要点:

  • 上传文件的客户端只关心安全地传送文件而不关心处理结果,因此它可以完全异步。
  • 文件大小不超过 50kb
  • 系统必须扩展到每天处理超过一百万个文件
  • 重要的是没有文件会丢失或未经处理
  • 我假设是 MySQL,但如果 NoSQL 有优势,我对它没有意见。

我最初的想法是让前端将文件直接放入 MySQL 数据库,然后让许多工作进程在完成每个步骤时轮询数据库设置标志。经过一些粗略的计算后,我意识到这不会扩展,因为工作人员轮询会开始导致上传表上出现锁定问题。

经过一些研究,Gearman 似乎可以解决问题。工作人员可以在 Gearman 服务器上注册,并且可以在不破坏数据库的情况下轮询作业。

我目前比较纠结的是如何最高效的调度作业。我可以通过三种方式执行此操作:

  • 编写一个调度程序来轮询数据库,然后将作业发送给 Gearman
  • 让上传过程在收到文件时触发异步 Gearman 作业
  • 使用 Gearman MySQL UDF 扩展使数据库在插入文件时触发作业

第一种方法仍然会对数据库造成一定的影响,但它可以轻松地从故障中恢复。后两种方法似乎需要启用 Gearman 队列持久性才能从故障中恢复,但我担心如果我启用它,我将失去吸引我使用 Gearman 的原始速度并将数据库瓶颈转移到下游。

如果您能就这些方法中哪一种最有效(或者更好的真实示例)提出任何建议,我们将不胜感激。

如果您认为我以错误的方式处理整件事,也请随时提出意见。

最佳答案

这已经开放了一段时间,所以我想我会提供一些关于我采用的方法的信息。

每次为"dispatch"工作人员上传文件时,我都会创建一个 gearman 作业,该工作人员了解每个文件所需的处理步骤顺序。调度程序为每个处理步骤排队 gearman 作业。

任何完成的作业都会将完成时间戳写回数据库并调用调度程序,调度程序随后可以将任何后续任务排队。

为每个作业完成写入时间戳意味着系统可以在处理丢失或失败时恢复其队列,而无需承受持久队列的负担。

关于mysql - 如何在不终止数据库的情况下使用 Gearman 进行文件处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7891037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com