今日は、Dubbo IO インタラクションに関する記事をお屆けします。
この記事は同僚が書いたものです。つまらない知識を面白い言葉を使ってまとめています。わかりやすくてとても面白いので、著者の記事を見つけるのが待ちきれません
いくつかの興味深い質(zhì)問
Dubbo は、複雑なスレッド モデルを備えた優(yōu)れた RPC フレームワークです。この記事は私の淺い知識に基づいてDubboのIOプロセス全體を分析してみようというところから始まります。始める前に、まず次の質(zhì)問を見てみましょう:
ビジネス メソッドの実行後、データ パケットは送信されますか? スレッド モデルにおける netty3 と netty4 の違いは何ですか? データ パケットがオペレーティング システムのソケット バッファに到著すると何が起こったのでしょうか? プロバイダーによって生成されるログにはほとんど時間がかかりませんが、コンシューマー側(cè)はタイムアウトになります。問題をトラブルシューティングするにはどうすればよいですか? データ パケットは物理層のパイプを介して直接送信できますか? コンシューマ ビジネス スレッドが待機中です。條件付きです。いつ起動されますか? ……
次に、作成者は Dubbo2.5.3 をコンシューマとして使用し、2.7.3 をプロバイダとして使用して、インタラクション全體を説明します。プロセス. 著者のウェブサイト データ パケットの観點から、一人稱で語られます。シートベルトを締めて、行きましょう。
私は Dubbo2.5.3 Consumer という小さな町で生まれたデータパケットです。私の使命は情報を?qū)盲堡毪长趣扦ⅳ辍⒙眯肖夂盲扦埂?ある日、私は派遣されることになり、Dubbo 2.7.3 Provider というところに行くと言われました。
この日、ビジネス スレッドはメソッド呼び出しを開始しました。FailoverClusterInvoker#doInvoke
でプロバイダーを選択し、さまざまなコンシューマー フィルターを通過し、次に Netty3 パイプラインを通過し、最後に NioWorker を通過しました。 #scheduleWriteIfNecessary
メソッド、NioWorkerのwriteTaskQueueキューに來ました。
メインスレッドを見返してみると、DefaultFuture の Condition を待っていることが分かりましたが、何を待っているのか、どれくらい待たなければならないのかわかりませんでした。
writeTaskQueue キューにしばらく入れてみると、netty3 IO ワーカー スレッドが run メソッドを無限に実行していることがわかりました。誰もがこれを無限ループと呼んでいました。
結(jié)局、私は幸運でした。NioWorker#processWriteTaskQueue
が私を選んでくれました。私はオペレーティング システムのソケット バッファーに書き込まれました。バッファー內(nèi)で待機しました。とにかく、時間は十分にありました。今日のことを振り返ってみましょう。旅行中、メイン スレッドと netty3 IO ワーカー スレッドと呼ばれる 2 つのツアー グループを利用しました。まあ、どちらのツアー グループのサービスも良く、非常に効率的でした。
今日見たものをただ記録して絵に描いただけですが、もちろん重要でない部分は無視してます。

2. オペレーティング システムがデータ パケットを送信します
私はオペレーティング システムのソケット バッファーにいますそして魔法のようなものをたくさん渡しました。
#トランスポート層と呼ばれる場所に、ターゲット ポート番號とソース ポート番號を追加しました
-
を見つけます。ネットワーク層と呼ばれる場所で、ターゲットIPとソースIPを追加し、同時にターゲットIPとマスクの間のAND演算を?qū)g行して「ネクストホップ」IP
#データリンク層と呼ばれる場所に、ARP プロトコルを介して「ネクストホップ」のターゲット MAC アドレスとソース MAC アドレスを追加しました。
最も興味深いのは、ケーブル カーの一部を撮影したことです。ケーブル カーを変更するたびに、ターゲット MAC アドレスとソース MAC アドレスを変更する必要がありました。後で、同僚にデータ パケット情報を?qū)い亭蓼筏?。このモードは「ネクスト ホップ」と呼ばれ、ホップを次々と飛び越えます。ここにはデータパッケージがたくさんあります。大きいものは 1 つのケーブルカーにあり、小さいものは 1 つのケーブルカーに詰め込まれています??证恧筏い长趣猡ⅳ辘蓼?。大きいものは複數(shù)のケーブルに分割する必要があります車 (ただし、これはデータ パッケージには関係ありません)。質(zhì)問)、これは開梱と貼り付けと呼ばれます。この間、スイッチやルーターを通過しましたが、これらの場所は非常に快適に遊べました。
もちろん、渋滯、目的地のケーブルカーは満員、連れて行ってもらう暇もないので待つしかないという嫌な事もあります。
3. プロバイダ側(cè)の経験
久しぶりに目的地に到著し、「ゼロコピー」というバスに乗りました。 " スピードボートはすぐに netty4 に到著しました。netty4 は実に素晴らしかったです。NioEventLoop#processSelectedKeys
を通過し、パイプライン內(nèi)のさまざまな受信ハンドラーを通過した後、AllChannelHandler のスレッド プールに到達しました。もちろん、私はたくさんのスレッド プールを持っています。選択肢はありますが、宛先をランダムに選択すると、宛先の「ビジネス メソッド」に到達する前に、デコードと一連のフィルターが実行されます。NettyCodecAdapter#InternalDecoder
デコーダーは非常に強力で、解凍を処理できます。そしてくっついてます。

