나는 캐시에 외부 서비스에서 환율의 수를 가져오고이를 저장하기 위해 노력하고 있어요 :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