Spring Boot(14):レスポンスプログラミングおよびSpring Boot Webfluxクイックエントリー


1.応答プログラミングとは
コンピュータでは、レスポンスプログラミングまたはリアクションプログラミング(英語:Reactive programming)は、データ・ストリームおよび変化伝播向けのプログラミング・モデルです.これは、プログラミング言語で静的または動的なデータ・ストリームを容易に表現でき、関連する計算モデルが自動的に変化した値をデータ・ストリームを介して伝播することを意味します.
例えば、コマンドプログラミング環境では、a=b+cは、式の結果をaに与えることを示し、その後、bまたはcの値を変更してもaに影響を与えない.しかし、応答プログラミングでは、aの値はbまたはcの更新に伴って更新される.
応答プログラミングは、クラスタを介して水平に拡張するのではなく、プログラム内で少量のスレッド拡張を開始するだけで、非同期およびイベント駆動の非ブロックプログラムに基づいている.
1つのシーンを想定して、下位のデータベースから駆動して、持続層、サービス層、MVC層の中のmodelを経て、ユーザーのフロントエンドのインタフェースの要素まで、すべて宣言式のプログラミングの範式を採用して、それによって1本の変化を伝えることができるパイプを構築して、このように私達はデータベースの中のデータを更新するだけで、ユーザーのインタフェースの上で相応の変化が発生して、これにより、フロントエンドポーリングを必要とせずに最新のデータを取得できます.
簡単に言えば、私たちが以前書いたプログラムはブロック式で、要求されたタスクが来ると、スレッドがブロックされ、このタスクが完了してから戻ります.応答プログラミングは、タスクが来るように要求されると、他のスレッドが処理され、タスクの実行が終了した後、非同期の通知が返されます.
2.応答プログラミングを使用する理由
現在のインターネット時代の大きな背景の下で、Webアプリケーションは通常、高同時、大量のデータの挑戦に直面しなければならない.性能はこれまで考慮しなければならない核心要素である.
ブロックは性能殺し屋の一人だ.
多くの人はブロックが大きな問題だとは思わないが、少なくともネットワークI/Oのほかに、ファイルやデータベースの読み書きが速く、多くの人がブロックされたコードを書いていると思っている.
では、I/Oの操作は具体的にどのくらい遅いですか?
2.1 CPUの目に映る時間
以下のソースhttps://blog.csdn.net/get_set...
CPUは絶対に「稲妻侠」と呼ばれています.彼らは仕事をするのに自分の時計を持っているからです.私たちの物語の主人公は2.5 GHzのCPUで、もしその世界にも「秒」の概念があり、その時計が1秒にジャンプしたら、CPU(CPUのコア)の目に映る時間の概念はどのようなものなのでしょうか.
CPUさんがいるグループはハードウェア部計算グループです.それにとって、一緒に緊密に協力しているいくつかのパートナーは、そのリズムに従うことができます.
  • CPUさんは、1秒で1つの命令を完了することができ、複雑な動作には複数の命令が必要になる可能性があります.
  • 幸いなことに、「身近な秘書」の1級キャッシュは反応が速く、CPUさんの意味を秒で理解することができます.
  • 「秘書グループ」からの2次キャッシュは、CPUさんのポイントまで「get」するのに10数秒かかりますが、あまり鈍くはありません.
  • とメモリグループの協力はもう慣れていて、メモリから要求されたデータは通常4-5分で見つけることができます(メモリアドレス)が、まあまあです.結局、1級キャッシュでは80%のデータが得られ、残りの2級キャッシュも大部分を解決することができ、あまり面倒ではありません.
  • CPUさんは典型的な仕事狂で、任務が多い時、徹夜しても文句は言わないが、何かあったら待たせて、それはまるで彼の命だ.ちょうど一緒に仕事をしている他のグループ(特にI/OグループのディスクとNIC)は、比較的効率が低いでしょう.
  • I/Oグループの同僚について、CPUさんは長い間文句を言っていました.SSDを探すたびに、すべて4-5日を費やしてやっと探し当てることができて、データが伝送してくることを待って、数週間すべて過ぎました.機械の磁気ディスクは更にひどくスペクトルから外れて、彼とデータを要して、意外にも平均して10ヶ月を費やしてやっと探し当てることができて、もし1 Mのデータを読み取るならば、意外にも20ヶ月を要します!このような従業員はどうしてまだ仕事を辞めませんか?!
  • ネットワークカードについて、CPUさんはそれらも尽力したことを知っています.結局、万兆ネットワークのコストが高いです.機械室内の他の仲間たちとギガビットネットワークでコミュニケーションをとるのもスムーズで、別の機械のCPUの友達に1 Kの手紙を送って、早ければ7、8時間で送ることができます.しかし、1 Kの手紙は幾重もの小包を経て、実際にはあまり話を書くことができなかった.更に命がけなのは、ネットカード达の疎通の手続きが复雑で、毎回ネットの疎通の前の“あなたはよく私を闻くことができますか?——私は闻くことができて、あなたのあちらは私を闻くことができますか?——私もあなたを闻くことができて、それでは私达は始めましょう!”このような握手確認には長い時間がかかりますが、面と向かってコミュニケーションが取れず、そうするしかありません.これはまあまあですが、一番怖いのは他の都市の友达とコミュニケーションすることです.时にはニュースを伝えるのに何年もかかります.

  • このように、CPUさんにとって、仕事を充実させるのは容易ではありませんが、メモリグループの仲間がI/Oグループに往復するデータをバッチでキャッシュしてくれたおかげで、矛盾が緩和されました.
    この図は明らかにI/Oに関する時間帯しか見えないので、対数目盛りの図に変換して見てみましょう.
    この図は直感的なスケールではなく、横軸上の各目盛りは1桁で、I/Oの速度はCPUやメモリに比べて数桁差があることがわかります.このように,大規模な高同時シーンでのWebアプリケーションでは,キャッシュがどれほど重要であるか,より高いキャッシュヒット率は性能を意味する.
  • 並列化:より多くのスレッドとハードウェアリソースを使用します.
  • 非同期化:既存のリソースに基づいて実行効率を向上させる.

  • 3.基礎概念
    テーマを紹介する前に、いくつかの概念を普及させます.
    3.1 Backpressure(背圧)
    バックプレッシャーは、パブリッシャがエレメントをパブリッシュするのが速すぎる場合、サブスクライバを抑圧しないように、パブリッシャが無制限のバッファストレージエレメントを持つようにする一般的なポリシーです.
    3.2 Reactive Streams(レスポンスストリーム)
    一般的には、次のように構成されています.
  • パブリッシャー:サブスクライバ
  • に要素をパブリッシュ
  • 購読者:消費要素
  • サブスクリプション:パブリッシャでサブスクリプションが作成されると、
  • がサブスクリプションと共有されます.
  • プロセッサ:パブリッシャとサブスクライバの間でデータを処理する
  • 3.3 MonoとFlux
  • Mono:パブリッシャを実装し、0または1の要素
  • を返します.
  • Flux:パブリッシャを実装し、N個の要素
  • を返します.
    4. Spring Webflux
    Spring Boot WebfluxはReactorに基づいて実現される.Spring Boot 2.0には、新しいspring-webfluxモジュールが含まれています.このモジュールには、レスポンスHTTPとWebSocketクライアントのサポート、REST、HTML、WebSocketインタラクションなどのプログラムのサポートが含まれています.一般に、Spring MVCは同期処理、Spring Webfluxは非同期処理に用いられる.
    Spring Boot Webfluxには、Spring MVCのような注釈方式と、その機能的なエンドポイント方式の2つのプログラミングモデルが実装されています.
    4.1適用性
    図を見れば、WebFluxとMVCが交差していることが明らかになった.ただし注意:
  • MVCがシーンを満たす場合は、WebFluxに変更する必要はありません.
  • 容器のサポートに注意してください.以下の内蔵容器のサポートを参照してください.
  • マイクロサービスアーキテクチャで、WebFluxとMVCを混在させることができます.特にIO密集型サービスを開発する場合は、WebFluxを選択して実現します.

  • 4.2内蔵容器
    Spring Bootの大きなフレームワークと同じようにアプリケーションを起動しますが、WebFluxのデフォルトはNettyによって起動され、デフォルトポートは8080に自動的に設定されています.またJetty、Undertowなどの容器へのサポートも提供されている.開発者は、対応するコンテナStarterコンポーネント依存性を追加することで、対応する埋め込みコンテナインスタンスを構成して使用できます.
    ただし、Tomcat、Jettyなどのサーブレット3.1+コンテナでなければなりません.または、NettyやUndertowなどのサーブレット以外のコンテナです.
    4.3データベース
    reactiveプログラミングをサポートするデータベースはMongoDB,redis,Cassandra,Couchbaseのみです.
    4.4クイックハンド
    エンジニアリング依存性
    コードリスト:spring-boot-webflux/pom.xml
    
        org.springframework.boot
        spring-boot-starter-webflux
    

    サービスクラス
    コードリスト:spring-boot-webflux/src/main/java/com/springboot/springbootwebflux/service/impl/UserServiceImpl.java
    @Service
    public class UserServiceImpl implements UserSerivice {
    
        private static Map map = new HashMap<>();
    
        static {
            map.put(1L, new User(1L, "www.geekdigging.com", 18));
            map.put(2L, new User(2L, "     ", 28));
        }
    
        @Override
        public Mono getUserById(Long id) {
    
            return Mono.just(map.get(id));
        }
    }

    Controllerクラス
    コードリスト:spring-boot-webflux/src/main/java/com/springboot/springboot-webflux/controller/UserController.java
    @RestController
    public class UserController {
    
        @Autowired
        UserSerivice userSerivice;
    
        @GetMapping("/getUserById/{id}")
        public Mono getUserById(@PathVariable Long id) {
            return userSerivice.getUserById(id);
        }
    }

    上記の例では,開発モードと以前Spring MVCのモードの差は大きくなく,メソッドの戻り値だけが異なることが分かった.
    5.サンプルコード
    サンプルコード-Github
    サンプルコード-Gitee
    6.参考
    https://blog.csdn.net/get_set...
    http://www.ityouknow.com/spri...
    https://www.cnblogs.com/limum...
    もし私の文章があなたに役に立つならば、コードをスキャンして作者の公衆番号に注目してください:最新の乾物のプッシュを取得します:)