4
在我的Rails应用程序我想在缓存从外部服务获取了一些货币的汇率,并将其储存:如何处理Open-Uri中的外部服务故障?
require 'open-uri'
module ExchangeRate
def self.all
Rails.cache.fetch("exchange_rates", :expires_in => 24.hours) { load_all }
end
private
def self.load_all
hashes = {}
CURRENCIES.each do |currency|
begin
hash = JSON.parse(open(URI("http://api.fixer.io/latest?base=#{currency}")).read) #what if not available?
hashes[currency] = hash["rates"]
rescue Timeout::Error
puts "Timeout"
rescue OpenURI::Error => e
puts e.message
end
end
hashes
end
end
这个工作在发展不错,但我担心的是生产环境。如果外部服务不可用,我怎样才能防止整个事物被缓存?我如何确保ExchangeRate.all
始终包含数据,即使它已经过时并且由于外部服务失败而无法更新?
我试图添加一些基本的错误处理,但恐怕还不够。
你可能例如保持“exchange_rates_backup”,将不会过期的另一个缓存,这将是每一个外部服务将被成功读取时间设置。然后这个“备份”缓存可以在'all'方法中用作备份。 – BoraMa
您可以依赖数据库中的自定义表。如果'load_all'失败,则可以使用自己表中的记录。 – etagwerker