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
LINEマンガを支えるCoroutine / Coroutine in LINE Manga
Search
yyh_gl
March 12, 2026
Programming
0
14
LINEマンガを支えるCoroutine / Coroutine in LINE Manga
『Kotlinで挑む3社3様の技術課題 〜DDDによるリプレイス、モバイル基盤、大規模トラフィック〜』登壇資料
https://asken.connpass.com/event/384559/
yyh_gl
March 12, 2026
Tweet
Share
More Decks by yyh_gl
See All by yyh_gl
Kotlin言語仕様書への招待 〜コードの「なぜ」を読み解く〜 / Kotlin Language Specification
yyh_gl
0
85
入門Go言語仕様輪読会 Assignability / Go Language Specification Assignability
yyh_gl
0
260
事業をグロースさせるためにエンジニアができること / What engineers can do to grow a business
yyh_gl
2
1.5k
Goaを使ってAPIサーバ開発してみた / Develop API server by Goa
yyh_gl
3
2.6k
VCR in Go:モック自動生成で楽しちゃう話
yyh_gl
4
3.8k
Other Decks in Programming
See All in Programming
20260315 AWSなんもわからん🥲
chiilog
1
110
Fundamentals of Software Engineering In the Age of AI
therealdanvega
1
250
Ruby x Terminal
a_matsuda
7
590
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
200
AI主導でFastAPIのWebサービスを作るときに 人間が構造化すべき境界線
okajun35
0
710
S3ストレージクラスの「見える」「ある」「使える」は全部違う ─ 体験から見た、仕様の深淵を覗く
ya_ma23
0
390
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
400
New in Go 1.26 Implementing go fix in product development
sunecosuri
0
430
ロボットのための工場に灯りは要らない
watany
10
2.7k
ポーリング処理廃止によるイベント駆動アーキテクチャへの移行
seitarof
3
1k
20260313 - Grafana & Friends Taipei #1 - Kubernetes v1.36 的開發雜記:那些困在 Alpha 加護病房太久的 Metrics
tico88612
0
170
nuget-server - あなたが必要だったNuGetサーバー
kekyo
PRO
0
240
Featured
See All Featured
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
150
Crafting Experiences
bethany
1
84
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
170
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
390
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.1k
エンジニアに許された特別な時間の終わり
watany
106
240k
Rails Girls Zürich Keynote
gr2m
96
14k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.6k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
231
22k
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
240
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
For a Future-Friendly Web
brad_frost
183
10k
Transcript
LINEマンガを支える Coroutine Kotlinで挑む3社3様の技術課題 @株式会社コドモン 東京オフィス
自己紹介
▼ 名前 本田 雄亮 ▼ 所属企業 LINE Digital Frontier株式会社 ▼
Xアカウント @yyh_gl 3
今日話すこと LINEマンガは5500万DLを突破し 多くのユーザーにご利用いただいているサービスです。 そんなLINEマンガでは、パフォーマンスやリソース効率の観点から 非同期処理が有効に作用する場面が多々あります。 今日は、非同期処理においてLINEマンガで行っている工夫を紹介します。 4
LINEマンガ内でのルール
非同期処理に関する決まりごと LINEマンガの非同期処理に関するADRから一部抜粋。 • MUST: Coroutine(kotlinx.coroutines)を使用 • SHOULD : MangaScopeを使用 KotlinでCoroutineを使うことは(基本的には)当たり前。
今日はMangaScopeに焦点を当てて紹介します。 6
本発表の主役『MangaScope』
MangaScopeとは? LINEマンガで使用が推奨されている共通CoroutineScope。 ▼ MangaScopeに関する4つのポイント 1. Dispatchers.IO : DB操作といったブロッキングI/Oを安全に実行 2. SupervisorJob
: 1つの子ジョブの失敗が他の子ジョブに影響を与えない 3. Graceful Shutdown : 安全なシャットダウン 4. Observability : メトリクスやログ出力, トレーシングシステムをサポート 8
1. Dispatchers.IO
Dispatchers.IOベースのScope ブロッキングI/Oに最適化されたスレッドプール 内でコルーチンを実行。 LINEマンガの処理には多くのブロッキングI/Oが存在する。 例えば、DB操作や外部APIへのリクエスト、ファイル操作など。 Dispatchers.IOは、Dispatchers.Defaultとスレッドを共有しており、 不要なコンテキストスイッチやスレッド生成が行われにくい というメリットがある。 (論理的にはDispatchers.Defaultと分離されている) 10
2. SupervisorJob
SupervisorJobの基本 通常のJobでは、子ジョブが1つ失敗すると他の全子ジョブもキャンセル される。 SupervisorJobは子の失敗が他の子ジョブに影響を与えない 。 12
SupervisorJobを使う理由 例えば、 重い処理を複数実行するバッチがあるとする。 ひとつの処理(ジョブ)が失敗しても、 他の処理は継続したいときがある。 13 たまにあるよね
え、じゃあエラーが起きても 無視するの?
無視しないこともできる 1つのジョブでエラーが起きたら、他のジョブをキャンセルしたいときもある。 そんなときは親ジョブをキャンセルしてあげればよい。 15
無視しないこともできる 最終的にキャンセルはするけど 今実行している処理が終わるまで待ちたいときもある。 ↑ Graceful Shutdownじゃない…? 16
3. Graceful Shutdown
CoroutineをGraceful Shutdown MangaScopeはCoroutineのGraceful Shutdownに対応 している。 つまり、実行中のCoroutineについては 処理が終わるまで (できる限り)待機したうえでcloseできる。 18
処理終了までの3ステップ 1. 新規ジョブの起動を拒否 2. 実行中の子ジョブを1つずつjoin → 完了待ち 3. supervisorJob.cancel()により残存ジョブをキャンセル ※
2の処理以降、deadlineを超過した時点ですべての処理を強制終了 19
処理終了までの3ステップ 1. 新規ジョブの起動を拒否 2. 実行中の子ジョブを1つずつ join → 完了待ち 3. supervisorJob.cancel()により残存ジョブをキャンセル
※ 2の処理以降、deadlineを超過した時点ですべての処理を強制終了 20
ステップ2の実装イメージ > 実行中の子ジョブを1つずつjoin → 完了待ち selectで「子ジョブの完了」と「タイムアウト」を非同期に競争 させる。 21
AutoCloseableとSpring連携 MangaScopeは、AutoCloseableを実装しておりclose関数を提供。 close関数にてGracefulなShutdownを提供。 Spring Beanとして登録すれば サーバーシャットダウン時に自動で close関数が呼ばれる 。 つまり、CoroutineのGraceful ShutdownをSpringが自動実行してくれる
。 22
4. Observability
MangaScopeがObservabilityを提供 MangaScopeは各種メトリクス収集の仕組みを提供。 加えて、分散トレーシングもサポート。 launchWithMetricsおよびasyncWithMetricsという2つの関数により実現。 24
xxxWithMetricsがやること launchWithMetricsおよびasyncWithMetricsは それぞれCoroutineScope.launchとCoroutineScope.asyncの実行に加え 下記処理のためのセットアップを行う。 • メトリクス収集 ◦ コルーチンの開始回数 ◦ コルーチンの終了回数
◦ 現在実行中のコルーチン数 ◦ コルーチンの実行時間 • 分散トレーシング 25
収集したメトリクスを可視化 非同期処理が絡む不具合は、即座にエラーにならず静かに蓄積 する。 そして、ある日突然、CPU負荷上昇やメモリ枯渇として顕在化。 メトリクスの可視化によりこうした問題を早期発見できる。 26
Coroutineに潜む課題
ThreadLocal消失問題 Coroutineの実行は複数のスレッドをまたぐ可能性がある。 したがって、基本的にはThreadLocalが使えない 。 MangaScopeは3つの情報をThreadLocalで共有したい。 = Coroutineではスレッドを超えて扱いたい。 • SLF4J MDC
• 分散トレーシング情報(Zipkin) • LINEマンガ独自情報 28
MangaScopeでは CoroutineContextを使って スレッドをまたいだ情報共有を実現 。 例えば、SLF4JのMDCはMDCContextという コンテキスト(ThreadContextElement)を提供している。 MDCContextをMangaScopeのCoroutineContextにセットすれば MDC情報をスレッドを超えて参照できる。 情報のスレッド超え 29
情報のスレッド超え 30
まとめます
まとめ ▼ MangaScopeを提供: 共通CoroutineScopeの使用を推奨 • Dispatchers.IO : ブロッキングI/Oに最適化されたスレッドプールで 効率的に非同期処理
• SupervisorJob : 開発者が細かく制御できる余地を残す • Graceful Shutdown : GracefulなCoroutine closeを実現 • Observability : メトリクス/トレースを自動化 Coroutine使用時に起きがちな問題を防止。 不具合が混入しても早期発見できるようにしている。 32
ご清聴ありがとうございました!