RoR监视频繁更新的表中的更改

时间:2013-07-29 21:44:43

标签: mysql ruby-on-rails ruby redis

我正在寻找一些关于监控特定表的建议,该表每天可以获得大约250,000个插入。虽然不是很大,但它正在快速增长,我们无法像现在这样继续工作。

主应用程序依赖于RoR4和MySQL数据库。数据从多个radius服务器直接流入数据库。

我们需要监视特定值的特定列,然后执行简单的查找:

if column == xxx
  venue = Venue.find_by(bar: foo)
  if venue.is_monitored?
    do some other shizzle
  end
end

位置表也不是一个微不足道的大小,所以每次发生事情时我都不想查看数十万行。

有人可以帮助推荐一种快速有效的方法吗?目前检查每个插入在Rails中看起来很荒谬。我们还尝试每60秒在后台处理这项工作,但这似乎过时了。

到目前为止,最好的解决方案是监视插入的值,将其发布到Redis并使用节点服务器来监听事件。然后把它推回Rails。

很抱歉,如果这是主观的或不合适的话,我真的很想有人教我一个美味的方法来做这件事。

1 个答案:

答案 0 :(得分:1)

将监控转移到MySQL怎么样?

您可以使用在正在监视的表的UPDATE和INSERT上运行的TRIGGER。此触发器将执行验证,如果满足条件,则可以:(多种可能性)

  • 拉取方式:将更新/创建的记录的ID插入临时表中,然后偶尔您的Rails应用程序可以从此临时表中获取ID,清空它,然后执行所需的操作那些具体的记录。
  • 推送方式:触发器使用MySQL的sys_exec()来调用执行所需操作的ruby / rails脚本。

请注意,无论哪种方式,您都可能陷入在触发器执行之后和Rails应用程序执行之前修改了记录的情况,因此您应该让Rails应用程序同时验证所收到的记录是否满足所有条件

修改

你必须仔细计划。推送可能看起来很有吸引力,因为它可以节省资源并立即采取行动,但MySQL触发器将“射击并忘记”。那么如果以某种方式sys_exec()无法访问您的Rail脚本怎么办? (系统崩溃,无论如何),因此您的Rails应用程序可能无法接收和看不到记录。

Pull更安全,因为相关记录的ID保存在临时表中,如果附加了某些内容,Rails仍然可以在以后找到它们。但行动延迟了几秒钟(这并不总是可接受的情况),而且资源更加耗费。

选择是你的,取决于你的要求。

此外,如果您喜欢复杂的解决方案,或者只是您需要同时获得数据安全性和即时操作,您可以实现两种解决方案的混合:

  1. 触发器在临时表中保存记录的ID,并通过sys_exec()调用脚本。
  2. 通过sys_exec调用,Rails执行所需的操作,并从临时表中删除相应的记录,因为操作已完成,我们不再需要它了。
  3. 有一段时间,Rails会检查临时表以确保没有错过任何记录,如果临时表中还有记录,您仍然可以对其执行操作。
  4. 这涵盖了一切:消耗更少的资源,立即响应,并恢复不可预测的情况。但实施起来比较困难

    -

    注意:我使用的是“临时表”术语,但我并不是说像SQL词汇表中的“临时”,如内存表左右,最好有一个真正的基于磁盘的表来保护它免受系统崩溃