AllChannelHandler のスレッドプールにしばらく滯在するので、その過程を記録するために絵も描きました。

それ以來、私の旅は終わり、新しい物語は新しいデータパッケージによって続きます。
4. 新しいデータ パケットがプロバイダー側(cè)??で生成されました
私は、Dubbo2 という小さなプロバイダーで生まれたデータ パケットです。 7.3タウン、私の使命は運命の糸を呼び覚ますことです 次に、Dubbo2.5.3 Consumerという場所への旅を始めます。
プロバイダー ビジネス メソッドの実行後
ビジネス スレッドによって渡されました io.netty.channel.AbstractChannelHandlerContext#writeAndFlush
- #その後、
io.netty を通過しました.util .concurrent.SingleThreadEventExecutor#execute addTask を?qū)g行します
- タスクをキューに入れます
io.netty.util.concurrent.SingleThreadEventExecutor#taskQueue io.netty.channel.AbstractChannelHandlerContext$WriteTask に従って、NioEventLoop が開始するのを待ち、待機中に実行した手順を記録しました。

AbstractChannelHandlerContext.WriteAndFlushTask ## #と、ソケットのバッファエリアで飽きずに待っていてくださいと指示され、完璧を追求する頑固な職人気質(zhì)の持ち主であることが分かった気がしました。
の後、オペレーティング システムのソケット バッファに到達します。オペレーティング システム レベルでも、ほとんどのデータ パケットと同様に、目的地に到達するにはケーブル カーが必要です。 <h4 data-tool="mdnice編輯器" style="margin-top: 30px;margin-bottom: 15px;padding: 0px;font-weight: bold;color: black;font-size: 18px;">
<span style="display: none;"></span>5. dubbo 2.5.3 Consumer 側(cè)に到著<span style="display: none;"></span>
</h4>
<p data-tool="mdnice編輯器" style="padding-top: 8px;padding-bottom: 8px;margin: 0;line-height: 26px;color: black;font-size: 14px;">dubbo 2.5.3 Consumer 側(cè)に到著、オペレーティング システムでしばらく待ちましたシステム ソケット バッファー。また、「ゼロ コピー」スピードボートに乗り、実際の目的地ダボ 2.5.3 コンシューマーに到著しました。ここで、<code style="font-size: 14px;word-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin: 0 2px;background-color: rgba(27,31,35,.05);font-family: Operator Mono, Consolas, Monaco, Menlo, monospace;word-break: break-all;color: #ff6441;">NioWorker#run
が無限ループであることがわかり、NioWorker を?qū)g行しました。 #processSelectedKeys
を NioWorker#read
メソッドで読み出すと、ビジネス スレッド プールである AllChannelHandler のスレッド プールに到達しました。
タスクがスケジュールされるのを待って、しばらくここで待っていました。com.alibaba.dubbo.remoting.exchange.support.DefaultFuture#doReceived
が実行され、 Condition のシグナルが同時に実行されました。遠くに閉ざされた糸が目覚めるのが見えた、私が來たことで眠っていた糸が目覚めたのだと理解したようで、これが私の人生の意味だと思う。
この時點で、私の使命は完了し、この旅は終わりました。
netty3 と netty4 のスレッド モデルの概要
netty3 と netty4 のスレッド モデルを自己記述に基づいてまとめます。 2 つのデータ パケット。
1. Netty3 の書き込みプロセス

