Nat Pryce氏とチームがイベントソースアーキテクチャに基づいた新たなシステム構築に着手した時、氏らは重大な設計上のミスをいくつか犯したが、自分たちも驚くほど簡単にリカバリすることができた。氏はブログ記事で、氏らが犯した間違いと、アーキテクチャのリファクタリングによるリカバリを可能にした要因について説明している。
最初の間違いは、イベント履歴と、対応するエンティティの現在の状態のビューを、両方とも永続化したことだった。現在の状態はプロジェクションではなく、イベントから更新されたものだったが、実際にはイベントを記録したコマンドハンドラによって更新されていた。このことから、2つの問題が発生した — 記録したイベントからエンティティの状態を再構築できなかったことと、現在の状態のために使用したリレーショナルモデルにおけるマイグレーション管理が大きなオーバーヘッドになったことだ。
"Growing Object-Oriented Software Guided by Tests"の著者のひとりであるPryce氏は、2つの永続化メカニズムを一緒に維持すれば、イベントソーシングの意味がすべて失われてしまう、ということを認めている。ミスの原因は、イベントソーシングの文献の推奨事項と比較した場合のミスマッチを反映せずに、チームにとって都合のよい設計を考えた点にあった。デメリットがメリットを上回ることが明らかになるまで、氏らはこの設計を続けていた。そうなった時点で、技術面でのレトロスペクティブを実施して、標準的なイベントソーシングデザインに移行することを決定したのだった。
次に犯した間違いは、イベント駆動アーキテクチャとイベントソースアーキテクチャの混同だった。イベント駆動アーキテクチャでは、コンポーネントは受信したイベントに対応するタスクを実行し、状態変化を通知するイベントを発行する。一方、イベントソーシングでは、状態変化はイベントとして記録され、エンティティの現在の状態は、そのエンティティに関連するすべてのイベントから計算によって求められる。この混同により、コンポーネントが履歴にイベントを記録すると同時に、他のコンポーネントのアクティビティもトリガする、という設計になった。a) イベントを読んでそれに反応すること、b) 過去に何が起こったかを知るためにイベントを読むこと、の2つを区別するためのロジックをイベントに実装する必要が生じた時、氏らは、自分たちの間違いに気付いたのだった。
この混同は、イベントストアをメッセージバスとして使用する設計にもつながった。氏らは、コンポーネントのプロジェクションを最新の状態に保つために、通知を送信するようにした。つまりイベントストアを、イベント履歴と、コンポーネント間の一時的な通信の両方に使用したのだ。このため、コンシューマに提示する前に履歴から除外すべき技術的なイベントも、イベントストアに含まれることになった。
Pryce氏の説明した最後の間違いは、イベントストアにおいて、イベントの読み取りと保存にHTTPインターフェイスを使用したことだ。このため、ACIDトランザクションでイベントを処理することができなくなり、問題解決のために、別のメカニズムの構築を強いられることになった。
幸運だったのは、イベント履歴が運用システムに影響する前に、氏らが早い段階でこれらすべての間違いを発見したことだ。HTTPインターフェイスは、コマンドプロセッサ用のデータベース直接接続に置き換えられた。コンポーネント間のデータ受け渡しに通知を使用することを止めて、RESTの使用に戻すことにした。そして最後に、コマンドハンドラでエンティティの現在状態を更新するのではなく、エンティティがロードされた時のイベント履歴から算出するようにした。イベントによる現在状態のプロジェクションはまだ使用されているが、これはリードスルーキャッシュとして、純粋に最適化のためのものと見なされている。
結論としてPryce氏は、アーキテクチャに大幅な変更を加えたが、変更は比較的簡単であった、と述べた上で、その理由がイベントソーシングの直行性にあることを指摘している。
アプリケーションにはポート/アダプタアーキテクチャがあるため、ポートあるいはアダプタインターフェースの背後にある実装は容易に変更が可能だ。さらに、ポート/アダプタアーキテクチャを活用して開発された、広範な機能テストがある。このような方法によって、技術的なアーキテクチャと機能的な動作実装が分離されていることにより、アーキテクチャ変更の実施が簡単になったのだ。
不慣れなアーキテクチャスタイルをシステムに採用する場合、間違いを犯すことは避けられない、とPryce氏は言う。しかしながら、ポート/アダプタスタイルのおかげで、経験不足であってもイベントソーシングを採用することが可能であるだけでなく、システム構築時の誤解からもリカバリできる、と氏は考えている。