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
830
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
Arthur
December 13, 2024
Tweet
Share
More Decks by Arthur
See All by Arthur
【実演版】カンファレンス登壇者・スタッフにこそ知ってほしいマイクの使い方 / 大吉祥寺.pm 2025
arthur1
1
890
オブザーバビリティプラットフォームの企画からリリースまで──PO・TLから見るMackerelの裏側 / ”ユーザー体験”の起点となるUXとアプリ開発──トヨタ・Nissan・はてなのプロダクトと開発現場から見える、設計の多様なアプローチ【TECH DRIVERS Day1】
arthur1
0
51
オブザーバビリティプラットフォーム開発におけるオブザーバビリティとの向き合い / Hatena Engineer Seminar #34 オブザーバビリティの実現と運用編
arthur1
0
450
デフォルトの16:9(960*540px)のケース / Google Slide Size Test
arthur1
0
3.4k
1920*1080pxに設定したケース / Google Slide Size Test
arthur1
0
3.3k
AWS AppConfigとOpenFeatureで手早く機能フラグを導入する[LT size] / CloudNative Days Winter 2024 船上LT会
arthur1
0
510
障害対応指揮の意思決定と情報共有における価値観 / Waroom Meetup #2
arthur1
5
760
go.mod、DockerfileやCI設定に分散しがちなGoのバージョンをまとめて管理する / Go Connect #3
arthur1
13
4.7k
Mackerel開発チームの障害対応演習 ──新卒エンジニアが障害対応指揮官を務めるに至るまでのステップ / Mackerel Drink Up 出張版@福岡
arthur1
0
390
Other Decks in Programming
See All in Programming
私の後悔をAWS DMSで解決した話
hiramax
4
210
「待たせ上手」なスケルトンスクリーン、 そのUXの裏側
teamlab
PRO
0
560
CloudflareのChat Agent Starter Kitで簡単!AIチャットボット構築
syumai
2
510
知っているようで知らない"rails new"の世界 / The World of "rails new" You Think You Know but Don't
luccafort
PRO
1
180
複雑なフォームに立ち向かう Next.js の技術選定
macchiitaka
2
180
go test -json そして testing.T.Attr / Kyoto.go #63
utgwkk
3
310
Android端末で実現するオンデバイスLLM 2025
masayukisuda
1
170
デザイナーが Androidエンジニアに 挑戦してみた
874wokiite
0
540
Cache Me If You Can
ryunen344
2
3k
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
290
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
870
Laravel Boost 超入門
fire_arlo
3
220
Featured
See All Featured
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Statistics for Hackers
jakevdp
799
220k
4 Signs Your Business is Dying
shpigford
184
22k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.8k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
How to Think Like a Performance Engineer
csswizardry
26
1.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.4k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Context Engineering - Making Every Token Count
addyosmani
3
58
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