我目前正在设计一个处理上传文件的系统。
这些文件通过 LAMP Web 前端上传,并且必须通过几个阶段进行处理,其中一些是顺序的,另一些可能并行运行。
几个关键点:
- 上传文件的客户端只关心安全交付文件而不是处理结果,因此它可以是完全异步的。
- 文件大小最大为 50kb
- 系统必须扩展到每天处理超过一百万个文件
- 确保没有文件丢失或未处理,这一点至关重要
- 我的假设是 MySQL,但如果 NoSQL 可以提供优势,我对 NoSQL 没有意见。
我最初的想法是让前端将文件直接放入 MySQL 数据库中,然后让许多工作进程在完成每个步骤时轮询数据库设置标志。经过一些粗略的计算,我意识到这不会扩展,因为工人轮询会开始导致上传表上的锁定问题。
经过一些研究,看起来 Gearman 可能是解决问题的方法。工作人员可以在 Gearman 服务器上注册,并且可以在不破坏数据库的情况下轮询工作。
我目前困惑的是如何以最有效的方式分配工作。我可以看到三种方法来做到这一点:
- 编写一个调度程序来轮询数据库,然后将作业发送给 Gearman
- 让上传过程在收到文件时触发异步 Gearman 作业
- 插入文件时,使用 Gearman MySQL UDF 扩展使数据库启动作业
第一种方法仍然会在某种程度上打击数据库,但它可以从失败中轻松恢复。后两种方法似乎需要启用 Gearman 队列持久性以从故障中恢复,但我担心如果启用此功能,我将失去吸引我使用 Gearman 的原始速度并将 DB 瓶颈转移到下游。
任何关于这些方法中哪种方法最有效(甚至更好的现实世界示例)的建议将不胜感激。
如果您认为我以错误的方式处理整个事情,也可以随时参与。