0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[MSA] 注文・在庫MSAを設計してみよう

0
Posted at

AWS デプロイアーキテクチャ

  • Masterノードを3つ配置する理由はSPOFにさせないためのほか
  • 分散システムのSplit Brain現象を防ぐためである

AWS-arch.png


在庫クエリー

  • キャッシュがあれば在庫数の読み込みのスループットは高く維持できる

inventory-query.png


在庫クエリーキャッシュミス

  • ステートデータベースからのデータソーシングとイベントストアからのイベントソーシング両方の情報を掛け合わせて現在の在庫を計算する必要がある
  • Redisのキャッシュ更新は可換性がないため、分散ロックによるロックがいる

inventory-query-cachemiss.png


在庫の減少

  • 在庫のリレーショナルデータベースの隔離機能を使わず
  • Redisのシングルスレッドを用いてluaスクリプト原子的演算で減少させる
  • イベントソーシングパタンでイベントの付け加えだけでRDBのIOが済むため
  • 非常に高い処理性能とRedisによる低いlatencyが実装できる
  • Redisのluaスクリプト原子的演算のおかげで分散ロックが必要ないことになる

inventory-decrease.png


在庫バッチ処理

  • イベントソーシングによって積まれたイベント履歴をバッチ処理によってステートデータベースに反映させる
  • Redisのキャッシュ更新は可換性がないため、分散ロックによるロックがいる
  • そのほか、在庫キャッシュにイベントの連番を含むことで、バッチ上書きによる不具合を未然に防ぐ
  • バッチ上書きはRedissonのnon-fairな分散ロックの仕組みから来ている。詳細に関しては下記のリンクを参考にしよう

  • メッセージは最少1回発行されるので、何回処理しても演算結果が変わらない冪等性を持たせる必要があるが、引き算・足し算は冪等性がないため、Redis分散ロックを利用した冪等性管理が必要になってくる

inventory-batch.png


注文生成

  • 注文ドメインはOrchestration型Saga等のビジネス処理ロジックのハブになる可能性が高いため
  • 「Transactional Outbox」テーブルに情報を入れる

order-create.png


注文メッセージ

  • 注文ドメインはOrchestration型Saga等のビジネス処理ロジックのハブになる可能性が高いため
  • 最低1回のメッセージ発信を保証するには「Transactional Outbox」デーブルとスケジューラーを使用する

order-worker.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?