【发布时间】:2023-05-03 06:32:01
【问题描述】:
长话短说,我的工具对我的 MySQL 数据库服务器的冲击太大,我遇到了很多问题。因此,我创建了一组工具(PHP 和 Ruby),它们使用 Beanstalk 将我想要在 DB 上完成的操作传达给一组始终运行的 DB 连接。 Beanstalk 管用于传入作业和回复。
但是,我已将 ExpireTime 添加到我的数据库请求的作业数据中。本质上,如果 DB 请求作业没有在相当短的时间窗口内执行,则根本不会执行请求。无论如何,请求任务都会自行超时,因此有一个较短的时间窗口可以防止 DB 执行脚本执行一堆永远不会使用的 DB 请求。
只要一切都在一台机器上,这一切都可以正常工作。现在我将它扩展到第二台机器,我立即遇到了请求被视为已过期的问题。
任务的当前到期时间是 10 秒 - 对于我试图完成的简单数据库请求来说,这已经相当长了。如果我将 10 秒增加到足够大的数字,那么 DB 请求会快速执行且不会出现问题。
所以我怀疑这个问题归结为 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 队列作为一种 DB 连接池以及一个任务队列,用于在分布式中执行项目/站点相关任务方式。对于 PHP,我使用 pheanstalk,对于 Ruby,我使用 beankstalk-client gem。
我考虑过的一个技巧是创建一个豆茎管,其中执行数据库请求的计算机大约每秒输出一次它的当前时间。然后,将请求放入队列的分布式计算机将需要获取该作业(并释放它 - 而不是删除它)以获得最新的时间戳。这是粗略的并且(我相信)会导致冲突 - 即请求等待获取当前时间的作业数据 - 因为我增加了我添加到此的计算机数量。
我希望这个论坛上的某个人有更好的方法。
【问题讨论】:
-
仅供参考:我实施了我的 hack。到目前为止看起来不错。唯一真正的问题是我必须通过与第二个 beanstalk 的第二个连接来实现它。我还没有时间对其进行全面测试,但到目前为止它工作得很好。
标签: ubuntu time beanstalkd