Single Source of Truth 信頼できる唯一の情報源 SSOT

今回は SSOTの考え方についての学習録です。

SSOTとは

Wikipedia

情報システムの設計と理論においては、すべてのデータが1か所でのみ作成、あるいは編集されるように、情報モデルと関連するデータスキーマとを構造化する方法である。データへのリンクで可能なものは参照のみである。プライマリ以外の他の場所のすべてのデータは、プライマリの「信頼できる情報源」の場所を参照するだけであり、プライマリのデータが更新された場合、どこかで重複したり失われたりすることなく、システム全体に伝播される。

SSOTとは Single Source of Truthの略で唯一の信頼できる情報源という意味です。

いろんな文脈で語られていますが、webアプリケーション分野ではアーキテクチャの中で複数のデータストレージが使われている場合、利用者にあたかも一つのソースであるかのようにアクセスさせる事です。

具体的には

具体的な例を紹介します。

例えばあるアプリケーションサーバーでMySQLにユーザー情報を保存して、認証認可とIDPにCognitoを使用していたとします。

一般的な設計ではMySQLのユーザーとCognitoのユーザーは一対一である必要があります。 Cognitoを正とした場合、ユーザーのCRUDな処理では常にCognitoとMySQLのユーザー情報に整合性が取れるように処理しなければなりません。たとえばユーザーを作成してMySQLへのinsertは成功したけどCognitoに対する create user は失敗するというようなことは起ってはいけません。

アプリケーションの実装

RDBの場合はBegin, RollBack, Commit, のような任意でトランザクションを開始、破棄、終了できるようなAPIが用意されています。これはほとんどのORMにも実装されているので、コードを実装する時にも Cognitoの処理に失敗した場合、RDBの処理もRollBackするという事ができます。

ではデータストアにそういったトランザクションAPIが用意されていない場合はどうでしょうか? 例えばDynamoDBには書込みトランザクションと読み込みトランザクションがありますが失敗した時には自動でロールバックされるようになっています。RDBのようにRollBackを使ってCognitoとの整合性を保つことはできません。

この場合は別途バッチ処理を走らせてCognitoと整合性を保つような実装をする必要があります。

まとめ

RDBトランザクションは便利ですが、今までDB外のものと整合性を取る為にも使用していました。

厳密にはRDBの処理はRDB内の変更に抑えるべきで、それより外側は責任の範囲外になります。 これを機にSSOTという考え方を覚えておきたいと思います。

今回は以上です。 最後に、 このブログではweb開発について発信していくのでまたご覧頂けると嬉しいです。 最後までお読み頂きありがとうございました。