1

我有一个应用程序...

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

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

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

想知道走哪条路...

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

从此链接不扩大规模与扩大规模的原因?- 看起来这个问题适合运行更多的机器来解决它。

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

干杯,克里斯

4

2 回答 2

2

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

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

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

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

像 Memcached 这样的缓存可以处理非常大的流量,因此只要有可能,就缓存它,以避免每件事情都影响到您的数据库。

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

于 2013-01-08T21:08:14.900 回答
1

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

基本上,您可以预先添加async.将它们放入队列并执行它们的方法。他们排队,工作人员可以是同一台服务器或不同的服务器。

于 2013-01-08T21:15:39.827 回答