フードデリバリーサービスを模したシステム構築によるSagaパターンと分散トレーシング並びにレジリエンス検証

技術情報

言語:バックエンド:C#(.NET6)/フロントエンド:Typescript(Angular)
DB:MSSQL
RabbitMQ/Zeebe/MassTransit/OpenTelemetry/Zipkin/JAGER/Envoy

開発ストーリー

これまでの弊社の開発では単一のDBが基本だったため、トランザクション制御はDBのレイヤで暗黙的に行われていました。
マイクロサービスアーキテクチャの場合、各サービスが持つ状態の一貫性が課題になります。
今回の検証では、一貫性として結果整合(一時的な不整合を許容し、最終的に望む状態へと収束する)をベースとしたトランザクション方式であるSagaパターンの検証を行いました。
コロナ禍で利用者が拡大したフードデリバリーサービスをイメージしたシステムを構築し、次のような要素も盛り込んだ検証になっています。
・トランザクションの状態を管理するオーケストレータの構築
・サービス間の経路で発生した障害に対応するためのリトライ処理の導入
・想定外の負荷の急増からサービスを保護するサーキットブレーカーパターン
・分散トランザクションの追跡に役立つ分散トレーシング
・結果整合に問題が生じていることを検知するリコンサイル処理の検討

苦労した点

アプリそのものは検証用でしたので、当初は非常に小規模な実装で検証を進める想定でした。
しかし今回の検証範囲はマイクロサービス型で複数サービスを跨いだ状態に関する検証であったため、複数のサービスを作らなければならなかったところが苦労しました。
結果的に検証するまでの準備に結構手を取られました。
また、参考となる情報が少なかった点も苦労した点です。
Sagaを実装していくなかで、障害の発生させ方によってイベントの追い越しが起きたり、実践する中で見えた課題もありました。

注意した点

検証結果について社内向けに報告する場では、見えづらいサービス間の状態を可視化するために簡単な画面を用意してデモをすることで検証結果が伝わりやすくなることを意識しました。

開発にかける想い

今回の検証は多くの要素を検証する形で実装したため、どちらかと言えば広く浅いつくりではありましたが、それでも実践を通じて多くの気づきと多くのプロダクトに触れることができました。
得られたノウハウが実開発でも活かされていくことと思います。