从一个Rails服务器获取信息到另一个

时间:2015-08-01 16:16:49

标签: ruby-on-rails postgresql ruby-on-rails-4 highcharts rails-api

我会尽量保持这个简短,并将问题提交讨论。

我有一个Rails应用程序,它是一个静态代码库,可以在9个不同的服务器上运行所有相同的数据库模式,但当然具有不同的值。

我写了一些SQL来查询一些美元总计,并将其放入rake任务或sidekiq worker中,并每周触发一次以生成数据。最初我想把每个服务器的结果数据扔进邮件程序并将其邮寄给需要数据的人。这很简单。

但是这里有一个问题,我们需要在高价图表或其他图表引擎中查看一段时间内的指标。

所以这是我的想法。

  1. 创建sidekiq工作人员并按计划启动
  2. 从每个服务器获取结果数据并通过Postgres在目标服务器上填充(不知道如何执行此操作)
  3. 目标服务器将构建一个非常简单的Rails应用程序,该应用程序将具有指标的模型以及每个服务器(即服务器1服务器2等)的关联,在通过postgres(以某种方式)从源服务器填充数据之后,读取HighCharts中的数据并显示视图
  4. 这是我迄今为止的思考过程。我不确定当sidekiq工作人员触发时如何通过实时postgres调用从源服务器获取数据。这就是#1的问题。问题#2或更像问题#2,这是否是在目标Rails服务器上创建某种可消耗API的更好的用例?如果是这样,那么最好的起点是什么。

    如果我的问题和思考过程不清楚,请告诉我,以便我能更详细地澄清和解释。

    干杯!

1 个答案:

答案 0 :(得分:2)

有很多关于如何在Rails中使用多个数据库连接以及在Rails中构建API的教程。几分钟的谷歌搜索会给你很多例子。但这里有几个准系统方法:

对于多个数据库连接,您是对的,您需要拥有database.yml文件中定义的两个数据库的连接信息。例如:

# Local Database
development:
  adapter: mysql2
  database: local_db
  username: my_user
  password: my_password
  host: localhost
  port: 3306

# Reporting Database
development_reporting_db:
  adapter: postgresql
  encoding: unicode
  database: reporting
  username: some_user
  password: some_password
  host: 1.2.3.4
  port: 5432
除非你明确告诉它,否则Rails不会对这个额外的块做任何事情。通常的做法是定义一个将建立第二个连接的抽象ActiveRecord模型:

class ReportingRecord < ActiveRecord::Base
  establish_connection( "#{Rails.env}_reporting_db".to_sym )
  self.abstract_class = true
end

然后,为位于报告数据库中的表创建新模型,并从ReportingRecord而不是ActiveRecord::Base继承:

class SomeModel < ReportingRecord
  # this model sits on top of a table defined in database.yml --> development_reporting_db instead of database.yml --> development
end

为了构建API,有很多不同的方法可以做到这一点。无论您的方法如何,我都强烈建议您确保它只能通过HTTPS访问。这是一个基本控制器,其中一个操作响应json请求:

class ApiController < ApplicationController
  before_filter :restrict_access # ensures the correct api token was passed (defined in config/secrets.yml)
  skip_before_action :verify_authenticity_token # not needed since we're using token restriction

  respond_to :json

  def my_endpoint_action
    render :json => {some_info: 'Hello World'}, :status => 200 # 200 = success
  end

  private
    rescue_from StandardError do |e|
      render :json => {:error => e.message}.to_json, :status => 400 # 400 = bad request
    end

    # ensures the correct api token was passed (defined in config/secrets.yml)
    def restrict_access
      authenticate_or_request_with_http_token do |token, options|
        token == Rails.application.secrets[:my_access_token]
      end
    end
end

此示例要求您在config/secrets.yml文件中定义访问令牌:

development:
  secret_key_base: # normal Rails secret key base
  my_api_access_token: # put a token here (you can generate one on the command like using rake secret)

在API和多个数据库解决方案之间进行选择主要取决于您的应用程序将来如何扩展。多DB方法通常更容易实现并具有更高的性能。 API倾向于更好地水平扩展,并且只从一个应用程序而不是2个或更多应用程序连接的数据库往往更容易维护。

希望这有帮助!