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
true
and preload tofalse
the 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
memoize
will 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.)