1

通常の Akka アクターが最大 1 回の配信セマンティクスを提供することはよく知られています。一方で、akka-persistence は at-least-once 配信セマンティクスも提供します。後者は、より多くの定型文を必要とし、実装時にいくつかの違いがあります (つまり、配信が確認されたら、受信または再送信を避けるためにシーケンス番号を処理します)。

ここで、多数の重要なトランザクションを処理する大規模なエンタープライズ アプリケーション (銀行など) があるとします。このトランザクションは、システムを構成するアクター間の特定のメッセージ フローとして内部的にモデル化されます (複数のマシンに展開される可能性があります)。

したがって、前述のメッセージ フローで 1 つのメッセージが失われたことが、トランザクションが失敗したか、黙って破棄されたことを意味する場合、この状況では、すべてのボイラープレートで at-least-once 配信を EVERYWHERE で使用することを実装に強制しますか? これにより、コード ベースの保守がややこしくなるのではないでしょうか? コードの保守性と全体的なシステム パフォーマンスのバランスの観点から、この種の状況を効率的に処理するにはどうすればよいでしょうか。安全な方法で少なくとも1回の配信の使用を一般的に最小限に抑える方法は?

どうもありがとう。

4

1 に答える 1

1

したがって、前述のメッセージ フローで 1 つのメッセージが失われたことが、トランザクションが失敗するか、黙って破棄されることを意味する場合、この状況では、すべてのボイラープレートで at-least-once 配信を EVERYWHERE で使用することを実装に強制するのでしょうか? これにより、コード ベースの保守がややこしくなるのではないでしょうか? コードの保守性と全体的なシステム パフォーマンスのバランスの観点から、この種の状況を効率的に処理するにはどうすればよいでしょうか。安全な方法で少なくとも 1 回の配信の使用を一般的に最小限に抑える方法は?<

あなたは決してこれをしません。銀行システムでは、俳優を見つけることはほとんどありません。銀行システムでは、各取引が確実に行われるようにするために、2 つまたは 3 つのレベルの実装があります。

少なくとも1回のアプローチと最大1回のアプローチは、基本的にタイムアウトとメッセージについての考え方の違いです。せいぜい 1 つがスループットを最大化しようとしています (何かがうまくいかない場合、低レベルで開始するタイムアウトがあります)。

少なくとも 1 回は別のルートを使用します (基になる実装によって異なります)。ここでは、応答時間を短縮することを目指します。優先的に 3 つのサーバーに送信し、最速の応答を取得する可能性がはるかに高くなります。

請求サービスと検索サービスについて考えてみてください。請求サービスでは、応答時間をそれほど気にせず、請求が一度だけ行われるようにしたいと考えています。そのため、別のノードに引き継いで請求を行うように依頼する前に、プロセスを終了させたいと考えています。検索サービスの場合、応答時間を短縮する必要があります。したがって、たとえば 3 つのサーバーに検索要求を送信すると、これらのサーバーは並行して検索し、任意の (!) サーバーから報告された最初の結果を取得します。

それが理由です。少なくとも 1 回、多くても 1 回は、正しさと応答についてです。(少なくともそれが私たちがそれを学んだ方法です)。

[アップデート]

実際のパフォーマンスを測定し、サーバーの応答が 25 ミリ秒以内に 75%、75 ミリ秒以内に 95% であることがわかった場合、少なくとも 1 回の実装では 25 ミリ秒待機し、リクエストを別のサーバーに送信して、さらに 50 ミリ秒待機します。 3 番目の要求を送信します。したがって、これを使用すると、予想される応答時間を 75% 25 ミリ秒、95% から 50 ミリ秒、99% から 75 ミリ秒に短縮するために 30% (単なる推測) を追加するだけです (理想的な世界では、各要求は同じ計算時間を必要とし、処理時間はアーキテクチャに依存する (または単一ノードに依存する) ものであり、ネットワークに依存するものではありません (高負荷時など)。

于 2015-02-20T10:47:58.610 に答える