代码之家  ›  专栏  ›  技术社区  ›  Greg

rails metal(和rack)是实现高流量web服务api的好方法吗?

  •  5
  • Greg  · 技术社区  · 14 年前

    我正在开发一个非常典型的web应用程序。用户体验的主要组件是一个小部件,站点所有者将在其首页上安装它。每次加载它们的首页时,小部件都会与我们的服务器对话,并显示返回的一些数据。

    所以这个web应用程序有两个组件:

    1. 站点所有者用于配置其小部件的前端ui
    2. 响应小部件的web api调用的后端组件

    以前我们都是用php运行的。现在我们正在试验rails,这对于1(前端ui)来说是非常棒的。问题是如何高效地进行小部件信息的后台服务。显然,这比前端的负载要高得多,因为每次在我们客户的网站上加载首页时都会调用它。

    我可以看到两种明显的方法:

    a. 并行堆栈 :建立一个并行堆栈,它使用rails以外的东西(例如,我们以前基于php的方法),但是访问与前端相同的数据库

    B. 钢轨金属 :使用rails metal/rack绕过rails路由机制,但将api调用响应程序保留在rails应用程序中

    我的主要问题是:

    1. 对于这样的事情,铁轨/金属是一种合理的方法吗?

    而且。。。

    1. 装载铁路环境的开销是否仍然太大?
    2. 有没有一种方法可以更接近金属轨道,绕过大部分的环境?
    3. rails/metal的性能是否会接近直接php上类似任务的性能(只是在这里寻找ballpark)?

    还有…

    1. 有没有比A和B都好得多的C选项?也就是说,在将c代码编译成二进制并安装为nginx或apache模块之前要做些什么?

    提前感谢您的任何见解。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Toby Hede    14 年前

    如果我确定了遇到任何性能问题的确切原因,我只会开始将功能拉到机架/金属上。特别是在最近的rails(特别是3)和ruby版本中,栈本身很少成为瓶颈。开始测量,获得一些真正的指标并明智地优化。

    我的经验法则是:如果你没有度量标准,你就不能理智地思考你的性能问题和任何可能的解决方案。

    根据我的经验,问题几乎总是:视图和数据库。

    正如Ryan所建议的,缓存可以非常有效…您甚至可以移动您的架构,在您的rails请求堆栈前面使用反向代理来提供更多的功能。像缓存一样的清漆提供了难以置信的高性能。rails内置了对etag和http报头的支持,以促进反向代理解决方案。

    另一件事是查看数据库层本身。缓存在这里可以走很长一段路,但是一些优化在这里可能也很有用。确保使用active record:include-sensibly是避免n+1查询情况的一个很好的步骤,但是rails中有非常好的支持,可以在很少或根本没有配置的情况下将memcached放入堆栈中,这可以提供出色的性能增益。

        2
  •  3
  •   Ryan Bigg Andrés Bonilla    14 年前

    不是最详尽的答案,但是:

    我不会使用metal,而是使用页面缓存。这样,请求将由web服务器提供服务,而根本没有动态语言。创建资源时清除相应的 index 页。一个非常基本的例子是:

    class PostsController < ApplicationController
      caches_page :index
    
      def index
        @posts = Post.all
        respond_to do |format|
          format.html
          format.xml
        end
      end
    
      def create
        @post = Post.new(params[:post])
        respond_to do |format|
          if @post.save
            expire_page :action => :index
            format.html { redirect_to posts_path }
            format.xml
          else
            format.html { render :action => "new" }
          end
        end
      end
    end
    

    有关详细信息,请阅读 the Caching Guide .

        3
  •  2
  •   yfeldblum    14 年前

    php在每个请求上加载整个环境。在生产模式下,当服务器启动时,rails会加载整个环境一次。在正常的控制器操作调用过程中,肯定会执行大量的ruby代码。但是,在生产模式下,这些代码都与加载环境无关。使用rails metal而不是通常的rails控制器堆栈可以删除许多层,从而为每个请求节省额外的毫秒时间。