Java
Spring-boot
Spring Batch
MyBatis
概要
アーキテクチャと呼ぶには部分的だし、若干意味が違うとは思いますが全体的にどういうモノの作りなのかを説明するためにアーキテクチャという言葉で書くことにします。
システムアーキテクチャ
システム構成
実際にはこんな単純なネットワーク構成でもないし、他にも色々なサービスが使われていますが、説明のためにかなり省略して表現しています。
RDS for SQLServer
移行元となる現行システムのDB。 エディションは確かSQLServer 2016。
億クラスのレコード数を持つテーブルがゴロゴロいる化け物みたいなDB。
Aurora for MySQL
移行先となる新システムのDB。
新システムとは言いつつもAuroraのインスタンス自体は数年前に別プロジェクトで立てられたもので、そこにDBを新しく追加する形で相乗りすることになっている。 当時はまだAurora for MySQLのv3系(MySQLのv8系相当)がリリースされたばかりで割とバギーだったので、バージョンはv2系(MySQLのv5.7相当)で立てられたのがそのまま残っている。
ECS
移行バッチを動かすコンテナサービス。
全体で数十本あるバッチを全て別のECSタスクとして割って定義。 そうすることでバッチ単位でvCPUやメモリ等のリソースを調整出来るようにしてある。
Digdag
オープンソースのワークフローエンジン。 https://www.digdag.io/
各バッチのキッカーとしての役割を担うものとして構築。 DigdagのワークフローからECSタスクを実行するために以下のプラグインを使用。 https://github.com/civitaspo/digdag-operator-ecs_task
アプリケーションアーキテクチャ
ソフトウェアスタック
開発言語はJava 17。
ベースのフレームワークとしてSpring-bootのv3系を使用し、バッチの実装にはSpring Batchを使用。
O/RマッパーとしてMyBatisを使用し、SQLはゴリゴリに書く作戦。
Spring Batch
Chunk方式かTasklet方式かで意見が分かれるところではありますが、自由度の高いTasklet方式を選択。 バッチの内容によってはChunk方式の方が合っているものもありますが、複数人のチームで開発をすることを前提にするとやり方が統一されている方がいいのでTasklet方式で統一。
かつシンプルな作りにしておきたかったので、1ジョブ・1タスクで実装方式を統一。
MyBatis
MyBatis GeneratorとGeneration-Gapパターンの組み合わせで、Mapperインターフェース × Mapper XMLの2way方式を選択。
エンティティクラスや簡単なSQLたちはMyBatis Generatorで自動生成。 親のMapperインターフェースはアノテーションベースの実装が自動生成されるため、継承した子のMapperインターフェースはMapper XMLと対になるようにし、より複雑なSQLはXMLに書くようにしています。