分散システム
- 2つ以上のコンポーネントで構成されているシステム
- モノリシックアーキテクチャでもサーチエンジンと共に使う場合分散システムとみなす。
データ伝達方法
- リモートAPI
- 一般的なサーバークライエント構造 (CRUD)
- 比較的に簡単な場合が多い
- メッセージキュー
- コンシューマーがデータを操作する。(CRUD)
- バッチ性業務
- 非同期作業に使われる
- 難易度高い場合が多い
- リモートAPI
効率化する方法
ネットワークは信頼出来ないメディアだ。
- データ伝達保証方法
最大1回伝達 ( At most once delivery )
- 信頼度が一番低い
- メッセージ損失可能性が高い
最小1回伝達(At least once delivery)
- Producerは最小限1回伝達
- Consumerは最小限1回以上受信(ACK損失の場合には再発送)
- ConsumerはIdempotentを保証する
正確に1回伝達(Exactly once delivery)
- メッセージキューに依存する開発
- メッセージキューで複雑度増加
- Producer, Consumerで全てのStateを管理
- では今のアプリではどう伝達していますか?
RDBを使ってっるアプリでの伝達方法
- Transactional Outbox Pattern
- RDBをメッセージキューとして使う(一般的にRedis)
- OLTPにイベントメッセージを含むパターン
- Polling Publisher Pattern
- メッセージキューのPolling&Publishing
つまり、Transactional Outbox Patternを先行してDBに積もったらPolling Publisher Patternを実施してPropagationを行う。故にRESTful-API環境でAt-least-onceの実装が出来る。
しかし、限界は明確だ。DBMSに依存するためDBMSのスピードを超える事はできない。
- Transactional Outbox Pattern
RabbitMQ、Kafka を使って改善する方法
RabbitMQはMultipleーClustersで構成できるし、ネットワークの問題で伝達に失敗する場合失敗メッセージを発生するからエラーの対応に効率的
従うとこういう形で運用できる
Kafkaもコードは少し違うが同じ方法論に従って運用できる
- データ伝達保証方法
*本内容はNHNのコンファレンスで抜粋しました。(https://forward.nhn.com/2022/sessions/10)