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
The Magic of Feature Toggles:
Search
LINE Developers Taiwan
PRO
July 17, 2024
Technology
0
35
The Magic of Feature Toggles:
Speaker: Aki Wang, Noah Hsu
Event: iThome DevOps Day 2024
LINE Developers Taiwan
PRO
July 17, 2024
Tweet
Share
More Decks by LINE Developers Taiwan
See All by LINE Developers Taiwan
在 GCP 運用 Parse 全家餐管理那堆 AI 應用的資料
line_developers_tw
PRO
0
12
40歲的我會給20歲的自己,關於軟體開發的7個建議
line_developers_tw
PRO
0
4.2k
從零到一:轉碼仔的實習攻略
line_developers_tw
PRO
0
10
如何在團隊發揮數據影響力: 以電商資料科學家為例
line_developers_tw
PRO
1
32
做Data超讚的 誰懂?
line_developers_tw
PRO
0
17
iOS Live Activity: Opportunities & Challenges
line_developers_tw
PRO
1
96
掌握 Feature Toggle 與 OpenFeature 規範
line_developers_tw
PRO
0
190
用 AI 和 LINE Bot 簡化生活:讓圖片告訴你何時該忙!-- LINE 工作坊
line_developers_tw
PRO
0
700
Scaling The E-Commerce Recommendation System
line_developers_tw
PRO
0
58
Other Decks in Technology
See All in Technology
UI State設計とテスト方針
rmakiyama
2
450
AI時代のデータセンターネットワーク
lycorptech_jp
PRO
1
280
生成AIをより賢く エンジニアのための RAG入門 - Oracle AI Jam Session #20
kutsushitaneko
4
220
10個のフィルタをAXI4-Streamでつなげてみた
marsee101
0
160
バクラクのドキュメント解析技術と実データにおける課題 / layerx-ccc-winter-2024
shimacos
2
1.1k
watsonx.ai Dojo #5 ファインチューニングとInstructLAB
oniak3ibm
PRO
0
160
AIのコンプラは何故しんどい?
shujisado
1
190
TSKaigi 2024 の登壇から広がったコミュニティ活動について
tsukuha
0
160
DevOps視点でAWS re:invent2024の新サービス・アプデを振り返ってみた
oshanqq
0
180
NilAway による静的解析で「10 億ドル」を節約する #kyotogo / Kyoto Go 56th
ytaka23
3
370
ゼロから創る横断SREチーム 挑戦と進化の軌跡
rvirus0817
2
260
非機能品質を作り込むための実践アーキテクチャ
knih
3
980
Featured
See All Featured
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
How to Ace a Technical Interview
jacobian
276
23k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
Code Reviewing Like a Champion
maltzj
520
39k
How STYLIGHT went responsive
nonsquared
95
5.2k
Statistics for Hackers
jakevdp
796
220k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
26
1.5k
Documentation Writing (for coders)
carmenintech
66
4.5k
A designer walks into a library…
pauljervisheath
204
24k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Transcript
None
The Magic of Feature Toggles
王天甫 (Aki Wang) 許子庭 (Noah Hsu)
Feature Toggle
Function A Function B
Function A Function B
None
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
return ResponseEntity.ok(buildLayoutOrder()); } private Map<?, ?> buildLayoutOrder() { throw new UnsupportedOperationException("Not implemented yet"); } }
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
boolean isLayoutOrderEnabled = false; if (isLayoutOrderEnabled) { return ResponseEntity.ok(buildLayoutOrder()); } else { return ResponseEntity.notFound().build(); } } private Map<?, ?> buildLayoutOrder() { throw new UnsupportedOperationException("Not implemented yet"); } }
BUY NOW BUY NOW V S
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
return ResponseEntity.ok(buildLayoutOrder()); } private Map<?, ?> buildLayoutOrder() { return Map.of("color", "blue", "radius", "8px", "pos", "page"); } }
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
return ResponseEntity.ok(buildLayoutOrder()); } private Map<?, ?> buildLayoutOrder() { return Map.of("color", "green", "radius", "0px", "pos", "bottomNav"); } }
@RestController public class LayoutController { @GetMapping("/layouts/order") public ResponseEntity<?> getLayoutOrder() {
String themeName = "themeB"; switch (themeName) { case "themeB": return ResponseEntity.ok(buildThemeBLayoutOrder()); default: return ResponseEntity.ok(buildThemeALayoutOrder()); } } private Map<?, ?> buildThemeALayoutOrder() { return Map.of("color", "blue", "radius", "8px", "pos", "page"); } private Map<?, ?> buildThemeBLayoutOrder() { return Map.of("color", "green", "radius", "0px", "pos", "bottomNav"); } }
Invisibility Speed Experimentation Safety Live Update
longevity dynamism Release Toggles Ops Toggles Permission Toggles Experiment Toggles
years months weeks days changes with a deployment changes with runtime re-configuration changes with each request from https://martinfowler.com/articles/feature-toggles.html
Feature Toggle is second best solution. The best solution is
to find a way to gradually integrate, without Feature Branches or Feature Toggles
Flagship4j
Standardizing Feature Flagging for Everyone
One SDK, any backend Supports your favorite tools Speaks your
language
One SDK, any backend OpenFeatureAPI api = OpenFeatureAPI.getInstance(); api.setProvider(new OpenFlagrProvider());
Client client = api.getClient(); Boolean isHelloWorldEnabled = client.getBooleanValue("hello-world-enabled", false); if (isHelloWorldEnabled) { System.out.println("Hello World"); }
Supports your favorite tools
Speaks your language
OpenFlagr Open source feature flagging, A/B testing, and dynamic configuration
microservice in Go.
None
None
USE CASES
ON On / Off 100%
ON Rollout 100%
Blue A / B Testing Green 50% 50%
Q & A
None