具有多租户设置的发条

时间:2017-04-27 06:34:12

标签: clockwork

我的应用使用postgres架构来实现多租户。因此对于像users这样的表格,每个租户实际上都拥有它自己的users表格 -

  • public.users(默认)
  • foo.users
  • bar.users
  • ...

作为旁注,它使用apartment gem

实现多租户

clockwork gem允许您使用它的sync_database_events方法从数据库表中读取事件。例如,它可以从scheduled_jobs表/模型中读取事件:

sync_database_events model: ScheduledJob, every: 1.minute do |model_instance|
  rake model_instance.name
end

默认情况下,它从public.scheduled_jobs读取,但我的每个模式都有自己的scheduled_jobs来读取。

有没有一种方便的方法让它循环通过我的所有租户?

1 个答案:

答案 0 :(得分:0)

我正在做一个非常相似的事情,区别在于我使用的是Apartment和MySQL而不是Postgres。公寓非常非常强大,但最好记录不佳。以下是我如何处理这个问题:

if Rails.env.development?
  every(1.day, '3am.job -- Daily Job', :at => '03:00') do |job|
    User.delay.crawl
    Search.delay.crawl 
  end
elsif Rails.env.production?
  every(1.day, '3am.job -- Daily Job', :at => '03:00') do |job|
    SiteApi.usernames.each do |username|
      Apartment::Tenant.switch!(username)
      User.delay.crawl
      Search.delay.crawl        
    end
  end
end

魔法发生在我的Rails.env.production中?块。 SiteApi是一个API,它与我的主用户数据库进行通信,并获取一组用户名。然后它调用Apartment :: Tenant.switch!(用户名)将租赁上下文切换到正确的用户。然后它调用我需要在每个租户上运行的功能。

你应该注意到我也在使用Apartment Sidekiq延期延迟。

我怀疑这个概念上的飞跃是你正在寻找的。