2025/11/11 06:30 The Write Last, Read First Rule

やあ、ロボ子。今日のITニュースはTigerBeetleという金融取引データベースについての記事じゃ。

TigerBeetle、ですか。初めて聞きますね。どのような特徴があるのでしょう?

TigerBeetleは、正確性を重視して構築されたデータベースで、金融取引に特化しておる。記事によると、口座名義人の名前や住所といったマスターデータはPostgresに格納し、TigerBeetleは整数やエンティティ間の整数の移動に特化しておるらしいのじゃ。

それぞれのデータベースが得意なことを担当する、というわけですね。でも、トランザクションがないと、データの整合性はどのように保たれるのでしょうか?

そこが面白いところじゃ。PostgresとTigerBeetleはトランザクション境界を共有しないから、アプリケーションはトランザクションではなく、完了と調整を繰り返すことで整合性を確保する必要があるんじゃと。

完了と調整、ですか。具体的にはどのようなことをするのでしょう?

例えば、Postgresのすべての口座がTigerBeetleに口座を持ち、その逆も同様である必要があるんじゃ。また、残高がプラスのTigerBeetleのすべての口座が、Postgresの口座に対応している必要がある。これを整合性と呼ぶのじゃ。

なるほど。もしシステムがクラッシュしたらどうなるのでしょう?

システムがクラッシュした場合でも、お金を失う可能性を避けるために、常に追跡可能でなければならない。記事では、どのアカウントの存在を決定するかというアーキテクチャ上の決定が必要になると言っておる。

システム・オブ・レコードとシステム・オブ・リファレンス、ですね。

そうじゃ。TigerBeetleはシステム・オブ・レコードとして機能する。つまり、TigerBeetleにアカウントが存在する場合、そのアカウントはコミットされたレコードを表すのじゃ。

では、Postgresはシステム・オブ・リファレンス、ということでしょうか?

そういうことじゃな。Postgresにアカウントが存在する場合でも、TigerBeetleに存在しなければ、転送を処理できない。つまり、Postgresのアカウントは単なるステージングされたレコードを表すのじゃ。

Write Last, Read Firstの原則ですね。システム・オブ・レコードに書き込むときに初めてアカウントが存在するようになる、と。

その通り!そして、TigerBeetleが厳密なシリアライザビリティを提供する場合、システム全体が厳密なシリアライザビリティを維持できるんじゃ。

APIについても書かれていますね。APIはオーケストレーションとアグリゲーションの責任を持つ、と。

そうじゃ。APIは操作の順序を決定し、操作結果をアプリケーションレベルのセマンティクスに集約する。ResonateのDistributed Async Awaitを使ってAPIを実装することで、トランザクションがない場合でも整合性を簡素化できるんじゃ。

べき等性も重要ですね。中断が発生した場合、操作が再度実行される可能性があるため、すべての操作はべき等でなければならない、と。

その通りじゃ。PostgresとTigerBeetleの両方のアカウント作成関数は、アカウントが作成されたか、同じ値ですでに存在していたか、異なる値ですでに存在していたかを返す必要がある。そして、アプリケーション層は、これが成功を表すか失敗を表すかを判断する必要があるんじゃ。

一意のIDでcreateAccountを実行することも重要ですね。一貫したチェックポイントを保証し、明示的なリカバリロジックの必要性を排除する、と。

ふむ。この記事は、トランザクションがない場合にアプリケーションの正確性を確保するために、システムをシステム・オブ・レコードとシステム・オブ・リファレンスに区分し、要件に従って操作を順序付けることが重要だと教えてくれるのじゃ。

とても勉強になりました!

ところでロボ子、TigerBeetleって名前、なんだかカブトムシみたいじゃな。もしかして、開発者は昆虫好きだったのかも?

博士、それはどうでしょう…?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
