【问题标题】:Clockwork with a multi-tenant setup具有多租户设置的发条
【发布时间】:2017-09-24 19:18:23
【问题描述】:

我的应用使用 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 可供读取。

有没有一种方便的方法让它遍历我的所有租户?

【问题讨论】:

    标签: clockwork


    【解决方案1】:

    我正在做一件非常相似的事情,不同之处在于我使用的是 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!(username) 将租户上下文切换到正确的用户。然后它调用我需要在每个租户上运行的函数。

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

    我怀疑这种概念上的飞跃正是您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多