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
650
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.2k
見せ算を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
Amazon Bedrock Multi Agentsを試してきた
tm2
1
280
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
150
負債になりにくいCSSをデザイナとつくるには?
fsubal
9
2.4k
2,500万ユーザーを支えるSREチームの6年間のスクラムのカイゼン
honmarkhunt
6
5.2k
ARA Ansible for the teams
kksat
0
150
Pythonでもちょっとリッチな見た目のアプリを設計してみる
ueponx
1
530
Kubernetes History Inspector(KHI)を触ってみた
bells17
0
220
DevinとCursorから学ぶAIエージェントメモリーの設計とMoatの考え方
itarutomy
1
670
CloudNativePGがCNCF Sandboxプロジェクトになったぞ! 〜CloudNativePGの仕組みの紹介〜
nnaka2992
0
220
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
240
Open source software: how to live long and go far
gaelvaroquaux
0
630
Immutable ActiveRecord
megane42
0
140
Featured
See All Featured
jQuery: Nuts, Bolts and Bling
dougneiner
63
7.6k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
33
2.8k
Docker and Python
trallard
44
3.3k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
29
2.2k
Thoughts on Productivity
jonyablonski
69
4.5k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
174
51k
What's in a price? How to price your products and services
michaelherold
244
12k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.1k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Statistics for Hackers
jakevdp
797
220k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
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