フリッパー機能フラグを使用して新しい機能を Rails に安全にデプロイする
このシナリオを想像してみてください。あなたは Rails 開発者で、誰もが待ち望んでいる素晴らしい機能の開発にここ数日を費やしました。大きくて複雑ですが、厳格なテストを通過しているため、すべてが正常に動作することに自信があります。守らなければならない期限があるので、デプロイします。すぐに、すべての地獄が解き放たれます。
あなたの機能は、一部のユーザーにとってアプリ全体を破壊します。理由を言うのは難しいです。テスト中にバグは発生しませんでした。変更を元に戻しましたが、ダメージを受けています。顧客は満足していないため、ダメージ コントロールと何が問題だったのかの調査に当面の時間を費やすことになります。
問題は、どんなにテストを行っても、複雑な変更をリリースすることには本質的にリスクが伴うということです。この機能を段階的に、おそらく最初は少数のユーザーにのみ公開すればよかったのにと思います。最初の問題が発生したらすぐに機能をオフにできればさらに良かったのですが。
まさにここで機能フラグが登場します。この投稿では、Flipper gem を使用して機能フラグを設定する方法を含め、Rails の機能フラグについて詳しく説明します。まず最初に、それらは何ですか?
Ruby on Rails の機能フラグとは何ですか?
機能フラグは、アプリケーションの実行中にその機能を有効または無効にする方法です。フラグが有効になっている場合、その機能が使用されます。それ以外の場合はそうではありません。疑似コードでこのようなものを想像してください。
「フィーチャーフラグ」という名前はやや誤解を招きます。実行時のアプリケーション動作の制御は機能に限定されず、プログラム内のあらゆる関数に適用されます。機能フラグを使用すると、たとえば、パフォーマンスの調整を試したり、A/B テストを実行したりできます。機能フラグと他の古い条件の大きな違いは、実行時に機能フラグを変更できることです。
説明のために、環境変数を使用した単純な機能フラグ メカニズムを想像してみましょう。
環境変数の値を変更することで、アプリケーションの一部を自由にオンまたはオフに切り替えることができます。アプリケーションのどの部分ですか?欲しいものは何でも!
機能が無効になっている場合は、UI の一部を非表示にすることができます。コードの一部を置き換えることができます。これは、最新のリファクタリングに自信がない場合に非常に役立ちます。機能フラグの私のお気に入りの使用法の 1 つは、ルーティング制約を使用してルート全体を非表示にすることです。
機能フラグには多くの応用例があることがすでにわかります。ただし、私たちの単純な実装には 1 つの重大な弱点があります。機能はユーザーごとにオンまたはオフになります。
特定のユーザーまたはユーザーのグループに対してのみ、または一部の時間に対してのみ機能を有効にする機能が必要な場合はどうすればよいでしょうか。Flipper を見てみましょう。
機能フラグにフリッパー ジェムを使用する
Flipper は、機能フラグとそれらを切り替えるさまざまな方法を Rails で利用できるようにする宝石です。高度にモジュール化されています。メインの宝石とは別に、ストレージ アダプターも選択する必要がありますが、それについては後ほど説明します。ここでは、ActiveRecord アダプターを使用してみましょう。
次の行を Gemfile に追加し、bundle install を実行します。 :
ActiveRecord アダプターを使用すると、Flipper は機能フラグをデータベースに保存するため、新しいデータベース テーブルをセットアップする必要があります。 Flipper には、必要な移行を作成する便利なジェネレーターが付属しています。
Flipper は、以前に使用した単純な実装と同じ方法で使用できます。
大きな違いは、環境変数を変更する代わりに、Flipper のユーザー インターフェイスを使用して機能を切り替えることができることです。 Flipper UI gem を追加してインストールします。
Flipper UI をマウントするようにルート ファイルを変更します。
アプリケーションを起動して Flipper UI に移動すると、使用可能なすべての機能とそのステータスの概要が表示されます。 my_awesome_feature を作成してください。 機能。

フリッパーの機能切り替え
おそらく、Flipper UI では機能を単に有効または無効にするだけではないことに気づいたでしょう。Flipper を使用すると、ユーザーのサブセット、または一定の時間に対して機能を有効にすることができます。 5 つの異なるメカニズムのいずれかを使用して機能フラグを設定できます。
そのうちの 1 つは、グローバルなオン/オフ スイッチであるブール トグルです。他の 4 つはそれよりもはるかに興味深いものです。グループ、俳優、俳優の割合、時間の割合です。
グループ
特定のユーザー グループに対してのみ機能を有効にするには、グループ切り替えを使用します。存在しない場合は、ファイル config/initializers/flipper.rb を作成します。 次のコードを追加して、新しいグループ (有料ユーザーなど) を登録します。
この新しいトグルを使用するには、Flipper の呼び出しを変更して、ユーザー (ドキュメントではアクターと呼んでいます) と機能名を渡すようにします。
Flipper は、イニシャライザで定義したブロックを使用して、このユーザーに対して機能が有効かどうかを判断します。この場合、paid? が呼び出されます。 方法。このグループを Flipper UI で使用できるようになりました。 [グループを追加] ボタンをクリックしてグループを選択します。

