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