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
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Building Applications with DynamoDB
mza
96
7k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Navigating Weather and Climate Data
rabernat
0
190
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
240
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.8k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
2
1k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Between Models and Reality
mayunak
3
290
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
160
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
140
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
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 ご清聴ありがとうございました