グループは有料ユーザーである必要はありません。チームのメンバーやベータプログラムにサインアップしたユーザーである可能性があります。グループ切り替えを使用すると、ユーザーのサブセットに何かをリリースしたい場合に役立ちます。ベータリリースや内部リリースを想像してみてください。
俳優
場合によっては、1 人の個人に何かをリリースしたい場合もあります。この場合、アクターの切り替えを考慮する必要があります。
このメカニズムを使用するためにイニシャライザで何も変更する必要はありません。ただし、アクター モデル (ほとんどの場合ユーザー モデルになります) が flipper_id を実装していることを確認する必要があります。 。 Flipper::Identifier を含む
その後、この ID を使用して、個々のユーザーに対して機能を有効にすることができます。

この機能切り替えは、特定の個人向けの機能をプレビューする場合に便利です。機能を広範囲のユーザーにリリースする前に、機能にアクセスする必要があるパートナー向けに特定のテスト アカウントを有効にすることを検討してください。
アクターの割合
機能の使用量をゆっくりと増やしたい場合は、アクターの割合を切り替えるのが最適です。パフォーマンスの最適化を実装したものの、実稼働環境でそれがどのように動作するかよくわからないと想像してください。最初にこれを少数のユーザーに展開し、次にアプリケーションを監視しながら徐々に使用量を増やしていきます。

状況が思わしくない場合は、いつでもパーセンテージをゼロにリセットできます。
時間の割合
最後に重要なことですが、リクエストの一部に対して機能を有効にすることができます。このトグルを使用する場合、アクターを指定する必要はありません。
私はこれを 2 つの異なる実装のパフォーマンスを比較するために使用するのが好きです。この機能の切り替えはランダムであることに注意してください。同じユーザーでもリクエストごとに異なる動作が発生します。
フリッパーの詳細設定
ActiveRecord アダプターを使用して機能フラグ情報をデータベースに保存できることはすでに説明しました。ただし、特定のニーズに応じて、別のアダプターを使用することもできます。
ほとんどの場合、ストレージ アダプターを交換するときに必要なのは、それぞれの gem をインストールし、それに応じて Flipper を構成することだけです。たとえば、Redis アダプターを使用する場合は、flipper-redis を追加します。 gem を yourGemfile に追加し、Flipper イニシャライザを更新します。
ストレージ アダプタの構成以外にも、Flipper には調整できる要素がたくさんあります。
機能フラグを追加するとパフォーマンスが若干低下するため、通常はメモ化とキャッシュを追加する必要があります。また、Flipper UI へのアクセスを承認されたユーザーに制限することも必要になる場合があります。これらのトピックはこの投稿の範囲外ですが、より詳しく知りたい場合は、Flipper のドキュメントをチェックすることをお勧めします。
レール内の機能フラグに関する注意事項
機能フラグは素晴らしいです。しかし、他の多くのことと同様に、考慮すべきトレードオフがあります。
機能フラグを追加して維持すると、組織的なオーバーヘッドが増加します。フラグを使用して非表示の機能をリリースおよびロールアウトすることは、「通常の」コードをデプロイするほど簡単ではありません。もちろん、フラグを有効にすることを忘れずに行う必要があります。通常、これはそれほど難しくありませんが、不要になった機能フラグをクリーンアップするのは難しい場合があります。
コードに機能フラグを追加するたびに条件を追加することになります。注意しないと、コードにはすぐに条件が散乱してしまいます。特定の機能フラグを作成した時期と理由を追跡するのは難しい場合があります。残念ながら、Flipper UI 自体には機能フラグを管理するための機能はあまりありません。
また、機能フラグを使用すると、パフォーマンスが若干低下することにも注意してください。これを軽減する方法はありますが、Flipper の設定を誤ったり誤用したりすると、顕著な影響が出る可能性があります。
まとめ:Ruby on Rails の機能フラグを使ってみる
より自信を持ってリリースできるように機能フラグがどのように役立つかを検討し、機能フラグが原理的にどのように機能するかを学び、Flipper gem を使用して機能フラグを使い始める方法を確認しました。
機能フラグが便利な状況は数多くあります。ユースケースに応じて、ブール値、グループ、アクター、アクターの割合、またはリクエストの割合の 5 つの異なるトグルのいずれかに到達する可能性があります。
機能フラグの操作には注意点があり、慣れるまでに時間がかかるかもしれませんが、それでも自由に使える優れたツールです。
次回まで、コーディングを楽しんでください!
追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。
-
データベースの増大を制御:テーブルのサイズを小さく保ち、データの肥大化を回避する戦略
ほとんどの Web アプリケーションは、何らかの種類のデータ ストア (多くの場合、リレーショナル データベース) を使用します。 Web アプリが成功すると、データベースにデータを「溜め込み」始めるのが非常に簡単になることがあります。しかし、データを溜め込むと、データベース テーブル (行数と保存されるデータ サイズの両方) が際限なく増大することになります。 これはある程度まではうまく機能しますが、データの肥大化を防ぐのに非常に役立ちます。あるいは、それを防ぐことができない場合は、成長を適切に管理するために事前にインフラストラクチャの計画を立てることができます。 本題に入る前に、アプリ
-
Rubyの関数とメソッド:独自の関数を定義する方法
Rubyメソッドとは何ですか? メソッドは、特定の目的のためにグループ化された1行または複数行のRubyコードです。 このグループ化されたコードには名前が付けられているため、コードを再度記述したり、コピーして貼り付けたりすることなく、いつでも使用できます。 メソッドの目的は次のとおりです : 情報を取得します。 オブジェクトを変更または作成します。 フィルターとフォーマットのデータ。 例1 : サイズ Arrayのメソッド オブジェクトは要素の数を示します(情報を取得します)。 例2 : pop メソッドは、配列から最後の要素を削除します(オブジェクトを変更します)。