용바오의 연구실

JGI (Jaypyon General Intelligence)

分散システムでデータを伝達する効率的な方法

  • 分散システム

    • 2つ以上のコンポーネントで構成されているシステム
    • モノリシックアーキテクチャでもサーチエンジンと共に使う場合分散システムとみなす。
  • データ伝達方法

    • リモートAPI
      • 一般的なサーバークライエント構造 (CRUD)
      • 比較的に簡単な場合が多い
    • メッセージキュー
      • コンシューマーがデータを操作する。(CRUD)
      • バッチ性業務
      • 非同期作業に使われる
      • 難易度高い場合が多い
  • 効率化する方法

    ネットワークは信頼出来ないメディアだ。

    • データ伝達保証方法
      • 最大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のスピードを超える事はできない。

      • RabbitMQ、Kafka を使って改善する方法

        RabbitMQはMultipleーClustersで構成できるし、ネットワークの問題で伝達に失敗する場合失敗メッセージを発生するからエラーの対応に効率的

        従うとこういう形で運用できる

        Kafkaもコードは少し違うが同じ方法論に従って運用できる

*本内容はNHNのコンファレンスで抜粋しました。(https://forward.nhn.com/2022/sessions/10