我正在寻找一些关于监控特定表的建议,该表每天可以获得大约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。
很抱歉,如果这是主观的或不合适的话,我真的很想有人教我一个美味的方法来做这件事。
答案 0 :(得分:1)
将监控转移到MySQL怎么样?
您可以使用在正在监视的表的UPDATE和INSERT上运行的TRIGGER。此触发器将执行验证,如果满足条件,则可以:(多种可能性)
sys_exec()
来调用执行所需操作的ruby / rails脚本。请注意,无论哪种方式,您都可能陷入在触发器执行之后和Rails应用程序执行之前修改了记录的情况,因此您应该让Rails应用程序同时验证所收到的记录是否满足所有条件
修改强>
你必须仔细计划。推送可能看起来很有吸引力,因为它可以节省资源并立即采取行动,但MySQL触发器将“射击并忘记”。那么如果以某种方式sys_exec()无法访问您的Rail脚本怎么办? (系统崩溃,无论如何),因此您的Rails应用程序可能无法接收和看不到记录。
Pull更安全,因为相关记录的ID保存在临时表中,如果附加了某些内容,Rails仍然可以在以后找到它们。但行动延迟了几秒钟(这并不总是可接受的情况),而且资源更加耗费。
选择是你的,取决于你的要求。
此外,如果您喜欢复杂的解决方案,或者只是您需要同时获得数据安全性和即时操作,您可以实现两种解决方案的混合:
这涵盖了一切:消耗更少的资源,立即响应,并恢复不可预测的情况。但实施起来比较困难
-
注意:我使用的是“临时表”术语,但我并不是说像SQL词汇表中的“临时”,如内存表左右,最好有一个真正的基于磁盘的表来保护它免受系统崩溃