ActiveSupportNotification 로그 구독 트리거는 요청할 때마다db 조회 기능을 제공합니다

8267 단어 flipper

묘사

다음 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 to false 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 = truepreload = 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...

좋은 웹페이지 즐겨찾기