gpt4 book ai didi

mysql - RoR 监视经常更新的表中的更改

转载 作者:IT王子 更新时间:2023-10-29 06:15:44 28 4
gpt4 key购买 nike

我正在寻找有关监控每天大约有 250,000 次插入的特定表的建议。规模不大,但增长迅速,我们不能像现在这样继续工作。

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

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

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

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

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

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

抱歉,如果这是主观的或离题的,我真的很希望有人能教我一个美味的方法来做到这一点。

最佳答案

将监控转移到MySQL呢?

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

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

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

编辑

你必须仔细计划。推送可能看起来很有吸引力,因为它可以节省资源并且操作是即时的,但是 MySQL 触发器将“一劳永逸”。那么,如果 sys_exec() 无法到达您的 Rail 脚本怎么办? (系统崩溃,无论如何),因此您的 Rails 应用程序可能无法接收并且永远不会看到记录。

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

选择权在您,取决于您的要求。

此外,如果您喜欢复杂的解决方案,或者只是需要同时保证数据安全和立即采取行动,您可以混合使用这两种解决方案:

  1. 触发器将记录的ID保存在临时表中,并通过sys_exec()调用你的脚本。
  2. 通过 sys_exec 调用,Rails 执行所需的操作,并从临时表中删除相应的记录,因为操作已完成,我们不再需要它了。
  3. 偶尔,Rails 会检查临时表以确保没有遗漏任何记录,如果临时表中还有记录,您仍然可以对其执行操作。

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

--

注意:我使用“临时表”这个术语,但我在 SQL 词汇中的意思不是像内存表之类的“临时”,最好有一个真正的基于磁盘的表来防止系统崩溃.

关于mysql - RoR 监视经常更新的表中的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17934792/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com