[英]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.