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
Airパッケージの深掘り 〜変更検知の仕組み〜
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Naoya
September 19, 2025
210
0
Share
Airパッケージの深掘り 〜変更検知の仕組み〜
DMM.go #11の登壇資料です
https://dmm.connpass.com/event/363839/
Naoya
September 19, 2025
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
331
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.1k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.5k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
410
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
170
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
220
How to Talk to Developers About Accessibility
jct
2
200
The Invisible Side of Design
smashingmag
302
52k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.5k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
570
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
210
Abbi's Birthday
coloredviolet
2
7.6k
Transcript
© DMM © DMM CONFIDENTIAL Airパッケージの深掘り 〜変更検知の仕組み〜 大野 直哉 メディア基盤開発部
配信基盤グループ DMM.go #11
© DMM 自己紹介 名前: 大野直哉 今年4月に入社した25新卒 8月から配信基盤グループに所属 2
© DMM 発表動機 ➢ これまでGoの開発でAirを導入することが多かった ◦ 新卒の技術研修でもAirを利用していた ➢ そもそもAirはどのようにして動いているのか? 3
Airのソースコードを読んで調べてみました 今日はその内容について発表します
© DMM 目次 1. Airの概要 2. 変更検知の概要 3. Watcherの内部処理の詳細 4
© DMM Airの概要 1. Airの概要 2. 変更検知の概要 3. Watcherの内部処理の詳細 5
© DMM Airとは? ➢ Goのライブリロードのツール ◦ ライブリロードとは ▪ 手動でアプリケーションを停止、再起動せずにコードの変更がリアルタイムに反映される仕 組み
➢ Airを導入することで開発速度と開発体験を向上させることができる 6 https://github.com/air-verse/air
© DMM Airとは? 実際の動作のログ 7 main.goを変更を検知して ビルド、リロードが実行され ている
© DMM Airの全体図 8 リロード ビルド 変更検知 Air ソースコード 実行環境
開発者 ←←👀
© DMM Airの全体図 9 リロード ビルド 変更検知 Air ソースコード 実行環境
開発者 ←←👀 どのようにしてソースコードの 監視を実現しているか?
© DMM 変更検知の概要 1. Airの概要 2. 変更検知の概要 3. Watcherの内部処理の詳細 10
© DMM ➢ Watcherから通知を受け取るとビルド以降の処理が走る Watcher 11 変更検知 Watcher リロード チャネル
main goroutine ビルド goroutine コードの変更を監視
© DMM Watcher 12 Watcher 実行ディレクトリ直下の全ての Goファイルを監視 監視対象は設定ファイルから変更可能
© DMM Watcher 13 Watcher ファイルが変更されると、main goroutineに通知 main.go main.goが変更
© DMM Watcher 14 Watcher Watcherはどのように 変更を検知しているのか?
© DMM hugoのWatcher ➢ AirのWatcherはhugoを利用 ➢ hugoのfilenotifyで定義された Watcherを呼び出す 15 https://github.com/air-verse/air/
blob/master/runner/watcher.go
© DMM hugoとは? ➢ Goの静的サイト作成用のパッケージ ➢ コンテンツをマークダウンで管理する ◦ コンテンツの変更を検知してリロードされて最新のコンテンツが反映される 16
https://github.com/gohugoio/hugo この機能をAirで利用
© DMM hugoのWatcher ➢ hugoには二種類のWatcherが存在する ◦ Watcher自体のインタフェースは共通 17 ➢ EventWatcher
OSの機能を利用してコードの変 更をリアルタイムで検知する ➢ PollingWatcher 一定周期でコードをチェックを回し て変更を検知する EventWatcherを利用できないケー スで使用 https://github.com/gohugoio/hugo/blob/ master/watcher/filenotify/filenotify.go
© DMM hugoのWatcher ➢ hugoには二種類のWatcherが存在する 18 ➢ EventWatcher ファイルの変更をリアルタイムで検 知する
➢ PollingWatcher 一定周期でファイルをチェックを回 して変更を検知する AirではどちらのWatcherも利用可能 falseの場合はEventWatcher trueの場合はPollingWatcher ※デフォルトはfalse
© DMM hugoのWatcher ➢ hugoには二種類のWatcherが存在する 19 ➢ EventWatcher ファイルの変更をリアルタイムで検 知する
➢ PollingWatcher 一定周期でファイルをチェックを回 して変更を検知する それぞれのWatcherはどのように 変更を検知しているか?
© DMM Watcherの内部処理の詳細 1. Airの概要 2. 変更検知の概要 3. Watcherの内部処理の詳細 20
© DMM EventWatcher ➢ EventWatcherはfsnotifyのWatcherをそのまま利用したもの 21 https://github.com/gohugoio/hugo/blob/master/watcher/filenotify/filenotify.go
© DMM fsnotifyとは? ➢ Goのファイルシステムのイベントを取得するパッケージ ◦ ファイル・ディレクトリの操作情報を取得できる ➢ OSの機能を活用する ◦
ファイルの変更、作成、削除の際に発生するイベントをOSから受信 22 https://github.com/fsnotify/fsnotify
© DMM fsnotifyとは? ➢ 複数のプラットフォームに対応している 23 https://github.com/fsnotify/fsnotify/blob/main/README.md
© DMM Linuxでのイベント取得 ➢ inotifyインスタンスと通信するファイルディスクリプタを取得 ◦ OSのinotify APIの機能を利用 ➢ inotifyインスタンスを監視することでファイルの変更を検知
24 ファイルシステムを監視するための機能 https://github.com/fsnotify/fsnotify/blob/main/backend_inotify.go
© DMM ファイルディスクリプタとは? ➢ リソースのアクセスの際にOSから割り振られる番号(整数値) ◦ アクセスする対象を識別する ▪ ファイルだけではなく、標準入出力などのその他のリソースも扱う ◦
アクセスの終了後は割り振った番号は解放される 25 ファイルディスクリプタを割 り当て
© DMM 監視対象の設定 ➢ ファイルディスクリプタからinotifyを読み込む場合、 全てのファイルの変更を取得してしまう →指定したパス直下のファイルの変更のみを取得する ウォッチディスクリプタを生成 ウォッチディスクリプタからinotifyのイベントを取得する 26
https://github.com/fsnotify/fsnotify/blob/main/backend_inotify.go
© DMM 変更検知の流れ ➢ inotifyインスタンスを監視して変更を検知 27 Watcher イベント通知 送信 inotifyイベント
監視
© DMM 変更検知の流れ ➢ inotifyからイベントを取得するまで停止 28 Watcher イベント通知 送信 inotifyイベント
監視 ブロック
© DMM Watcher 変更検知の流れ 29 イベント通知 送信 inotifyイベント 監視 fsnotify.Write
unix.IN_MODIFY ➢ inotifyのイベントを取得すると通知を送信
© DMM EventWatcherまとめ ➢ fsnotifyのWatcherを利用している ➢ OS自体の機能を活用してファイル変更のイベントを受信する 30
© DMM PollingWatcher ➢ 一定の周期でコードに変更が加えられているかチェックする ➢ 関数名や入出力の形式はfsnotifyのWatcherを踏襲している 31 https://github.com/gohugoio/hugo/blob/ master/watcher/filenotify/filenotify.go
© DMM Pollingを実行する周期の計測 ➢ pollingを実行する周期の計測にはTickerを利用 32 指定したintervalが経過するとチャネルに メッセージを送信する https://github.com/gohugoio/hugo/blob/master/watcher/filenotify/poller.go
© DMM Pollingを実行する周期の計測 ※Airで設定されるpolling interval ➢ デフォルト値は最小値である500msに設定されている ➢ 設定ファイルから変更が可能 33
https://github.com/air-verse/air/blob/master/runner/ watcher.go
© DMM Pollingを実行する周期の計測 ➢ Tickerからメッセージが送られるとファイルチェックが実行される ◦ チェックが完了すると次のメッセージが送られるまで待機 34 待機 Ticker
チャネル Watcherのgoroutine 変更チェック tickerのgoroutine 一定周期で メッセージを送信
© DMM PollingWatcherの監視対象 ➢ ファイル・ディレクトリのメタ情報を監視して変更を確認する 35 Watcher 最終変更時間 ファイルサイズ
© DMM Watcherの監視対象 変更チェックではファイル・ディレクトリのメタ情報を監視している 36 Watcher 最終変更時間 2025-09-17 19:00:00→2025-09-17 19:00:10
ファイルサイズ 500B→510B fsnotify.Write
© DMM Watcherの監視対象 変更チェックではファイル・ディレクトリのメタ情報を監視している 37 Watcher 最終変更時間 2025-09-17 19:00:00→2025-09-17 19:00:10
ファイルサイズ 500B→510B fsnotify.Write 前のpolling時点の 情報は変数で保持
© DMM PollingWatcherまとめ ➢ 一定周期でファイル変更を監視している ➢ ファイルの最終変更時間とサイズから変更を検知する 38
© DMM まとめ ➢ Airはコードの変更を検知することで最新のコードを反映している ➢ コードの変更検知にはhugo,fsnotifyが大きく関わっている ➢ 変更を検知するWatcherは二種類存在する ◦
EventWatcher ▪ OS自体のイベントを取得して変更を検知する ▪ Airではこちらがデフォルトの選択肢 ◦ PollingWatcher ▪ 一定周期でファイルをチェックして変更を検知する 39
© DMM ご清聴ありがとうございました