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
500
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
240
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
660
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する / Go Connect #3
arthur1
13
3.8k
Mackerel開発チームの障害対応演習 ──新卒エンジニアが障害対応指揮官を務めるに至るまでのステップ / Mackerel Drink Up 出張版@福岡
arthur1
0
320
slog登場に伴うloggerの取り回し手法の見直し / kamakura.go #6
arthur1
1
2.6k
otelcol receiver 自作RTA / Pepabo Tech Conference #22 春のSREまつり
arthur1
0
3.3k
見せ算をScalaで実装してみた / Scalaわいわい勉強会 #2
arthur1
0
2.3k
技術習得を支え続けた私の個人開発ヒストリー / Hatena Engineer Seminar #28
arthur1
1
1.8k
Scala の好きなところ 難しいところ / #scala_waiwai
arthur1
0
1.5k
Other Decks in Programming
See All in Programming
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
120
Java Webフレームワークの現状 / java web framework at burikaigi
kishida
9
2.2k
GitHub Actions × RAGでコードレビューの検証の結果
sho_000
0
260
WebDriver BiDiとは何なのか
yotahada3
1
140
ソフトウェアエンジニアの成長
masuda220
PRO
10
1.1k
仕様変更に耐えるための"今の"DRY原則を考える / Rethinking the "Don't repeat yourself" for resilience to specification changes
mkmk884
0
190
Amazon S3 TablesとAmazon S3 Metadataを触ってみた / 20250201-jawsug-tochigi-s3tables-s3metadata
kasacchiful
0
170
データベースのオペレーターであるCloudNativePGがStatefulSetを使わない理由に迫る
nnaka2992
0
150
SpringBoot3.4の構造化ログ #kanjava
irof
2
1k
Rubyで始める関数型ドメインモデリング
shogo_tksk
0
110
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
10
3.6k
GAEログのコスト削減
mot_techtalk
0
120
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.6k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
How to train your dragon (web standard)
notwaldorf
91
5.8k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
330
21k
Faster Mobile Websites
deanohume
306
31k
Optimising Largest Contentful Paint
csswizardry
34
3.1k
Intergalactic Javascript Robots from Outer Space
tanoku
270
27k
Docker and Python
trallard
44
3.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
29k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
KATA
mclloyd
29
14k
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