2. Netty4 の読み取りと書き込み処理

説明: ここには netty3 の読み込み処理はありません netty3 の読み込み処理は netty4 と同じでパイプラインが実行されますIO スレッドによって。
要約: netty3 と netty4 のスレッド モデルの違いは、書き込みプロセスにあります。netty3 では、パイプラインはビジネス スレッドによって実行されますが、netty4 では、読み取りまたは書き込みに関係なく、パイプラインはビジネス スレッドによって実行されます。 IOスレッドによって実行されます。
netty4 の ChannelPipeline のハンドラー チェーンは、I/O スレッドによって均一にシリアルにスケジュールされます。読み取り操作か書き込み操作かに関係なく、netty3 の書き込み操作はビジネス スレッドによって処理されます。 netty4ではスレッド間のコンテキスト切り替えによる消費時間を削減できますが、netty3ではビジネススレッドがハンドラチェーンを並行して実行できるようになります。 netty4 の効率低下につながる時間のかかるハンドラー操作がある場合は、これらの時間のかかる操作をハンドラーで処理するのではなく、最初にビジネス スレッドで実行することを検討できます。業(yè)務スレッドを並行して実行できるため、効率も向上します。
いくつかの困難な問題のトラブルシューティング
プロバイダーによって要求された didi.log が通常の形式で記録される場合など、いくつかの典型的な困難な問題に遭遇しました。コンシューマー側(cè)がタイムアウトしました?,F(xiàn)時點では、次のトラブルシューティングの指示があります。didi.log のフィルターは実際には非常に內(nèi)部レベルにあり、多くの場合、ビジネス メソッドの実際の実行を反映できません。
#プロバイダー ビジネス ディレクションの実行に加えて、シリアル化にも時間がかかる場合があるため、arthas を使用して最も外側(cè)のメソッド org.apache.dubbo.remoting を監(jiān)視できます。 Transport.DecodeHandler #received、ビジネス メソッドの長時間消費の問題を解決します。
#プロバイダーでのデータ パケットの書き込みに時間がかかるかどうか、IO を監(jiān)視します。 .netty.channel.AbstractChannelHandlerContext#invokeWrite メソッド Recv-Q、Send-Q など、netstat を通じて現(xiàn)在の TCP ソケットの一部の情報を確認することもできます。 、Recv-Q は受信バッファに到達しましたが、アプリケーション コードによってまだ読み取られていないデータです。 Send-Q は送信バッファに到達しましたが、相手はまだ Ack データを返していません。これら 2 種類のデータは通常は蓄積されませんが、蓄積されると問題が発生する可能性があります。

- #Consumer NioWorker#processSelectedKeys (dubbo2.5.3) メソッドに時間がかかるかどうかを確認する。
- # 最終的にリンク全體の詳細を確認するまでは...問題は確実に解決できます。
終了対話プロセス全體を通じて、作成者はスレッド スタック呼び出しの詳細とソースの一部を省略しています。シリアル化と逆シリアル化、Dubbo が完全なデータ パケットを読み取る方法、ビジネス メソッドが実行される前にフィルターがどのようにソートおよび分散されるか、Netty の Reactor モードがどのように実裝されるかなどのコードの詳細。とても興味深い質(zhì)問ですね...
以上がゴールド含有量の高いダボ面接の質(zhì)問 5 選!の詳細內(nèi)容です。詳細については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

この記事では、dubbo+nacos+Spring Boot の実際の開発について詳しく説明する例を書きます。この記事では理論的な知識はあまり取り上げませんが、dubbo を nacos と統(tǒng)合して開発環(huán)境を迅速に構(gòu)築する方法を説明する最も簡単な例を書きます。

はじめに Dubbo を紹介する前に、基本的な概念を理解しましょう: Dubbo は RPC フレームワークです. RPC は Remote Procedure Call (リモート プロシージャ コール) です. その反対はローカル プロシージャ コールです. 分散アーキテクチャの前に単一アプリケーション アーキテクチャと垂直アプリケーション アーキテクチャで使用されますこれらはすべてローカル プロシージャ コールです。これにより、プログラマがリモート呼び出しの詳細を明示的にコーディングすることなく、プログラムが別のアドレス空間 (通常はネットワーク上で共有される別のマシン) にあるプロシージャまたは関數(shù)を呼び出すことができます。分散アーキテクチャ アプリケーション間のリモート呼び出しには、ローカル呼び出しと同じくらい単純なリモート呼び出しを行うための RPC フレームワークが必要です。 Dubbo フレームワークには、リモート サービスを呼び出す次のコンポーネント Consumer があります。

