diff options
author | Stan Hu <stanhu@gmail.com> | 2019-07-02 11:19:30 -0700 |
---|---|---|
committer | Stan Hu <stanhu@gmail.com> | 2019-07-03 16:22:50 -0700 |
commit | 2db7c5762b41acbcbd71bc4bd5a8aa3d90e1a383 (patch) | |
tree | fbb54b0e73b09c9ff52500cc466374c5be153a86 /lib | |
parent | 62e52ac6a8130c080f498ee2f76ef50b8c209f0f (diff) | |
download | gitlab-ce-2db7c5762b41acbcbd71bc4bd5a8aa3d90e1a383.tar.gz |
Cache Flipper feature flags in L1 and L2 cachessh-cache-flipper-checks-in-memory
In https://gitlab.com/gitlab-com/gl-infra/production/issues/928, we saw
a significant amount of network traffic and CPU usage due to Redis
checking feature flags via Flipper. Since these flags are hit with every
request, the overhead becomes significant. To alleviate Redis overhead,
we now cache the data in the following way:
* L1: A thread-local memory store for 1 minute
* L2: Redis for 1 hour
Diffstat (limited to 'lib')
-rw-r--r-- | lib/feature.rb | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/lib/feature.rb b/lib/feature.rb index 22420e95ea2..e28333aa58e 100644 --- a/lib/feature.rb +++ b/lib/feature.rb @@ -103,10 +103,27 @@ class Feature feature_class: FlipperFeature, gate_class: FlipperGate) + # Redis L2 cache + redis_cache_adapter = + Flipper::Adapters::ActiveSupportCacheStore.new( + active_record_adapter, + l2_cache_backend, + expires_in: 1.hour) + + # Thread-local L1 cache: use a short timeout since we don't have a + # way to expire this cache all at once Flipper::Adapters::ActiveSupportCacheStore.new( - active_record_adapter, - Rails.cache, - expires_in: 1.hour) + redis_cache_adapter, + l1_cache_backend, + expires_in: 1.minute) + end + + def l1_cache_backend + Gitlab::ThreadMemoryCache.cache_backend + end + + def l2_cache_backend + Rails.cache end end |