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
GoとKubernetesを用いたバッチ開発のすすめ
Search
To Kawa
April 23, 2022
Programming
2.4k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GoとKubernetesを用いたバッチ開発のすすめ
Go Conference 2022 Springでの発表資料です
https://gocon.jp/2022spring/ja/sessions/lt5/
To Kawa
April 23, 2022
More Decks by To Kawa
See All by To Kawa
Coding Agentを用いた仕様駆動開発を試す中で考えたこれからのエンジニアに重要な能力
waytkheming
0
76
NotebookLMが変えるエンジニアの情報整理術
waytkheming
0
140
gRPC入門
waytkheming
0
140
Other Decks in Programming
See All in Programming
AI時代の仕事技芸論〜ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ(スクフェス仙台 2026バージョン)
kuranuki
0
730
Android CLI
fornewid
0
190
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7k
【やさしく解説 設計編・中級 #4】ルールの寿命と、システムの年輪
panda728
PRO
2
170
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
150
The Bowling Game- From Imperative to Functional Programming - Part 1
philipschwarz
PRO
0
350
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
620
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
AIが無かった頃の素敵な出会いの話
codmoninc
1
260
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
5.6k
Featured
See All Featured
Site-Speed That Sticks
csswizardry
13
1.4k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
450
It's Worth the Effort
3n
188
29k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Visualization
eitanlees
152
17k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Google's AI Overviews - The New Search
badams
0
1.1k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
250
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
2.1k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
65
57k
How to Talk to Developers About Accessibility
jct
2
440
Transcript
GoとKubernetesを用いた バッチ開発のすすめ @awakot Go Conference 2022 Spring
自己紹介 Toshiki Kawamura 株式会社Voicy BE→SRE Twitter: awakot_56 Github: awakot
今日の話題 1. Go×Kubernetesを用いたバッチ開発方法の概要 2. 開発運用して感じたメリットとTips
ここでのバッチ処理とは 任意のタイミングで対象データに対して まとめて実施される処理 例 ・任意のタイミングで対象ユーザーにメールを送るシステム ・月初に定期購読ユーザーを更新するシステム ・一定間隔で売上の集計を行うシステム
バッチシステムに関して - GoでCLIを作成し、Kubernetes上で実行 - バッチ処理を実行するCLIツールとしてメインで利用したのは spf13/cobraパッケージ - https://github.com/spf13/cobra - KubernetesやIstioなどでも使用されていて、スター数も2万以上
- Command構造体に名前などを定義するだけで簡単に実行可能 - オプションフラグやエイリアスなど、CLIに必要な要素を簡単に設定するこ とができる
CLIを作る
まずはサブコマンドを定義
サブコマンドを定義 type hogehogeOptions struct { Notice bool Dryrun bool }
func (opt *hogehogeOptions) Run(ctx context.Context, w io.Writer) error { //ここに必要な処理を書く return nil } func HogeCommand(ctx context.Context) *cobra.Command { opt := &hogehogeOptions {} cmd := &cobra.Command{ Use: “hoge”, Short: “ 処理の説明“, Run: func(cmd *cobra.Command, args [] string) { if err := opt.Run(ctx, cmd.OutOrStdout()); err != nil { panic(err) } }, } cmd.Flags().BoolVarP(&opt.Notice, “notice”, “”, opt.Notice, “notice”) cmd.Flags().BoolVarP(&opt.Dryrun, “dryrun”, “”, opt.Dryrun, “dryrun”) return cmd
ルートコマンドにサブコマンドを追加していく ctx := context.Background() rootCmd := &cobra.Command{Use: “batch”} rootCmd.AddCommand(subcmd.HogeCommand(ctx)) rootCmd.AddCommand(subcmd.FooCommand(ctx))
Kubernetesでバッチを実行する
CronJobの定義例(一部) apiVersion: batch/v1beta1 kind: CronJob metadata: name: name namespace: namespace
spec: schedule: “00 18 * * * ” concurrencyPolicy: Forbid jobTemplate: spec: template: spec: containers: - name: hogehoge image: <image名> args: - /app/batch - hoge restartPolicy: Never #以下環境変数など
Go×Kubernetesでバッチ開発をしてみて - 他アプリケーションと同じくKubernetes上で管理や監視できる - JobやCronJobの実行をYAMLで管理できる - アプリケーションと同じ言語で書け、共通処理はそのまま利用できるので開発効率が上がる - ゴルーチンを用いた並行処理の導入で実行時間を短縮
バッチ開発のTips
リトライや冪等性を担保する仕組みを導入する バッチ処理が時に失敗する可能性があり、そういった場合に備えてシステム内にリトライの仕 組みや、リトライ時に備えた処理の冪等性が担保される仕組みを導入しておくと、バッチ処理 が仮に失敗しても簡単にリカバリが効くようになる また、KubernetesのCronJobにおいては以下のようなコマンドを実行することでCronJobから 即時実行されるJobを生成することが可能 kubectl create job job-name
--from=cronjob/cronjob-name -n namespace
1つのバッチの責務を小さくする 例えば大量のデータを一気に処理する場合には、1つのバッチの処理する量を減らし、段階 に分けた処理の実行や分割など、一つのバッチ毎の責務を小さくすることでリトライ設計や失 敗時のリカバリがしやすく管理のしやすいものになる
ゴルーチンをうまく利用する バッチ処理では大量データを扱うようなものが多いので、ゴルーチンを用いて並行処理をする ことで比較的簡単に処理時間を短縮することが可能 ただ並行処理を不必要に乱用するとシステムの複雑性が上がるため、注意は必要。 sync.WaitGroupやerrgroup.Groupなどを用いて、ゴルーチンの管理を丁寧にする必要はあ る
オプションフラグを活用する cmd.Flags().BoolVarP(&opt.Notice, “notice”, “”, opt.Notice, “notice”) cmd.Flags().BoolVarP(&opt.Dryrun, “dryrun”, “”, opt.Dryrun,
“dryrun”) バッチの動作確認をする際などに利用できるオプションを追加すると動作確認が簡単 にできるようになり非常に便利 (例) - メールなどの通知の送信を伴うバッチにおいては、noticeフラグをつけた際にのみ通知 を送る - dryrunフラグをつけるとデータの更新がされず処理内容のログが出るだけにする
Go×Kubernetesで快適なバッチライフを!
ご清聴ありがとうございました!