非同期モデルとデバッグの問題


ひどうきモデル


AというモジュールがBモジュールにどのようなサービスを要求するかを考えてみましょう.同期プログラミング構造では、Aは、B処理および応答要求を選択的に待つ必要がある.一方,非同期プログラミング構造では,AはBがサービス処理を完了するのを待つことなく,要求するだけで直ちに他の操作を実行し,応答イベントが発生したときに応答を処理する.次のグラフは分かりやすいです.

長所


非同期方式の利点は、類似の要求を多くのBモジュールに関連付ける必要がある場合、これは非常に明らかである.図に示すように、同期方式は、各要求が応答を完了した後に次の要求を処理し、非同期方式は、要求を全員に連続的に送信した後に応答を待つため、処理速度が速い.

短所


非同期実行ストリームを得るためには、AおよびBは自然に異なるスレッドによって処理されなければならない.したがって、問題が発生した場合、プロセスに沿ってデバッグすることはできません.このストリームは静的ではないため,実際に実行せず,コードのみを見て問題を探す方式は同期方式に比べてかなり困難である.

デバッグの問題


次に、非同期プログラミング構造で作成した2つのエラーモジュールのPseudoeコードを示します.
  • モジュールは、2つのスレッドから構成される.1つはコマンドを送信するために使用され、もう1つは応答を待つために使用され、もう1つは応答を受信し、送信側に応答を受信するように通知するために使用される.
  • Java、Nettyベース.
  • の実際の具体的なコードとは少し異なりますが、理解を助けるために、簡単にPseudoコードに書き換えます.
  • 皆さんは問題を見るのは簡単ですか.コードを1行1行デバッグする前に、理由が全然分かりません.この文章を読む人の考え(?)あげると面白いと思うので質問を残しておきましょう理解を助けるために、簡単な制限と背景の説明を追加することをお勧めします.
  • は、すべてのデータ構造(キュー、マッピングなど)が安全であると仮定する.
  • コマンドの応答IDは、コマンドIDと同じである.
  • ターゲットシステムは物理ハードウェアシステムである.したがって,一度に1つのコマンドしか処理できない.
  • しかし、当社のソフトウェアは非同期構造(Netty)を有するため、コマンド応答を同期して順次要求する必要があります.
  • 送信コード

  • キューからコマンドメッセージがポップアップされます.
  • 通信チャネルにメッセージを送信する.
  • コマンド-レスポンス同期オブジェクトを作成します.
  • コマンドIDをキーとして、マッピングに同期オブジェクトを追加します.マッピングを使用するのは、コマンドの応答をマッチングして処理するためです.コマンドに関係のない応答が通過します.
  • 応答を受信するには2秒かかります.
  • loop {
    	Message command = commandQueue.pop(); // 1
    
    	channel.write(command); // 2
    
    	SyncObject syncObj = new SyncObject(); // 3
    
    	syncMap.put(command.id, syncObj) // 4
    	
    	syncObj.wait(2000) // 5
    }

    受信コード

  • は、チャネルキューから応答メッセージをポップアップする.
  • マッピングでは、応答IDの同期オブジェクトがポップアップされる.
  • 処理は、
  • が待機応答を持っている場合にのみ行われる.
  • 応答通知応答応答中のスレッド.
  • マッピングからレスポンスオブジェクトを削除します.
  • 通信ライン上の次のプロセッサにメッセージを送信する.
  • loop {
    	Message response= responseQueue.pop();  // 1
    	syncObj = syncMap.get(response.id); // 2
    	
    	if (syncObj != null) {  // 3
    		syncObj.signal();  // 4
    		syncMap.remove(response.id);  // 5
    	}
    
    	pipeline.next(response); // 6
    }
    ※問題の提示はコードの位置と順序に関係しています.たとえば、受信コードで送信コードの作業を完了するか、送信コードのコード順序をこのように変更する必要があります.モジュールの背景は次のとおりです.