Javaソースコード分析とインタビューの質問-全体的な設計:キューの設計アイデア、作業シナリオ

関連するブログ、ムークラス参照列この一連のJavaソースコードとシステムメーカーは簡潔Zhentiインタビュアー
この列の下には、GitHubのアドレスです:
ソースは解決:https://github.com/luanqiu/java8
記事デモ:HTTPS:// GitHubの。 com / luanqiu / java8_demo
クラスメートは必要に応じてそれを見ることができます)

入門フレーズ
我々は二つの方向と使用シナリオとデザインのアイデアからいくつかの大きなコントラストを作るの章を使用して、我々はLinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueueを学んだ、この章の、DelayQueue 4つのキュー、4つのキュー基礎となるデータ構造が異なっている、いない同じシーンまとめ。

1デザインのアイデア

まず、キューの全体的なデザインを描きます。
ここに画像の説明を挿入
図から、いくつかの点がわかります。

  1. Queueはプロデューサとコンシューマを分離し、プロデューサとコンシューマ間の複数の形式の関係を提供します。たとえば、LinkedBlockingQueueとArrayBlockingQueueはプロデューサとコンシューマを分離します。たとえば、SynchronousQueue、プロデューサコンシューマーとの通信(プロデューサーは、コンシューマーのメッセージがコンシューマーによって消費された後にのみ戻ることができます。理解の便宜上、相互通信という用語を使用します);
  2. キューごとに、リンクリスト(LinkedBlockingQueue)、配列(ArrayBlockingQueue)、スタック(SynchronousQueue)などのデータ構造があります。;
  3. データ構造が異なると、チームへの出入りの姿勢が異なると判断されます。

次に、これらの側面に従って要約および分析します。

1.1キューのデータ構造

リンクリスト構造のキューはLinkedBlockingQueueであり、その特性は次のとおりです。

  1. 初期サイズはデフォルトでIntegerの最大値であり、初期サイズも設定できます。
  2. リンクリストの要素は、next属性を介して次の要素に関連付けられます。
  3. 新しい追加はリンクリストの末尾からであり、開始はリンクリストの先頭からです。

配列構造のキューはArrayBlockingQueueで、次の特性があります。

  1. 容量は固定されており、動的に拡張することはできません。
  2. takeIndexとputIndexの2つのインデックスがあり、次に取得して追加する位置を記録します。
  3. takeIndexとputIndexが配列の最後の位置に到達すると、ループは次回0から始まります。

SynchronousQueueには、キューとスタックの2つのデータ構造があり、次のような特徴があります。

  1. キューは先入れ先出しデータ構造を保証します。これは公平性を反映しています。
  2. スタックは先入れ先出しのデータ構造であり、不公平ですが、パフォーマンスは先入れ先出しよりも高くなります。

1.2チームに参加し、チームを去る方法

キューが異なればデータ構造も異なるため、キューに出入りする方法も異なります。

  1. リンクされたリストは、チームに入るときにチームの最後に直接追加され、データはチームを離れるときにリストの先頭から取得されます。
  2. 配列にはtakeIndexとputIndexの2つのインデックス位置があり、デザイン全体などの次のピックアンドテイク位置を記録します。エンキューは直接putIndexを指し、発信チームはtakeIndexを指します。
  3. スタックは、主にスタックヘッドに載せたり、スタックヘッドから取り外したりします。

1.3プロデューサーとコンシューマー間の通信メカニズム

4つのキューから、プロデューサーとコンシューマーの間に2つの通信メカニズムがあることがわかります。1つは強い関連付けで、もう1つは非関連付けです。

  1. 強い相関関係は主にSynchronousQueueキューを参照します。プロデューサーはデータをキューに入れます。この時点でコンシューマーの消費がない場合、プロデューサーは常にブロックされて戻ることができません。コンシューマーはデータをフェッチするためにキューに来ます。この時点でキューがデータはなく、コンシューマは常にブロックするため、SynchronousQueueキューモデルでは、プロデューサとコンシューマが強く関連付けられています。プロデューサとコンシューマが1つしか存在しない場合、ブロックするだけでデータを転送できません。
  2. 非関連付けは主に、LinkedBlockingQueueやArrayBlockingQueueなどのデータストレージ機能を持つキューを指します。キューコンテナーがいっぱいでない限り、プロデューサーは成功し、プロデューサーは直接戻ることができます。コンシューマーとの関係はありません。コンシューマは完全に分離され、キューコンテナのストレージ機能を介して分離されます。

2仕事でのシナリオの使用

日常業務では、キューの特性に従ってビジネスシナリオを照合して、使用するキューを決定する必要があります。各キューに適したシナリオを要約します。

2.1 LinkedBlockingQueue

