summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorStan Hu <stanhu@gmail.com>2019-07-02 11:19:30 -0700
committerStan Hu <stanhu@gmail.com>2019-07-03 16:22:50 -0700
commit2db7c5762b41acbcbd71bc4bd5a8aa3d90e1a383 (patch)
treefbb54b0e73b09c9ff52500cc466374c5be153a86 /lib
parent62e52ac6a8130c080f498ee2f76ef50b8c209f0f (diff)
downloadgitlab-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.rb23
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