【问题标题】:RoR Watching for changes in a frequently updated tableRoR 监视频繁更新的表中的变化
【发布时间】:2013-07-29 21:04:07
【问题描述】:

我正在寻找一些关于监控每天大约 250,000 次插入的特定表的建议。规模不大,但发展迅速,我们无法继续保持现状。

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

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

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

位置表的大小也不小,所以我不想每次发生任何事情时都查看数十万行。

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

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

对不起,如果这是主观的或不切实际的,我真的很想有人教我一个很好的方法来做到这一点。

【问题讨论】:

    标签: mysql ruby-on-rails ruby redis


    【解决方案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 有时会检查临时表以确保没有丢失任何记录,如果临时表中还有记录,您仍然可以对其执行操作。

    这涵盖了一切:消耗更少的资源、立即响应以及恢复不可预测的情况。但是实现起来比较困难

    --

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

    【讨论】:

    • 我快速浏览了触发器,但不确定它们是否比在 Rails 中运行 cron 更好。提取数据不够“实时”,但我猜 sys_exec 方法可能有效。我将不得不调查 ruby​​ 脚本开销。例如,每秒运行 rake 会杀死服务器。
    • 在 Redis 中,我们使用了大量的 pub sub 并且仍然需要检查表以防遗漏。你的想法听起来并不复杂。在做出决定之前必须阅读触发器。一直在研究分析日志以获取起伏不定的数据。很像两者的想法......
    • 我喜欢触发器的想法,但我们决定分析日志文件并传递给redis,然后传递给节点......也许倒退,但它从rails服务器上卸载了一堆重量并且mysql。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 2020-03-29
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    相关资源
    最近更新 更多