Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
Search
Arthur
December 13, 2024
Programming
1
130
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
Arthur
December 13, 2024
Tweet
Share
More Decks by Arthur
See All by Arthur
AWS AppConfigとOpenFeatureで手早く機能フラグを導入する[LT size] / CloudNative Days Winter 2024 船上LT会
arthur1
0
160
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
580
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する / Go Connect #3
arthur1
12
3.3k
Mackerel開発チームの障害対応演習 ──新卒エンジニアが障害対応指揮官を務めるに至るまでのステップ / Mackerel Drink Up 出張版@福岡
arthur1
0
280
slog登場に伴うloggerの取り回し手法の見直し / kamakura.go #6
arthur1
1
2.3k
otelcol receiver 自作RTA / Pepabo Tech Conference #22 春のSREまつり
arthur1
0
3.1k
見せ算をScalaで実装してみた / Scalaわいわい勉強会 #2
arthur1
0
2.1k
技術習得を支え続けた私の個人開発ヒストリー / Hatena Engineer Seminar #28
arthur1
1
1.7k
Scala の好きなところ 難しいところ / #scala_waiwai
arthur1
0
1.3k
Other Decks in Programming
See All in Programming
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
140
テストコード文化を0から作り、変化し続けた組織
kazatohiei
2
1.4k
命名をリントする
chiroruxx
1
340
Amazon Aurora Serverless v2のアプデと、Amazon Aurora PostgreSQL Limitless DatabaseのGAについて
satoshi256kbyte
0
120
The rollercoaster of releasing an Android, iOS, and macOS app with Kotlin Multiplatform | droidcon Italy
prof18
0
150
layerx_20241129.pdf
kyoheig3
2
270
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
430
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
140
MCP with Cloudflare Workers
yusukebe
2
190
Effective Signals in Angular 19+: Rules and Helpers @ngbe2024
manfredsteyer
PRO
0
120
Cloudflare MCP ServerでClaude Desktop からWeb APIを構築
kutakutat
1
390
htmxって知っていますか?次世代のHTML
hiro_ghap1
0
250
Featured
See All Featured
The Language of Interfaces
destraynor
154
24k
Making the Leap to Tech Lead
cromwellryan
133
9k
A better future with KSS
kneath
238
17k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
170
Building a Scalable Design System with Sketch
lauravandoore
460
33k
Music & Morning Musume
bryan
46
6.2k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.8k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
What's in a price? How to price your products and services
michaelherold
243
12k
Docker and Python
trallard
41
3.1k
Building Adaptive Systems
keathley
38
2.3k
Transcript
Scalaからはじめる OpenFeature入門 id:arthur-1 株式会社はてな 2024-12-13 Scalaわいわい勉強会 #4
Arthurと申します 株式会社はてな Mackerel開発チーム 「オブザーバビリティの実現」チーム テックリード・プロダクトオーナー 𝕏: @Arthur1__ Scalaわいわい勉強会では#1, #2でも 登壇しています
2
MackerelはScalaで作ってます 3
おしながき • フィーチャーフラグとその効能 • OpenFeatureが目指す標準化 • ScalaでOpenFeatureを使う方法2選 ◦ デモもあるよ 4
フィーチャーフラグと その効能 5
フィーチャーフラグ ソースコードを変更せず、特定の機能や動作の 有効/無効を制御する仕組み ソースコードを変更するより、フラグを操作する方 が、手軽・高速・安全に適用でき、かつ操作を管理で きて良いという仮定があるはず 6
機能リリースとデプロイの分離 ロールバックの範囲を小さく・かかる時間を短くできる 複数のリリースを含んだデプロイ後にロールバックしたいと き、リリース=デプロイだと他の機能も巻き込まれて影響範囲 が大きくなってしまうか、revertからの再リリースに時間がか かる フラグを変えるだけでロールバックできるなら、フィーチャー フラグの仕組みによっては一瞬でロールバック可能 cf.) 障害対応指揮の意思決定と情報共有における価値観
/ Waroom Meetup #2 https://speakerdeck.com/arthur1/waroom-meetup-number-2?slide=19 7
トランクベース開発 トランク=mainブランチに対して細かく高い頻度で変更 を加えていく手法 大きなfeatureブランチを時間をかけて作っていくと、マージ した結果ビルドが壊れたり、そもそもコンフリクトしまくった りしてしまう フィーチャーフラグがあると、未完成部分の公開・利用 を防げて便利 8
特定のユーザーだけに提供 プライベートベータ 特定のユーザーにだけある機能を展開する 小さく作って検証を繰り返すアジャイル開発で効果的 例)あるユーザーからのフィードバックは欲しいけど、ひと まとまりのUIが完成しないと全ユーザーには見せづらい 9
不特定のユーザーだけに提供 カナリアリリース 部分的に機能を展開していく エラーの増加など、問題があったらすぐ切り戻す A/Bテスト どちらの方が良さそうかを検証する 10
OpenFeatureが 目指す標準化 11
OpenFeature フィーチャーフラグの標準化を目指すプロジェクト CNCFのIncubating Projectsに採択されている https://openfeature.dev/ 12 Branding Guidelines | OpenFeature
https://openfeature.dev/community/branding-guidelines/ (Licensed under CC BY 4.0)
OpenFeatureの現在地 高機能なフィーチャーフラグを利用するには、スタンドアロンの 機能フラグ設定管理サービスと、それと対話するクライアントが 必要とされる OpenFeatureは、フィーチャーフラグの評価をするAPIを、 特定のベンダーに依存しない形で提供するClientを提供する 13
OpenFeature Clientの構造 SDKが提供するフラグ評価APIは共通。フィーチャーフラグのバッ クエンドに合わせて、Providerを差し替える 14 Introduction | OpenFeature https://openfeature.dev/docs/reference (Licensed
under CC BY 4.0)
ベンダーフリーの標準化の嬉しさ こういった場合も、ソースコードの差分が少なくて済む: 「スモールスタートで環境変数をフィーチャーフラグのデータ ソースに使ってきたけど、高級な機能を持つフィーチャーフラ グSaaSを利用したいなあ……」 「外部のフィーチャーフラグSaaSは機能的にtoo muchだった から、費用を抑えられる手法に移行したいなあ……」 15
コード例(Java) 16 // OpenFeature Clientの初期化 OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProvider(new
YourFavoriteProvider()); Client client = api.getClient("my-app"); // フラグの評価 Boolean boolValue = client.getBooleanValue("feature1", false);
コード例(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);
SDKとProviderのやりとり SDKとProviderの結合はソースコード内で行われることが多い SDKが定めたプログラムとしてのインタフェースにProviderが 合わせる必要がある すなわち、(SDKの数)×(フィーチャーフラグバックエンド の数)だけProvider実装が存在する 18
様々な言語・環境向けのSDK https://openfeature.de v/ecosystem OpenFeatureコミュニ ティで管理されているもの は、本発表時点で13個 19
様々なProvider(Go SDKの場合) https://github.com/open-feature/go-sdk-contrib • 環境変数 • flagd • ConfigCat など、self-hosted
/ SaaS問わず、様々なフィーチャフラグ バックエンド向けのものが、OpenFeatureのリポジトリで 用意されている 20
OpenFeatureのいいところ • 標準に統一することで、認知負荷が減らせる • フィーチャーフラグバックエンドを差し替えるときも、 ソースコードの差分はProviderの注入部分だけ • 標準化により、「機能フラグはこういうことができるべき だ」というラインが宣言されている ◦
フィーチャーフラグの仕組みを自作するにしても、道標 になる 21
ScalaでOpenFeature を使う方法2選 22
ScalaでOpenFeatureを使う選択肢 今回は2つ紹介する: • open-feature/java-sdk • alexcardell/openfeature-scala 23
ScalaでOpenFeatureを使う選択肢 今回は2つ紹介する: • open-feature/java-sdk • alexcardell/openfeature-scala 24
open-feature/java-sdk https://github.com/open-feature/java-sdk OpenFeature公式で管理されているJava向けのSDK ScalaはJavaのライブラリ資産を活用することができる! という話をここでするということは、Scala向けの OpenFeature SDKは公式には存在していない😭 25
open-feature/java-sdkの特徴 長所 • OpenFeatureコミュニティ公式なので、用意されている Providerが多い ◦ https://github.com/open-feature/java-sdk-contrib を 見ると発表時点で10個 短所
• JVM以外では使えない 26
ScalaでOpenFeatureを使う選択肢 今回は2つ紹介する: • open-feature/java-sdk • alexcardell/openfeature-scala 27
alexcardell/openfeature-scala https://github.com/alexcardell/openfeature-scala Alex Cardell氏が開発したScala実装のSDK ドキュメント :https://alexcardell.github.io/openfeature-scala/ 28
alexcardell/openfeature-scalaの特徴 長所 • Scala NativeやScala.jsといったJVM以外の環境でも利用可能 • JVMで使うなら、公式のJava SDK向けに作られたProviderを こちらでも利用可能にするwrapperが用意されている •
Cats Effect との相性が良い 短所 • まだ実装中の機能も多い • JVM以外にも対応したProviderが少ない 29
デモ $ scala-cli package --power -o server server.scala $ ./server
30 Scala Native環境のhttp4sサーバで openfeature-scalaを使うデモコー ドを用意しました https://gist.github.com/Arthur1/ea142 d3cffbfe2f65f0d34340fa0dbc2
サーバ起動・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 ()
ハンドラ・フラグ評価部分 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!”) }
【補足】CatsとCats Effect Cats Scalaの関数型プログラミングを強化するライブラリ https://typelevel.org/cats Cats Effect Catsベースで作られた非同期処理エンジン https://typelevel.org/cats-effect/ 33
フィーチャーフラグとIOモナド 一般にフラグの評価時にはフィーチャーフラグバックエ ンドとの通信が走り、副作用が発生すると言える Cats EffectのIOモナドを使って、副作用を生じる操作で ある宣言ができ、副作用を持つコードの評価タイミング を制御(遅延評価)できる openfeature-scalaはこれを利用しやすいインタフェース になっている 34
まとめ 35
まとめと展望 ScalaでWebアプリケーションを作っている人向けに、 フィーチャーフラグの標準化プロジェクトである OpenFeatureの世界観や実装例を紹介しました Scala界隈でも盛り上がれば、OpenFeatureのコミュニティ 下にScalaのSDKを置いておけるかも? 36
おしまい 37