【アーキテクチャ】億り人をおくりびとした話

公開日:2023-07-17
最終更新日:2023-07-17

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に書くようにしています。

©︎ s-kugel All Rights Reserved.