Capistrano,Rails,PostgreSQL Master-slaves复制使得很难向奴隶添加额外的表

时间:2013-11-27 14:05:18

标签: ruby-on-rails postgresql capistrano

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

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

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

那我应该怎么解决这个问题呢?有没有更好的结构化服务器的方法,使我能够在从属设备上有可写的附加表? 如果数据库服务器可以完全保持内容同步,我会很高兴。

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

非常感谢

1 个答案:

答案 0 :(得分: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