gpt4 book ai didi

ruby - 在类变量、rake 任务和 cron 上使用互斥锁的 Rails

转载 作者:太空宇宙 更新时间:2023-11-03 16:50:42 25 4
gpt4 key购买 nike

抱歉问了这么大的问题。我对 Rails threadsmutex 没有太多经验。

我有一个类如下,不同的 Controller 使用它来为每个客户获取许可证。

每小时都会添加和删除客户及其许可证。一个 API 可用于获取所有客户及其许可证。

我计划创建一个 rake 任务来调用 update_set_customers_licenses,通过 cronjob 每小时运行一次。

我有以下问题:

1) 即使有 mutex,目前也有可能出现问题,我的 rake 任务有可能在更新时发生。关于如何解决这个问题的任何想法?

2) 我下面的设计将 json 写入文件,这样做是为了安全,因为 api 并不那么可靠。可以看出,它不是读回文件,所以本质上写文件是没有用的。我尝试实现文件读取,但与 mutexrake task 一起使用时,它变得非常困惑。任何指针都会在这里有所帮助。

class Customer
@@customers_to_licenses_hash = nil
@@last_updated_at = nil
@@mutex = Mutex.new

CUSTOMERS_LICENSES_FILE = "#{Rails.root}/tmp/customers_licenses"

def self.cached_license_with_customer(customer)
Rails.cache.fetch('customer') {self.license_with_customer(customer)}
end

def self.license_with_customer(customer)
@@mutex.synchronize do
license = @@customers_to_licenses_hash[customer]
if license
return license
elsif(@@customers_to_licenses_hash.nil? || Time.now.utc - @@last_updated_at > 1.hours)
updated = self.update_set_customers_licenses
return @@customers_to_licenses_hash[customer] if updated
else
return nil
end
end
end

def self.update_set_customers_licenses
updated = nil
file_write = File.open(CUSTOMERS_LICENSES_FILE, 'w')
results = self.get_active_customers_licenses
if results
@@customers_to_licenses_hash = results
file_write.print(results.to_json)
@@last_updated_at = Time.now.utc
updated = true
end
file_write.close
updated
end

def self.get_active_customers_licenses
#http get thru api
#return hash of records
end
end

最佳答案

我很高兴每次 Rails 加载时,环境都是“新鲜的”并且在实例之间没有“状态”的概念。也就是说,一个 ruby​​ 实例(对 rails 的一个请求)中的互斥锁对第二个 ruby​​ 实例(对 rails 的另一个请求,在本例中为 rake 任务)没有影响。

如果你顺着数据上游,你会发现每一个可用于同步它们的实例的共同根是数据库。你可以使用 transactional blocks或者可能是您在数据库中设置和取消设置的手动标志。

关于ruby - 在类变量、rake 任务和 cron 上使用互斥锁的 Rails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22625789/

25 4 0