[[443126]] いくつかの言葉から始めましょう。私は歩いているときによく技術的な「なぜ質(zhì)問」をたくさん考えます。時々、質(zhì)問について長い間考え、納得できるまで質(zhì)問が終わらないことがあります。質(zhì)問のあらゆる點について私自身が説明します。そこで、その思いを記録し、新たなシリーズとして記事にしたいと思います。これらの記事ではコードを見ることはできないかもしれませんが、見落とされがちないくつかの問題と、問題のより深い「理由」を垣間見ることができます。今日は最初の記事をお屆けします、なぜ Dubbo を Go で書き直す必要があるのですか? Dubbo は Alibaba で生まれ、2011 年にオープンソース化されましたが、10 年が経ちました。 2019 年に Go で書き直されてオープンソース化され、2 年後の現(xiàn)在はオリジナルの V1.0.0 バージョンから V3.0.0 に開発されています。

すでに Dubbo の使用に熟練している場合、この記事は適していませんが、Dubbo を理解し、Dubbo を?qū)W習したい場合には、この記事は非常に適しています。

dockerpullzookeeperdockerrun --namezk01-p2181:2181--restartalways-d2e30cac00aca は、zookeeper が Zookeeper と Dubbo を正常に開始したことを示します。 ? ZooKeeperZooKeeper は、分散型のオープンソース分散アプリケーション調(diào)整サービスです。分散アプリケーションに一貫したサービスを提供するソフトウェアであり、構(gòu)成保守、ドメイン名サービス、分散同期、グループ サービスなどの機能が提供されます。 DubboDubbo は Alibaba のオープンソース分散サービスフレームワークであり、最大の特徴は階層構(gòu)造になっている點です。

はじめに Dubbo は、Alibaba がオープンソース化した高性能で優(yōu)れたサービス フレームワークであり、アプリケーションが高性能 RPC を通じてサービス出力および入力機能を?qū)g現(xiàn)でき、Spring フレームワークとシームレスに統(tǒng)合できます。これは、インターフェイス指向のリモート メソッド呼び出し、インテリジェントなフォールト トレランスと負荷分散、自動サービス登録と検出という 3 つのコア機能を提供します。概要 2020 年 6 月 23 日に、ApacheDubbo は ApacheDubbo のリモート コード実行に関するリスク通知を正式にリリースし、脆弱性番號は CVE-2020-1948、脆弱性レベルは「高リスク」です。 ApacheDubbo は、高性能かつ軽量のオープンソース JavaRPC フレームワークであり、次の 3 つのコア機能を提供します。

dubbo の原理とメカニズムの説明: 1. コアコンポーネント; 2. 通信原理; 3. クラスターフォールトトレランス; 4. 自動検出と登録; 5. ロードバランシングとルーティング; 6. シリアル化と送信; 7. モニタリングとロギング; 8 、スケーラビリティ; 9. セキュリティ; 10. Spring との統(tǒng)合; 11. 他のテクノロジーとの統(tǒng)合。詳細な紹介: 1. 登録センター、監(jiān)視センター、サービス消費者、サービスプロバイダーを含むコアコンポーネント; 2. 通信原理、Dubbo はネットワーク通信フレームワークを使用してサービス呼び出しを行い、それに基づいてさまざまな長期接続を提供します。 。

1. ダボ呼び出し関係の説明 1.1 ここでのコンポーネントは主に 4 つの部分で構(gòu)成されます: プロバイダー: サービスを公開するサービスプロバイダー プロトコル: プロバイダーとコンシューマー間のプロトコル対話データを擔當します サービス: 実際のビジネス サービス情報。インターフェイスと実裝 コンテナ: Dubbo のオペレーティング環(huán)境 コンシューマ: リモート サービスを呼び出すサービス コンシューマ プロトコル: プロバイダとコンシューマの間のプロトコル インタラクション データを擔當する クラスタ: プロバイダ側(cè)でリスト情報を認識する プロキシ: できるプロバイダのサービス呼び出しエージェントとして理解され、コンシューマのインターフェース呼び出しロジックを引き継ぎます。 ●登録: 登録します。
