GCP(GKE)でバッチ処理を検討する

どれも一長一短でなかなかこれといったものがない。





要件・やりたいこと



  • cron等でスケジューリングできること
  • http通信でAPIにアクセスできること
  • gcp上のmysqlにアクセスできること
  • 出来ればNode.jsを使用したい



CloudScheduler → Pub/Sub → Cloud Functions



https://cloud.google.com/scheduler/docs/quickstart?hl=ja
https://cloud.google.com/pubsub/docs/overview?hl=ja
https://cloud.google.com/functions/docs/concepts/overview?hl=ja
https://firebase.google.com/docs/functions/quotas?hl=ja

CloudSchedulerにてCron設定. Pub/Subを経由してCloud Functionsを実行する。

メリット

・バッチにNode.jsが使用可能でWebアプリケーションと言語が統一できる。
・アプリケーションの機能が疎になる。


懸念事項

・Cloud Functions の最大メモリは2G。
・ソースのサイズなど制限がある(圧縮後100M, 関数1000まで等)
・使用するサービス数が多くなるのでちゃんとチームを組めないと後々つらそう。

軽量な処理を定期実行したい場合選択肢に入る。
機能が多くなるに連れ対応できなくなる可能性がある。 



Node.js cron



node.js でcronを動かす。
https://github.com/kelektiv/node-cron

メリット

・作り方次第でスペックを上げるたびに自動で分散処理してくれるかもしれない。
・利用するサービスは増えないので構成の理解が多少楽になる。

懸念事項

・アプリがポッドに別れて実行されたときの詳細な挙動が不明。
・設定が変わるたびにデプロイが必要になるかもしれない。
・ウェブアプリケーションに相乗りする形になるのであまりモダンではない(一応ポッド分けることは可能?未検証)



k8sの機能を使ってジョブを実行する



動作するコンテナを分ける。
https://cloud.google.com/kubernetes-engine/docs/concepts/batch-reference?hl=ja
https://qiita.com/devs_hd/items/4679ad5075a513679766
https://qiita.com/koduki/items/5b3a0471140f0b3b16a5

メリット

・アプリとバッチで分かれるのでどちらかが落ちても片方は影響がない
・k8sでcronjobの設定が可能?
・k8sが本来想定している利用方法に近い。
・コンテナで動かせれば良いのでNode.jsでなくても良い。

懸念事項

・GKEの対応が2020/09/06時点でベータ版である。
・タイムゾーン周りの処理がかなり怪しい。

最終的にはこのGKE上でバッチを動かす方針で行くことに。
詳細な組み込み方法は後ほど。

書いた
GKE上でCronJobを構築する


参考



https://medium.com/google-cloud-jp/batch-scheduling-gcp-e93966110428

2020年9月6日日曜日