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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
80
NotebookLMが変えるエンジニアの情報整理術
waytkheming
0
150
gRPC入門
waytkheming
0
140
Other Decks in Programming
See All in Programming
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
0
240
XHTMLが残したもの
yosuke_furukawa
PRO
1
410
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
580
【DroidKaigi 2026】「アクセシビリティを利用するとき、 アクセシビリティもまたこちらを利用している」 〜マルウェアによる攻撃と防衛について〜
halunoyo
0
410
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.4k
デプロイ直後のレイテンシスパイクを調べたら、 Railsの仕様にたどり着いた
nhsykym
0
110
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
270
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
340
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
450
[GoCon2026] When Goroutines Are Not Enough: Runtime Locality in High-Throughput Go
takehaya
2
250
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
AWS DevOps Agentで インシデント対応をAIに任せたい
honmarkhunt
6
2.4k
Featured
See All Featured
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
430
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
Fireside Chat
paigeccino
42
4k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
380
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
RailsConf 2023
tenderlove
30
1.5k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
69
65k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
490
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で快適なバッチライフを!
ご清聴ありがとうございました!