我构建了一个文档管理系统,它包含一个内容管理Rails应用程序(用于编写和管理文档,用户和其他内容)和一个最终用户Rails应用程序(用于阅读,搜索等)。
内容管理应用程序位于服务器上,并且我有几个最终用户服务器以确保高可用性(一项要求)。最终用户服务器充当内容管理服务器的从属服务器(PostgreSQL主/从复制)。
直到现在还需要新功能。最终用户应该能够生成包含用户所选文档的pdf。现在这本身就没有问题 - 系统应该处理大量的文档,所以我添加了一个Sidekiq工作来完成PDF生成。但这里有一个棘手的部分: 如何向最终用户应用添加状态,以便在pdf完成生成时通知用户。在一个完美的世界里,我会添加一个新模型,比如说PDFPrintJob,它有一个status属性,我可以通过控制器show actions来检查。但问题是,由于主/从情况,所有最终用户应用程序都在只读数据库上。
那我应该怎么解决这个问题呢?有没有更好的结构化服务器的方法,使我能够在从属设备上有可写的附加表? 如果数据库服务器可以完全保持内容同步,我会很高兴。
我在JRuby 1.7.x和PostgreSQL 9.2上运行Rails4
非常感谢
答案 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