Slide 1

Slide 1 text

Scalaからはじめる OpenFeature入門 id:arthur-1 株式会社はてな 2024-12-13 Scalaわいわい勉強会 #4

Slide 2

Slide 2 text

Arthurと申します 株式会社はてな Mackerel開発チーム 「オブザーバビリティの実現」チーム テックリード・プロダクトオーナー 𝕏: @Arthur1__ Scalaわいわい勉強会では#1, #2でも 登壇しています 2

Slide 3

Slide 3 text

MackerelはScalaで作ってます 3

Slide 4

Slide 4 text

おしながき ● フィーチャーフラグとその効能 ● OpenFeatureが目指す標準化 ● ScalaでOpenFeatureを使う方法2選 ○ デモもあるよ 4

Slide 5

Slide 5 text

フィーチャーフラグと その効能 5

Slide 6

Slide 6 text

フィーチャーフラグ ソースコードを変更せず、特定の機能や動作の 有効/無効を制御する仕組み ソースコードを変更するより、フラグを操作する方 が、手軽・高速・安全に適用でき、かつ操作を管理で きて良いという仮定があるはず 6

Slide 7

Slide 7 text

機能リリースとデプロイの分離 ロールバックの範囲を小さく・かかる時間を短くできる 複数のリリースを含んだデプロイ後にロールバックしたいと き、リリース=デプロイだと他の機能も巻き込まれて影響範囲 が大きくなってしまうか、revertからの再リリースに時間がか かる フラグを変えるだけでロールバックできるなら、フィーチャー フラグの仕組みによっては一瞬でロールバック可能 cf.) 障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2 https://speakerdeck.com/arthur1/waroom-meetup-number-2?slide=19 7

Slide 8

Slide 8 text

トランクベース開発 トランク=mainブランチに対して細かく高い頻度で変更 を加えていく手法 大きなfeatureブランチを時間をかけて作っていくと、マージ した結果ビルドが壊れたり、そもそもコンフリクトしまくった りしてしまう フィーチャーフラグがあると、未完成部分の公開・利用 を防げて便利 8

Slide 9

Slide 9 text

特定のユーザーだけに提供 プライベートベータ 特定のユーザーにだけある機能を展開する 小さく作って検証を繰り返すアジャイル開発で効果的 例)あるユーザーからのフィードバックは欲しいけど、ひと まとまりのUIが完成しないと全ユーザーには見せづらい 9

Slide 10

Slide 10 text

不特定のユーザーだけに提供 カナリアリリース 部分的に機能を展開していく エラーの増加など、問題があったらすぐ切り戻す A/Bテスト どちらの方が良さそうかを検証する 10

Slide 11

Slide 11 text

OpenFeatureが 目指す標準化 11

Slide 12

Slide 12 text

OpenFeature フィーチャーフラグの標準化を目指すプロジェクト CNCFのIncubating Projectsに採択されている https://openfeature.dev/ 12 Branding Guidelines | OpenFeature https://openfeature.dev/community/branding-guidelines/ (Licensed under CC BY 4.0)

Slide 13

Slide 13 text

OpenFeatureの現在地 高機能なフィーチャーフラグを利用するには、スタンドアロンの 機能フラグ設定管理サービスと、それと対話するクライアントが 必要とされる OpenFeatureは、フィーチャーフラグの評価をするAPIを、 特定のベンダーに依存しない形で提供するClientを提供する 13

Slide 14

Slide 14 text

OpenFeature Clientの構造 SDKが提供するフラグ評価APIは共通。フィーチャーフラグのバッ クエンドに合わせて、Providerを差し替える 14 Introduction | OpenFeature https://openfeature.dev/docs/reference (Licensed under CC BY 4.0)

Slide 15

Slide 15 text

ベンダーフリーの標準化の嬉しさ こういった場合も、ソースコードの差分が少なくて済む: 「スモールスタートで環境変数をフィーチャーフラグのデータ ソースに使ってきたけど、高級な機能を持つフィーチャーフラ グSaaSを利用したいなあ……」 「外部のフィーチャーフラグSaaSは機能的にtoo muchだった から、費用を抑えられる手法に移行したいなあ……」 15

Slide 16

Slide 16 text

コード例(Java) 16 // OpenFeature Clientの初期化 OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProvider(new YourFavoriteProvider()); Client client = api.getClient("my-app"); // フラグの評価 Boolean boolValue = client.getBooleanValue("feature1", false);

Slide 17

Slide 17 text

コード例(Java) 17 // OpenFeature Clientの初期化 OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProvider(new YourFavoriteProvider()); api.setProvider(new YetAnotherFavoriteProvider()); Client client = api.getClient("my-app"); // フラグの評価 Boolean boolValue = client.getBooleanValue("feature1", false);

Slide 18

Slide 18 text

SDKとProviderのやりとり SDKとProviderの結合はソースコード内で行われることが多い SDKが定めたプログラムとしてのインタフェースにProviderが 合わせる必要がある すなわち、(SDKの数)×(フィーチャーフラグバックエンド の数)だけProvider実装が存在する 18