生成されるデータのサイズが可変(時間は長く、時間は短い)で、データの量が多いシナリオに適しています。すべての注文リクエストをスレッドプールに入れます。現時点では、スレッドプールを初期化するときに、通常はLinkedBlockingQueueを選択して適切なサイズを設定します。現時点では、LinkedBlockingQueueを選択する主な理由は、設定したしきい値内です。キューのサイズは、時間の大小にかかわらず、注文フローの特性に沿って、パフォーマンスを低下させることなく、大きくすることも小さくすることもできます。

一般的な作業では、ほとんどの人がLinkedBlockingQueueキューを選択しますが、LinkedBlockingQueueの最大容量を設定します。初期化中にIntegerのデフォルトの最大値が直接使用される場合、トラフィックが大きく、コンシューマーの処理容量が少ないと、多数のリクエストによってキューに蓄積されると、マシンのメモリが大量に消費され、マシンの全体的なパフォーマンスが低下し、さらにはダウンタイムが発生します。マシンが停止すると、キューのデータはメモリに格納されるため、キューのデータは消えます。メモリ内のデータは消えるので、LinkedBlockingQueueキューを使用する場合は、毎日のトラフィックに応じて適切なキューサイズを設定することをお勧めします。

2.2 ArrayBlockingQueue

通常、本番データが修正されるシナリオで使用されます。たとえば、システムは毎日調整を実行します。調整が完了すると、100の調整結果が修正されます。調整結果が修正されるため、ArrayBlockingQueueキューを使用できます。サイズは、 100。

2.3 DelayQueue

作業で頻繁に発生する遅延キューは、タスクがすぐに実行されるのではなく、一定の時間実行を待機する場合に主に使用されます。

たとえば、和解が遅れている場合、私たちは仕事でそのような場面に遭遇しました:淘宝網で物を購入し、Alipayの支払いページをポップアップ表示し、指紋を入力した瞬間に、プロセスは主に支払い後の「フロントエンド-トランザクションバックエンド-」です最後に、トランザクションバックエンドは支払いバックエンドを呼び出して、主にAlipayのお金を販売者に送金します。ネットワーク呼び出しのタイムアウトが発生するため、トランザクション呼び出しの支払いプロセスにはわずかな確率があり、今回はタイムリーに渡す必要がありますこの問題を解決するための調整(調整はこの問題を解決するための手段の1つにすぎません)、単にフローチャートを描画します。
ここに画像の説明を挿入
これは実際のシーンであり、説明の便宜上、大幅に簡略化されており、いくつかの点を説明しています。

  1. このトランザクションは支払いインターフェースを呼び出し、このインターフェースの目的は、Xiaomeiの800元を商人Xiaomingに転送することです。
  2. インターフェースの呼び出しがタイムアウトしました。現時点では、トレーディングシステムは800がXiaomingに正常に転送されたかどうかを認識していません。もちろん、多くの方法で知ることができます。調整方法を選択しました。調整の目的は、現在の800元が正常に転送されたかどうかを知ることです。小明
  3. 調整を遅らせる目的は、決済システムが販売者Xiaomingに800元を転送するのに時間がかかることです。タイムアウトの直後に調整が実行されると、転送がまだ進行中で、調整結果が不正確になるため、数秒の遅延が必要です。次に、調整に進みます。
  4. 調整後の結果はいくつかあります。たとえば、800元はXiaomingに正常に転送されました。現時点では、調整結果を取引システムに伝達する必要があります。トランザクションシステムはデータを更新し、フロントエンドは転送が成功したことを示すことができます。

この場合、遅延調整のコアテクノロジはDelayQueueです。おそらく、これを実行します。新しい調整タスクを作成し、3秒後に実行するように設定し、タスクをDelayQueueに配置すると、3秒後に自動的に実行されます。アカウントタスク。

このシナリオでは、DelayQueue遅延実行機能が適用されます。

3まとめ

ソースコードを読み取るためにソースコードを読み取ることはありません。ソースコードを読み取る本来の目的は、技術的な深さを改善することです。最終的な目的は、さまざまなシナリオでのランディングに適切なテクノロジーを選択することです。この章で説明するいくつかのキューシーン、特にスレッドプールを使用する場合、実際に作業で遭遇します。どのキューを使用するかは私たちが考慮しなければならない問題なので、この章ではまず各キューの適切な使用シナリオを比較し、次にいくつかのケースを実行します具体的な分析として、誰もがテクノロジーを実際の作業に取り入れて、テクノロジーがビジネスを促進および支援できるようにしてほしいと思います。

公開された40元の記事 ウォンの賞賛1 ビュー4980

おすすめ

転載: blog.csdn.net/aha_jasper/article/details/105525906