【问题标题】:Capistrano, Rails, PostgreSQL Master-slaves replications making it hard to add additional tables to slavesCapistrano、Rails、PostgreSQL 主从复制使得很难向从属添加额外的表
【发布时间】:2013-11-27 14:05:17
【问题描述】:

我已经构建了一个文档管理系统,它由一个内容管理 Rails 应用程序(用于编写和管理文档、用户和其他内容)和一个最终用户 Rails 应用程序(用于阅读、搜索等)组成。

内容管理应用程序位于自己的服务器上,我有几个最终用户服务器来确保高可用性(一项要求)。最终用户服务器充当内容管理服务器的从属服务器(PostgreSQL 主/从复制)。

直到现在需要一个新功能时,这都很好用。最终用户应该能够生成包含用户选择的文档的 pdf。现在这本身没问题 - 系统应该处理大量文档,所以我添加了一个 Sidekiq 工作人员来生成 PDF。但棘手的部分来了: 如何向我的最终用户应用程序添加状态,以便在 pdf 完成生成时通知用户。在一个完美的世界里,我会添加一个新模型,比如 PDFPrintJob,它有一个状态属性,我可以通过控制器显示操作来检查它。但问题是,由于主/从情况,所有最终用户应用程序都位于只读数据库中。

那么我应该如何解决这个问题?有没有更好的方法来构建服务器,使我能够在从属服务器上拥有额外的可写表? 如果数据库服务器能够完成保持内容同步的繁重工作,我会很高兴。

我在 JRuby 1.7.x 和 PostgreSQL 9.2 上运行 Rails4

非常感谢

【问题讨论】:

    标签: ruby-on-rails postgresql capistrano


    【解决方案1】:

    使用 sidekiq-status 之类的插件将作业状态存储在 Sidekiq 上。至少你可以在 JavaScript 中做一些轮询来获取你的工作状态。如果您想变得花哨,可以使用 Rails 4 进行服务器端事件。

    这是展示如何使用存储和检索每个 Sidekiq 作业的部分的部分。

    https://github.com/utgarda/sidekiq-status

    检索状态

    以后随时查询作业状态:

    job_id = MyJob.perform_async(*args)
    # :queued, :working, :complete or :failed , nil after expiry (30 minutes)
    status = Sidekiq::Status::status(job_id)
    Sidekiq::Status::queued?   job_id
    Sidekiq::Status::working?  job_id
    Sidekiq::Status::complete? job_id
    Sidekiq::Status::failed?   job_id
    

    跟踪进度、保存和检索与作业相关的数据

    class MyJob
      include Sidekiq::Worker
      include Sidekiq::Status::Worker # Important!
    
      def perform(*args)
        # your code goes here
    
        # the common idiom to track progress of your task
        at 5, 100, "Almost done"
    
        # a way to associate data with your job
        store vino: 'veritas'
    
        # a way of retrieving said data
        # remember that retrieved data is always is String|nil
        vino = retrieve :vino
      end
    end
    
    job_id = MyJob.perform_async(*args)
    data = Sidekiq::Status::get_all job_id
    data # => {status: 'complete', update_time: 1360006573, vino: 'veritas'}
    Sidekiq::Status::get     job_id, :vino #=> 'veritas'
    Sidekiq::Status::num     job_id #=> 5
    Sidekiq::Status::total   job_id #=> 100
    Sidekiq::Status::message job_id #=> "Almost done"
    Sidekiq::Status::pct_complete job_id #=> 5
    

    【讨论】:

    • 这看起来是个不错的方法。我一直在找错地方。非常感谢
    猜你喜欢
    • 2012-01-13
    • 2015-01-15
    • 1970-01-01
    • 2011-01-20
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 1970-01-01
    相关资源
    最近更新 更多