Slide 19

Slide 19 text

様々な言語・環境向けのSDK https://openfeature.de v/ecosystem OpenFeatureコミュニ ティで管理されているもの は、本発表時点で13個 19

Slide 20

Slide 20 text

様々なProvider(Go SDKの場合) https://github.com/open-feature/go-sdk-contrib ● 環境変数 ● flagd ● ConfigCat など、self-hosted / SaaS問わず、様々なフィーチャフラグ バックエンド向けのものが、OpenFeatureのリポジトリで 用意されている 20

Slide 21

Slide 21 text

OpenFeatureのいいところ ● 標準に統一することで、認知負荷が減らせる ● フィーチャーフラグバックエンドを差し替えるときも、 ソースコードの差分はProviderの注入部分だけ ● 標準化により、「機能フラグはこういうことができるべき だ」というラインが宣言されている ○ フィーチャーフラグの仕組みを自作するにしても、道標 になる 21

Slide 22

Slide 22 text

ScalaでOpenFeature を使う方法2選 22

Slide 23

Slide 23 text

ScalaでOpenFeatureを使う選択肢 今回は2つ紹介する: ● open-feature/java-sdk ● alexcardell/openfeature-scala 23

Slide 24

Slide 24 text

ScalaでOpenFeatureを使う選択肢 今回は2つ紹介する: ● open-feature/java-sdk ● alexcardell/openfeature-scala 24

Slide 25

Slide 25 text

open-feature/java-sdk https://github.com/open-feature/java-sdk OpenFeature公式で管理されているJava向けのSDK ScalaはJavaのライブラリ資産を活用することができる! という話をここでするということは、Scala向けの OpenFeature SDKは公式には存在していない😭 25

Slide 26

Slide 26 text

open-feature/java-sdkの特徴 長所 ● OpenFeatureコミュニティ公式なので、用意されている Providerが多い ○ https://github.com/open-feature/java-sdk-contrib を 見ると発表時点で10個 短所 ● JVM以外では使えない 26

Slide 27

Slide 27 text

ScalaでOpenFeatureを使う選択肢 今回は2つ紹介する: ● open-feature/java-sdk ● alexcardell/openfeature-scala 27

Slide 28

Slide 28 text

alexcardell/openfeature-scala https://github.com/alexcardell/openfeature-scala Alex Cardell氏が開発したScala実装のSDK ドキュメント :https://alexcardell.github.io/openfeature-scala/ 28

Slide 29

Slide 29 text

alexcardell/openfeature-scalaの特徴 長所 ● Scala NativeやScala.jsといったJVM以外の環境でも利用可能 ● JVMで使うなら、公式のJava SDK向けに作られたProviderを こちらでも利用可能にするwrapperが用意されている ● Cats Effect との相性が良い 短所 ● まだ実装中の機能も多い ● JVM以外にも対応したProviderが少ない 29

Slide 30

Slide 30 text

デモ $ scala-cli package --power -o server server.scala $ ./server 30 Scala Native環境のhttp4sサーバで openfeature-scalaを使うデモコー ドを用意しました https://gist.github.com/Arthur1/ea142 d3cffbfe2f65f0d34340fa0dbc2

Slide 31

Slide 31 text

サーバ起動・Client作成部分 31 for provider <- MemoryProvider[IO]( Map("feature1" -> FlagValue.BooleanValue(true)) ) given FeatureClient[IO] = FeatureClientImpl[IO](provider) server = EmberServerBuilder.default[IO] .withHttpApp(RootRoutes.routes.orNotFound) .build _ <- server.useForever.as(ExitCode.Success) yield ()

Slide 32

Slide 32 text

ハンドラ・フラグ評価部分 32 def routes(using featureClient: FeatureClient[IO]) = HttpRoutes.of[IO]: case Get -> Root => featureClient.getBooleanValue("feature1", false) .flatMap { case true => Ok("Hello, world!") case false => Ok(“Hello!”) }

Slide 33

Slide 33 text

【補足】CatsとCats Effect Cats Scalaの関数型プログラミングを強化するライブラリ https://typelevel.org/cats Cats Effect Catsベースで作られた非同期処理エンジン https://typelevel.org/cats-effect/ 33

Slide 34

Slide 34 text

フィーチャーフラグとIOモナド 一般にフラグの評価時にはフィーチャーフラグバックエ ンドとの通信が走り、副作用が発生すると言える Cats EffectのIOモナドを使って、副作用を生じる操作で ある宣言ができ、副作用を持つコードの評価タイミング を制御(遅延評価)できる openfeature-scalaはこれを利用しやすいインタフェース になっている 34

Slide 35

Slide 35 text

まとめ 35

Slide 36

Slide 36 text

まとめと展望 ScalaでWebアプリケーションを作っている人向けに、 フィーチャーフラグの標準化プロジェクトである OpenFeatureの世界観や実装例を紹介しました Scala界隈でも盛り上がれば、OpenFeatureのコミュニティ 下にScalaのSDKを置いておけるかも? 36

Slide 37

Slide 37 text

おしまい 37