ReactiveCaching 사용하기
GitLab의 ReactiveCaching concern을 사용하여 백그라운드에서 데이터를 비동기적으로 캐시하고 최신 상태로 유지하는 방법을 설명합니다.
이 문서는 reactive_caching.rb 를 참조합니다. ReactiveCaching concern은 백그라운드에서 일부 데이터를 가져와 Rails 캐시에 저장하고, 데이터가 요청되는 동안 최신 상태를 유지하는 데 사용됩니다. 데이터가 reactive_cache_lifetime 동안 요청되지 않으면 갱신이 중지되고 제거됩니다. 예시 # class Foo < ApplicationRecord include ReactiveCaching after_save :clear_reactive_cache! def calculate_reactive_cache(param1, param2) # Expensive operation here. The return value of this method is cached end def result # Any arguments can be passed to `with_reactive_cache`. `calculate_reactive_cache` # will be called with the same arguments. with_reactive_cache(param1, param2) do |data| # ... end end end 이 예시에서 #result 가 처음 호출되면 nil 을 반환합니다. 그러나 #calculate_reactive_cache 를 호출하고 초기 캐시 수명을 10분으로 설정하는 백그라운드 워커를 큐에 추가합니다. ReactiveCaching 작동 방식 # #with_reactive_cache 가 처음 호출되면 백그라운드 job이 큐에 추가되고 with_reactive_cache 는 nil 을 반환합니다. 백그라운드 job은 #calculate_reactive_cache 를 호출하고 그 반환값을 저장합니다. 또한 reactive_cache_refresh_interval 후에 다시 실행되도록 백그라운드 job을 다시 큐에 추가합니다. 따라서 저장된 값을 최신 상태로 유지합니다. 계산은 동시에 실행되지 않습니다. 값이 캐시된 상태에서 #with_reactive_cache 를 호출하면 #with_reactive_cache 에 제공된 블록이 호출되어 캐시된 값이 yield됩니다. 또한 캐시의 수명이 reactive_cache_lifetime 값만큼 연장됩니다. 수명이 만료된 후에는 더 이상 백그라운드 job이 큐에 추가되지 않으며, #with_reactive_cache 를 다시 호출하면 nil 을 반환하여 전체 프로세스가 다시 시작됩니다. ReactiveCaching에 하드 제한 설정 # 성능을 유지하려면 ReactiveCaching 을 포함하는 클래스에 하드 캐싱 제한을 설정해야 합니다. 설정 방법 예시를 참조하세요. 자세한 내용은 내부 이슈 Redis (or ReactiveCache) soft and hard limits 를 읽어보세요. 사용 시기 # 외부 API에 요청을 해야 하는 경우(예: k8s API에 대한 요청). 외부 요청 기간 동안 애플리케이션 서버 워커를 블로킹 상태로 유지