ActiveSupportNotification 로그 구독 트리거는 요청할 때마다db 조회 기능을 제공합니다
묘사
다음 gems/버전을 사용합니다.gem 'flipper', '0.23.0'
gem 'flipper-active_record', '0.23.0'
gem 'flipper-ui', '0.23.0'
ruby '3.0.2'
gem 'rails', '6.1.4.3'
SQL 쿼리를 분석할 때 문제가 발견되었습니다.응용 프로그램에서 받은 모든 요청, 예를 들어 기본 get 요청, 그리고 다음 기능 회전기 조회를 터치합니다.너는 이것이 무슨 원인일 수 있는지 아니?SELECT "flipper_features"."key" AS feature_key, "flipper_gates"."key", "flipper_gates"."value" FROM "flipper_features" LEFT OUTER JOIN "flipper_gates" ON "flipper_features"."key" = "flipper_gates"."feature_key"
Query Trace:
/ruby/3.0.2/lib/ruby/gems/3.0.0/gems/active_record_query_trace-1.8/lib/active_record_query_trace.rb:105:in `fully_formatted_trace'
/ruby/3.0.2/lib/ruby/gems/3.0.0/gems/active_record_query_trace-1.8/lib/active_record_query_trace.rb:66:in `sql'
/ruby/3.0.2/lib/ruby/gems/3.0.0/gems/activesupport-6.1.4.3/lib/active_support/subscriber.rb:150:in `finish'
/ruby/3.0.2/lib/ruby/gems/3.0.0/gems/activesupport-6.1.4.3/lib/active_support/log_subscriber.rb:115:in `finish'
/ruby/3.0.2/lib/ruby/gems/3.0.0/gems/activesupport-6.1.4.3/lib/active_support/notifications/fanout.rb:157:in `finish'
나의 물갈퀴.rb 초기값 설정은 다음과 같습니다.# frozen_string_literal: true
# Require adapter to set default store
require 'flipper/adapters/active_record'
# Simple check if flipper table exists
def flipper_table_exists?
ActiveRecord::Base.connection.tables.include?('flipper_features')
rescue StandardError
false
end
# For the test environment an in-memory adapter will be used
# and all features are disabled by default. See /test/test_helper.rb
if !Rails.env.test? && flipper_table_exists?
# Get all features
features = Flipper.features
Flipper.memoize = true
Flipper.preload_all
begin
feature_keys = %i(test_1_key, test_2_key)
feature_keys.each do |feature_key|
unless features.any? { |f| f.key == feature_key.to_s }
if Rails.env.production?
Flipper.disable feature_key
else
Flipper.enable feature_key
end
end
end
rescue StandardError => e
# Ignore exceptions on app startup
Rails.logger.warn("Ignoring exception on flipper feature initialization: #{e.message}")
Rails.logger.warn e.backtrace.join("\n")
end
end
토론 #1
는 0.21에서 시작하여 플립퍼가 미리 불러오는 것을 사용했다고 생각하지만 기본값은 입니다.너는 그것을 닫거나 조정할 수 있다.https://www.flippercloud.io/docs/optimization
만약 그 의사들이 도움이 되지 않는다면 저에게 알려 주세요.미리 불러오는 것만 닫으면 될 수도 있습니다.나는 보통 켜진 상태를 유지하는 것을 권장하지만, 이것은 프로그램에 달려 있다.
토론 #2
가입 Rails.application.configure do
config.flipper.preload = false
end
나에게initializer/flipper.rb는 행동을 바꾸지 않았다.내가 노선을 방문할 때마다 조회를 촉발할 것이다.이db 요청을 어떻게 삭제하는지 다른 생각이 있습니까?
토론 #셋
@michaelwapp 현재 버전에 빈틈이 있어서 설정/초기화기의 미리 불러오기/기억 설정이 무시되었습니다.#586에서 수정되었으며 다음 릴리즈에서 릴리즈됩니다.이 설정을
config/application.rb로 이동하면 이 문제를 해결할 수 있을 것이다.토론 #4
동시 사용config/application.rb Rails.application.configure do
config.flipper.preload = false
config.flipper.memoize = true
end
그 결과 이상한 행동이 일어났다.만약 내가memoize를
true로 설정하고preload를 false로 설정하면 상술한 조회는 사라질 것이다.그러나 특정/전용 기능 키에 대한 모든 요청이 조회를 실행하기 때문에 기억 기능이 정상적으로 작동하지 않습니다.그래서 이것은 이것도 저것도 아닌 결정이다. 이 두 가지 상황에서 내가 원하지 않거나 필요로 하지 않는 조회를 실행할 것이다.사상
토론 #5
If I set memoize to
trueand preload tofalsethe above mentioned query goes away. However, the memoizing doesn't work correctly as there are queries being executed on each request for the specific / dedicated feature keys.
이것은 설계된 것이다.
memoize는 첫 번째 이후에 모든 기능 검사 결과를 저장하기 때문에 후속 호출은 다른 검색을 촉발하지 않습니다.preload는 요청마다 모든 기능을 한 번 불러옵니다. 따라서 몇 개의 기능을 검사했든지, 몇 번을 검사했든지 간에 하나의 조회만 있을 것입니다.So its an either - or decision where in both cases queries are executed which I don't want or need.
성능 문제 보셨어요?
preload 구성을 해제하고 필요한 컨트롤러에서 수동으로 Flipper.preload_all 또는 Flipper.preload(*feature_names) 호출할 수 있습니다.토론 #6
memoizewill save the result of each feature check after the first time, so subsequent calls will not trigger another query.
만약 내가
memoize = true와 preload = false를 동시에 설치한다면, 그것은 이렇게 하지 않을 것이다.이것이 바로 내가 곤혹스러워하는 원인이다.이렇게 구성하면 후속 SQL 질의가 트리거됩니다.토론 #7
memoize를true로 설정하고preload를false로 설정하여 프로그램을 다시 시작하고 페이지를 새로 고침하며 검사 중인 기능과 ql 로그를 포착할 수 있습니까?보고 싶어요.토론 #8
이것은 내config/application.rb 파일입니다.module TestWeb
class Application < Rails::Application
# Initialize configuration defaults for originally generated Rails version.
config.load_defaults 6.1
config.middleware.move_after ActionDispatch::ShowExceptions, Flipper::Middleware::Memoizer
config.flipper.preload = false
config.flipper.memoize = true
end
end
기능 반전기sentry_tracing를 사용하는 내 경로를 시작하고 액세스하면 다음 SQL 로그가 생성됩니다. Flipper::Adapters::ActiveRecord::Gate Load (1.4ms) SELECT "flipper_gates".* FROM "flipper_gates" WHERE "flipper_gates"."feature_key" = $1 [["feature_key", "sentry_tracing"]]
↳ config/initializers/sentry.rb:26:in `block (2 levels) in <main>'
Flipper feature(sentry_tracing) enabled? true (67.4ms) [ thing=nil gate_name=boolean ]
method=POST path=/api/iot/v1/test ...
Flipper::Adapters::ActiveRecord::Gate Load (3.1ms) SELECT "flipper_gates".* FROM "flipper_gates" WHERE "flipper_gates"."feature_key" = $1 [["feature_key", "sentry_tracing"]]
↳ config/initializers/sentry.rb:26:in `block (2 levels) in <main>'
Flipper feature(sentry_tracing) enabled? true (8.0ms) [ thing=nil gate_name=boolean ]
method=POST path=/api/iot/v1/test ...
Flipper::Adapters::ActiveRecord::Gate Load (2.0ms) SELECT "flipper_gates".* FROM "flipper_gates" WHERE "flipper_gates"."feature_key" = $1 [["feature_key", "sentry_tracing"]]
↳ config/initializers/sentry.rb:26:in `block (2 levels) in <main>'
Flipper feature(sentry_tracing) enabled? true (10.3ms) [ thing=nil gate_name=boolean ]
method=POST path=/api/iot/v1/test ...
구성을 전용 config.flipper.memoize = true만 사용하도록 변경하면 다음과 같은 SQL 쿼리가 발생합니다. (1.4ms) SELECT "flipper_features"."key" AS feature_key, "flipper_gates"."key", "flipper_gates"."value" FROM "flipper_features" LEFT OUTER JOIN "flipper_gates" ON "flipper_features"."key" = "flipper_gates"."feature_key"
Flipper feature(sentry_tracing) enabled? true (0.2ms) [ thing=nil gate_name=boolean ]
method=POST path=/api/iot/v1/test ...
(5.0ms) SELECT "flipper_features"."key" AS feature_key, "flipper_gates"."key", "flipper_gates"."value" FROM "flipper_features" LEFT OUTER JOIN "flipper_gates" ON "flipper_features"."key" = "flipper_gates"."feature_key"
Flipper feature(sentry_tracing) enabled? true (0.0ms) [ thing=nil gate_name=boolean ]
method=POST path=/api/iot/v1/test ...
(1.4ms) SELECT "flipper_features"."key" AS feature_key, "flipper_gates"."key", "flipper_gates"."value" FROM "flipper_features" LEFT OUTER JOIN "flipper_gates" ON "flipper_features"."key" = "flipper_gates"."feature_key"
Flipper feature(sentry_tracing) enabled? true (0.0ms) [ thing=nil gate_name=boolean ]
method=POST path=/api/iot/v1/test...
Reference
이 문제에 관하여(ActiveSupportNotification 로그 구독 트리거는 요청할 때마다db 조회 기능을 제공합니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://github.com/jnunemaker/flipper/issues/599텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)