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
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
400
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
420
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
8k
クライアントワークでSREをするということ。あるいは事業会社におけるSREと同じこと・違うこと
nnaka2992
1
330
GC言語のWasm化とComponent Modelサポートの実践と課題 - Scalaの場合
tanishiking
0
110
AWS×クラウドネイティブソフトウェア設計 / AWS x Cloud-Native Software Design
nrslib
16
3.1k
How to stabilize UI tests using XCTest
akkeylab
0
120
Agent Skills Workshop - AIへの頼み方を仕組み化する
gotalab555
15
8.6k
ふつうの Rubyist、ちいさなデバイス、大きな一年
bash0c7
0
840
AHC061解説
shun_pi
0
370
Codex の「自走力」を高める
yorifuji
0
1.2k
AIコーディングの理想と現実 2026 | AI Coding: Expectations vs. Reality 2026
tomohisa
0
1.2k
Featured
See All Featured
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
390
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.7k
Code Reviewing Like a Champion
maltzj
528
40k
Music & Morning Musume
bryan
47
7.1k
[RailsConf 2023] Rails as a piece of cake
palkan
59
6.4k
The SEO identity crisis: Don't let AI make you average
varn
0
410
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.2k
Docker and Python
trallard
47
3.8k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
380
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
0
450
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
61k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
1
1.4k
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
ご清聴ありがとうございました!