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