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
20
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
Grafana Alloy Best Practice
line_developers_tw
PRO
0
24
Distributed Tracing in LINE Taiwan
line_developers_tw
PRO
0
25
只有 Status page 還不夠!講人話才知道 Infra 發生什麼事
line_developers_tw
PRO
2
200
LINE Chatbot 的終極進化:如何使用 Gemini、多模態和 Gemma 突破對話式 AI 的界限
line_developers_tw
PRO
0
420
高中生的純軟外商生活攻略
line_developers_tw
PRO
0
110
TECH FRESH 實習分享
line_developers_tw
PRO
0
28
如何跨入資料科學
line_developers_tw
PRO
0
20
大AI時代,高中生該如何 找到自己的大秘寶
line_developers_tw
PRO
0
33
透過 Cloud Function + Firebase 與 Gemini Pro Vision 打造一個旅遊小幫手 LINE ChatBot
line_developers_tw
PRO
0
1.7k
Other Decks in Technology
See All in Technology
すぐに始めるAWSコスト削減。短期でできる改善策と長期的な運用負荷軽減への取り組み方を解説
ncdc
1
120
目標設定と習慣化で今よりも一歩生産性を上げる
sansantech
PRO
7
2.3k
なぜクラウドサービスで Web コンソールを提供するのか
shuta13
4
1.3k
#Zenoh 完全に理解した 〜組込み純情篇〜
takasehideki
1
450
FastConnect の冗長性
ocise
0
7.1k
APIのドキュメント化何使ってますか?
miu_crescent
2
160
タイミーのBraze活用 ~PUSH通知を活用したレコメンド~
ozeshun
2
120
Staff Engineer / 20240827 Yuichiro Masui
shift_evolve
0
150
LLM を現場で評価する
asei
4
680
Oracle Database Backup Service:サービス概要のご紹介
oracle4engineer
PRO
0
4k
いまからでも遅くない! コンテナでWebアプリケーションを 動かしてみよう(1)Gitハンズオン
nomu
0
280
セキュリティ監視の内製化 効率とリスク
mixi_engineers
PRO
4
640
Featured
See All Featured
Facilitating Awesome Meetings
lara
49
5.9k
Being A Developer After 40
akosma
82
580k
Become a Pro
speakerdeck
PRO
22
4.8k
Music & Morning Musume
bryan
46
6k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
230
17k
Stop Working from a Prison Cell
hatefulcrawdad
266
20k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
22
1.7k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
28
2.2k
The Illustrated Children's Guide to Kubernetes
chrisshort
46
48k
GraphQLの誤解/rethinking-graphql
sonatard
65
9.7k
Writing Fast Ruby
sferik
623
60k
Imperfection Machines: The Place of Print at Facebook
scottboms
263
13k
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