长话短说,我的工具对我的 MySQL 数据库服务器的打击太大了,我遇到了很多问题。因此,我创建了一组工具(PHP 和 Ruby),它们使用 Beanstalk 将我想要在 DB 上完成的工作传达给一组始终运行的 DB 连接。Beanstalk 管用于传入作业和回复。
但是,我已将 ExpireTime 添加到我的数据库请求的作业数据中。本质上,如果 DB 请求作业没有在相当短的时间窗口内执行,则根本不会执行请求。无论如何,请求任务都会自行超时,因此有一个较短的时间窗口可以防止 DB 执行脚本执行一堆永远不会使用的 DB 请求。
只要一切都在一台机器上,这一切都很好。现在我将它扩展到第二台机器,我立即遇到了请求被视为已过期的问题。
任务的当前到期时间是 10 秒——对于我试图完成的简单数据库请求来说,这已经相当长了。如果我将 10 秒增加到足够大的数字,那么数据库请求会快速执行并且不会出现问题。
所以我怀疑这个问题归结为一台计算机认为它是 12:00:XX 而另一台认为它是 12:00:YY 并且 XX 和 YY 之间的差异至少是 8 或 9 秒。
我在局域网中使用 Ubuntu 12.04 桌面和服务器。我用 Ruby (1.8.7) 和 PHP (5.3.10-1ubuntu3.4) 编写程序,使用这个 Beanstalk 队列作为一种 DB 连接池以及一个任务队列,用于在分布式中执行项目/站点相关任务方式。对于 PHP,我使用 pheanstalk,对于 Ruby,我使用 beankstalk-client gem。
我考虑过的一个技巧是创建一个豆茎管,执行数据库请求的计算机大约每秒一次输出它的当前时间。然后,将请求放入队列的分布式计算机将需要获取该作业(并释放它 - 而不是删除它)以获得最新的时间戳。这是粗略的并且(我相信)会导致冲突——即请求等待获取当前时间的作业数据——因为我增加了我添加到此的计算机数量。
我希望这个论坛上的某个人有更好的方法来做到这一点。