我会尽量保持这个简短,并将问题提交讨论。
我有一个Rails应用程序,它是一个静态代码库,可以在9个不同的服务器上运行所有相同的数据库模式,但当然具有不同的值。
我写了一些SQL来查询一些美元总计,并将其放入rake任务或sidekiq worker中,并每周触发一次以生成数据。最初我想把每个服务器的结果数据扔进邮件程序并将其邮寄给需要数据的人。这很简单。
但是这里有一个问题,我们需要在高价图表或其他图表引擎中查看一段时间内的指标。
所以这是我的想法。
这是我迄今为止的思考过程。我不确定当sidekiq工作人员触发时如何通过实时postgres调用从源服务器获取数据。这就是#1的问题。问题#2或更像问题#2,这是否是在目标Rails服务器上创建某种可消耗API的更好的用例?如果是这样,那么最好的起点是什么。
如果我的问题和思考过程不清楚,请告诉我,以便我能更详细地澄清和解释。
干杯!
答案 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个或更多应用程序连接的数据库往往更容易维护。
希望这有帮助!