【问题标题】:Scaling up a ruby, activerecord, mysql app扩展 ruby​​、activerecord、mysql 应用程序
【发布时间】:2013-01-08 20:59:42
【问题描述】:

我有一个应用程序...

该应用对金融产品进行市场比较 - 对于给定的报价请求,它会联系其他几个网站以获取报价。然后它会为用户提供结果 - 为他们的详细信息提供几个引号。

为了管理这些请求,它们被保存到 MySQL 中,然后我的应用程序启动,获取待处理的报价并将它们发送到线程(所有相同的 Linux 机器)以处理每个站点查找。

我正在使用 JRuby,因为我遇到了与线程/数据库相关的问题。使用 Java 线程池来控制线程数。使用当前的硬件/VPS - 它可以处理大约 200 个线程。许多限制似乎与每个线程获取自己的 MySQL 连接有关——获取报价细节并保存结果。我们想要处理更多的并发线程,因此正在寻找扩大规模的方法。

想知道该走哪条路......

  1. 更大的硬件...
  2. 更多机器并使用某种排队 机制(具有优先级)在机器之间共享负载 - 所以线程不接触数据库,所有细节/响应都通过 队列 - 所以数据库命中较少,但也许我只是在推动 问题进入队列。考虑使用类似的东西 MongoDB 用于队列,但对建议持开放态度——这很容易 与 Ruby 一起使用 :)
  3. 某种远程/RPC 机制,例如 dRb - 理论上这似乎是一个不错的选择,但没有做任何事情 这还不知道它会使事情变得多么复杂。
  4. 某事 否则...?

从这个链接Reasons for NOT scaling-up vs. -out? - 看来这个问题适合运行更多机器来解决它。

所以,关于走哪条路的任何想法......

干杯, 克里斯

【问题讨论】:

    标签: mysql ruby-on-rails ruby linux rails-activerecord


    【解决方案1】:

    我通常处理此类问题的方法是密切关注您正在进行的数据库查询并积极调整它们。 检索您需要的内容,跳过未明确使用的列,并在急切加载您完全不需要的内容时非常小心。

    您经常会发现,通过添加索引或策略性地对数据库中的某些属性进行反规范化以避免丑陋、耗时的JOIN 操作,可以显着提高速度。

    此外,考虑一下缓存:最快的数据库调用是从未进行过的调用。利用 Memcached 之类的东西来保存适度耗时的记录检索的结果并不难,如果小心操作,如果您通过几种方法引导更新,甚至可以很容易地使其无效和过期。

    对于调度 worker,可以在 Redis 中实现一个简单的先进先出队列,以减轻 MySQL 本身的大量处理开销。如果您遵循示例,这通常很容易添加。

    像 Memcached 这样的缓存可以处理非常大的流量,因此,只要有可能,就针对这个进行缓存,以避免每次都访问您的数据库。

    如果您已经用尽了这些选项,那么是时候增加前端服务器甚至更多的数据库容量了,但只有到那时。

    【讨论】:

    • 谢谢 - 已经进行了一些数据库调优,添加了一些索引,更改了一些范围以选择特定字段。缓存听起来很有趣——因为大部分请求信息都在一张表上,但随后被 7 个线程需要——目前这些线程重新查询数据库......
    • 这就是缓存的用途。保存一次,其他六个可以使用缓存的数据,需要零数据库访问。
    【解决方案2】:

    排队是您最容易实现的事情。使用这样的东西:http://beanstalkd.github.com/beaneater/

    基本上你可以在你的方法前面加上async.,这会将它们放入队列并执行它们。他们排队,工作人员可以是同一台服务器或不同的服务器。

    【讨论】:

    • 谢谢,确实在 beanstalk 上看到了一些东西 - 将进一步研究。
    猜你喜欢
    • 2011-09-11
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2016-11-01
    • 1970-01-01
    相关资源
    最近更新 更多