簡體   English   中英

多租戶resque,並避免一個租戶堵塞隊列

[英]Multi-tenant resque, and avoiding one tenant clogging the queue

我們有一個多租戶應用程序,可以運行resque進行后台處理。

我們偶爾遇到的問題是單個租戶在很短的時間內完成大量的后台工作。 這基本上堵塞了一段時間 - 在我們處理這個單一租戶的積壓工作時,每個其他租戶的工作都被延遲了。

是的,我們可以增加更多的工人。 但這不是一個真正的“解決方案”,它更像是一個創可貼,但仍會導致其他租戶延遲 - 只是因為我們處理得更快而延遲更短。

是否有更多多租戶友好的方式來使用resque 或者更多的多租戶友好背景隊列?

我們正在研究:

  • 每個租戶使用一個隊列,每個租戶使用一個工作者(動態創建隊列?)
  • 修改resque以便它以某種方式循環通過每個租戶的隊列

我們只是想知道是否有什么我們缺少/更好的方式......

您可以使用Rails.cache為每個參與者維護臨時作業計數器,並根據活動作業的數量將作業分配到不同的隊列。

您需要將作業子類化以支持不同的隊列,並編寫一個解析為該作業的正確類的方法。 就像是:

class Worker

   cattr_acessor :tenant_id

   class Worker::Low < Worker
     @queue = :low
   end

   class Worker::High < Worker
     @queue = :high
   end

   def self.queued
      "#{name}::#{resolved_queue(tenant_id)}".constantize
   end

   def self.resolved_queue tenant_id
     count = job_count(tenant_id)
     if count > 1000
       'Low'
     else
       'High'
     end
   end

   def self.cache_key tenant_id
     "job_count/#{tenant_id}"
   end

   def self.job_count tenant_id
     Rails.cache.fetch(cache_key(tenant_id)){0}
   end

   def self.job_count_increment tenant_id
     Rails.cache.fetch(cache_key(tenant_id)){0}
     Rails.increment(cache_key(tenant_id)){0}
   end

   def self.job_count_decrement tenant_id
     count = Rails.cache.fetch(cache_key(tenant_id)){0}
     Rails.decrement(cache_key(tenant_id)){0} if count > 0
   end
end

然后在運行Worker.queued(tenant_id).perform時調用Worker.queued(tenant_id).perform ,並確保在應用程序中的before_filters上設置了Worker.tenant_id 有關隊列和優先級的更多信息,請參閱Resque Priorities和Queue Lists

您應該在作業隊列中調用增量並從作業中減少。

丑陋,但可行。

並且可以通過一些元編程使其更加干燥 - 將這些方法提取到模塊中,然后確保在模塊包含上生成隊列子類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM