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
Kyash TechTalk #1 Serverside
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Keiichi Hirobe
January 28, 2021
Programming
1
340
Kyash TechTalk #1 Serverside
Kyash TechTalk #1 Serverside
2021/1/29
Datadog Monitorを利用した
汎用的なCircuit Breakerを作った話
Keiichi Hirobe
January 28, 2021
Tweet
Share
Other Decks in Programming
See All in Programming
AWS re:Invent 2025参加 直前 Seattle-Tacoma Airport(SEA)におけるハードウェア紛失インシデントLT
tetutetu214
2
120
Apache Iceberg V3 and migration to V3
tomtanaka
0
170
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
AIによるイベントストーミング図からのコード生成 / AI-powered code generation from Event Storming diagrams
nrslib
2
1.9k
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
220
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
600
KIKI_MBSD Cybersecurity Challenges 2025
ikema
0
1.3k
組織で育むオブザーバビリティ
ryota_hnk
0
180
副作用をどこに置くか問題:オブジェクト指向で整理する設計判断ツリー
koxya
1
610
Featured
See All Featured
Believing is Seeing
oripsolob
1
56
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
2k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
94
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
61
52k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
34k
The Curse of the Amulet
leimatthew05
1
8.7k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
110
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
450
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
440
Transcript
Datadog Monitorを利用した 汎用的なCircuit Breakerを作った話 Kyash TechTalk #1 Serverside 2021/1/29
2 • 名前:廣部圭一 • GitHub: KeiichiHirobe • 年齢: 31 •
2019/5/20入社 • TechLead @Fundsチーム • 興味あること:データベース実装 自己紹介
3 11.5 章において、マイクロサービスにおいて障害のサービ ス全体への影響を最小限にする方法として大きく3つ紹介さ れています。 • タイムアウト • 隔壁 •
Circuit Breaker そもそもCircuit Breakerって何?
4 • タイムアウトを指定することでプロセスが滞留する可能性をへらしま す • 基本的には7~9秒くらいのタイムアウトを指定していることが多い。特 に外部ベンダーのAPIを叩く場合には必須です 困ったことにベンダーのAPI仕様にはタイムアウト1分以上にすることが必 須といったことが仕様書に明記されている場合もあります。 タイムアウトを設定する
5 説明がふわっとしていたが、「被害が最小限になるよ うにサービス間に壁をもうけような仕組みや設定等」 ぽい Goなら、MaxConnsPerHostにてホストごとのクライアントの 接続上限を指定できます。デフォルトは0で無制限。 隔壁
6 隔壁の一種 まさにブレーカーと同じ Circuit Breaker
7 実はKyashではCircuit Breakerの仕組みを一部ではすでに利用していました。 • cronで数分ごとにjobを起動し、そのjobではNew Relic(監視ツール)の 特定のメトリクス(レスポンスタイムの90パーセンタイルといったメトリ クス)を参照 • 閾値をもとにCircuit
Breakerを発動するべきか判断し、フラグをRedis に保存。呼び出し側サービスではRedisを参照し、リクエストすべきか 判断 移行前
8 監視ツール移行にてこうしようとしていた
9 今後も様々な外部ベンダーと接続していく。新しいCircuit Breakerは継続 的に必要になっていくけど、このままメンテしていくのは辛そう メンテ辛そう
10 新規のCircuit Breakerを作る時に • Datadog Monitor設定 • SNS • Lambda
のセットが新規に必要になります。これは都度作成するのは明らかに大 変そうです。 SNS/Lambdaのセットを毎度作る?
11 • 新規のCircuit BreakerのためにLambdaにIAMを追加で付与する可能 性が高い(例えばRDSを参照して判断する必要が生じるなど) • ^の結果、Lambdaが様々なアクセス権限をもつことになり、好ましくな い • 様々なサービスのドメイン知識がLambdaに入り乱れる(そもそもドメ
イン知識がLambdaに漏れ出るのさえも避けたかったはず) 1つのLambda関数に追加していく?
12 DatadogMonitor -> SNS -> Lambdaの流れはそのまま踏襲するとして、 以下を満たしたい。でも無理では? • Lambdaは各マイクロサービスのRESTAPIを叩くだけ ◦
Lambdaはどこをたたけばいい( callbackのエンドポイント)かどうやって知るべき か ◦ イベントに付随する情報はどうやって取得すべきか ▪ 例えば、銀行チャージの場合、どの銀行かを把握するために銀行コード (銀行を一意にするコード)が必要。 ▪ ^を把握する処理をLambdaに書き始めると結局 Lambdaが汎用的でなくな るのでNG • あらゆるmonitor typeに対応したい 汎用的な仕組みを作ろう!!
13 Q: Lambdaはどこをたたけばいい(callbackのエンドポイント)かどうやっ て知るべきか? A: 適当なキーワード(以下の例ではcircuit-breaker-callback)にエンドポ イントを指定する {{#is_alert}} circuit-breaker-callback: https://serciceA/dd_circuit_breaker/callback
{{/is_alert}} {{#is_alert_recovery}} circuit-breaker-callback: https://serciceA/dd_circuit_breaker/callback {{/is_alert_recovery}} {{#is_warning}} circuit-breaker-callback: https://serciceA/dd_circuit_breaker/callback {{/is_warning}} @slack-tech-channel @sns-dd-circuit-breaker 汎用的な仕組みを作ろう!!
14 Q: イベントに付随する情報はどうやって取得すべきか。あらゆるmonitor typeに対応できるのか? A: Datadogが提供するREST APIを利用する CURL curl -X
GET "https://api.datadoghq.com/api/v1/events/${event_id}" \ -H "Content-Type: application/json" \ -H "DD-API-KEY: ${DD_CLIENT_API_KEY}" \ -H "DD-APPLICATION-KEY: ${DD_CLIENT_APP_KEY}" Goのクライアントライブラリ configuration := datadog.NewConfiguration() api_client := datadog.NewAPIClient(configuration) resp, r, err := api_client.EventsApi.GetEvent(context.Background(), eventId).Execute() 汎用的な仕組みを作ろう!!
15 何をもとにAPIを叩くか event_id/monitor_idはSNSのメッセージにデフォルトで含まれます。 Datadogが提供するREST API
16 • Eventが起きた対象の銀行コードは何か ◦ tagから取得 • Eventが起きた時刻はいつか • Eventはwarn/alert/recoveryなのか •
Monitorにおいてalert/warn状態の銀行コードは何か • おそらくDatadogのWebUIで確認できるものは全て取得可能 Datadogが提供するREST API APIで何が取得可能か
17 結果、こうなった
18 • SNSのmessageをもとに、event_id/monitor_idを判別 • Circuit-breaker-callbackが指定されていれば、event_id/monitor_id とともに叩く。なければ何もせず終了 • callbackのレスポンスが200以外であれば、エラー • 途中でエラーがおきればエラーを投げるだけで何もしない(slack通
知もしない) で、結局Lambdaは何をするのか
19 • 再送回数は2回(デフォルト)で0~2まで設定可能 • 初回リクエスト~再送1回目まで間隔は1分、再送1回目~再送1回目 の間隔は2分で変更不可 • デットレターキューを設定することで、再送上限にて失敗した時に enqueueされる ◦
deadletterqueueに対してdatadogmonitorで監視してslack通 知 • 再送間隔はexponential backoffで行われ、最大6時間試行される 再送、後処理はLambdaが全部面倒みてくれ ます
20 再掲
21 • Lambdaの改修は一切不要です • 必要な作業がサーバサイドエンジニア内で完結しています ◦ Lambdaから各サービスへのネットワーク到達性があれば無問 題 • 既にあるコード資源(レポジトリやドメイン実装など)を利用でき、マイ
クロサービス外へのドメイン知識の流出を防ぐことができます 結局、何がうれしいのか
22 • alert/recoveryの閾値の決めは難しい • よくよく考えると、「datadog monitorのイベントを各マイクロサービス でハンドリングする仕組み」なので、circuit-breakerの用途以外にも 使えるはず! • 話し切れない部分も多かったので、興味ある方は
https://qiita.com/behiron/items/6b1ae68bc338a1e16a74 最後
Thank you 23