バッチ処理と冪等性 / 20191218_merpay_techtalk

Bf32ae94d9e03c03c963f364f2b47698?s=47 kaznishi
December 18, 2019

バッチ処理と冪等性 / 20191218_merpay_techtalk

Bf32ae94d9e03c03c963f364f2b47698?s=128

kaznishi

December 18, 2019
Tweet

Transcript

  1. 2.

    自己紹介
 • kaznishi
 • Twitter: @kaznishi1246
 • Backend Engineer
 •

    Code Payment Team
 • 2018年11月入社
 
 15% 35% 50% 2
  2. 11.

    冪等性
 • ある操作を1回実行しても、複数回実行しても、同じ結果になる
 • 冪等性がない処理の例
 ◦ 「ある変数の値を 現在値 + x

    に更新する」 ◦ 実行のたびに違う値に更新される 
 11 process 初期値 + x
 初期値 + 2x
 初期値 + 3x

  3. 17.

    どちらで実装している?
 • どちらのパターンも存在している
 • 要件によって選択
 • ステート管理が必要なものについては自ずと「一度処理したものをス キップするパターン」になるのではないかと
 • 中間集計など単純にレコードを生成するような処理かつ、全部やり直し

    ても大丈夫なぐらい時間的制約が緩いものは「処理済み含めてやり直 すパターン」により実装している
 ◦ もちろんレコードが重複して生成されないように適切なユニークキーを定義しておく前提 17
  4. 19.

    一度処理したものをスキップするパターンでの実装
 • ステップの中に他サービスへのリクエスト処理が含まれている場合はど うすればいいか?
 ◦ 他サービスにリクエストを送ったあとにリクエスト済みステータスに DB更新するようなケースを想定 ◦ DB更新でエラーが発生したら? ◦

    他サービスにキャンセルリクエストを送る? ◦ 他サービスが冪等に作られているならば、もう一度同じリクエストを 送るのは問題ないと考え、キャンセルせずにそのままリトライして解 消する 19
  5. 22.

    1. バッチを回す前の確認
 • 前段の処理が別のマイクロサービスの場合は難しい
 • チーム間でどうやって前段の処理を知らせるか調整が必要
 • 加盟店精算の会計データ取り込み処理の場合
 ◦ 前段は会計システムのGCSへのデータエクスポート処理

    ◦ エクスポート処理終了時に指定名(export.done)の空ファイルを設 置してもらっている ◦ データ取り込み処理開始時にexport.doneが存在していない場合 はまだ前段が終わっていないとみなす 22
  6. 25.

    まとめ
 • 回復可能性を高めるためにバッチ処理を冪等に作ろう • 何回バッチを実行しても結果が変わらないように処理を作る • 処理済み含めてやり直す or 処理済みのものをスキップするように作る •

    中途半端状態を作らないように設計しよう • 前段のバッチ処理が成功しているかを確認しよう • テストコードで冪等になっていることを保証しよう 25