[ハッカー口調]反応式プログラミング

7525 ワード

コメントサイト
3月エレガントテクノロジシンポジウム後期
(趙佐斗はシンポジウム後期を書いた時にブログ活動がもっと盛んになった話を見たようですが、シンポジウム後期は初めて読みました…)
Reactive Programming 101:反応式プログラミングとは
SpringWebFluxアクティビティプログラミングの概念1(基礎、用語)のキャプチャ
Project Reactor 3. はんのうりゅう
Project Reactor 4. Flux, Mono
はんのうプログラムせっけい
  • 反応プログラムは
  • 非ブロック/イベントリスナーを開発し、その核心目的は作成者が消費者を圧倒することができず、少量のスレッドで非ブロック/イベントリスナーに拡張できることである.
  • 関数式プログラミング
  • 反応式プログラミングは関数式プログラミングに基づいている.
  • の複数のAPIを収集して提供する必要があるシステムでは、各APIの合計計算時間は同じでなければならない.
  • とは対照的に、いくつかのAPIの中で最も長い完全時間は
  • である.
  • コードには、Threadモデルよりも毒性が読みにくいという欠点がある:
  • NodeJSのようにSpringのように書くために
  • が現れる
    なぜ使うのですか?
    現在、n個のAPIを呼び出す必要があり、すべての結リンゴ値を呼び出す前に、他の操作を実行することができず、要求時間はn個の要求の合計となる.ただし、アクティブシステムを使用すると、要求が非同期で同時に送信されるため、その中で最も長い要求しか必要ありません.
    同期/非同期
    動機、非動機は発信者の立場に立って考えるべきである.
  • の同期方式は
  • で、リクエスト送信時に結果を待つ
  • 非同期送信要求および通知結果
  • 「コール」要求時介入
  • ブロック/非ブロック
    ブロッキング、非ブロッキングは、動機、非同期とは異なり、リクエスト者とプロバイダの2つの角度から考慮する必要があります.
  • ブロックとは、1つのタスクを処理するときに呼び出されたタスクが呼び出しの完了を待つタスクを指す.
  • 非ブロックは、1つのオペレーションの処理時に呼び出されるオペレーションの終了を待つのではなく、
  • によって結果を発行/購読するように通知するブロックである.
    SpringWebFluxは非同期、非ブロックの形式で構成され、すべての関数間の関係はリリース/サブスクリプション形式のファイバモードで接続されています.
    1つのタスクがThreadで処理されると、IOタスクがある場合は、IOタスクを担当するThreadが完了した後に「コール」を依頼し、他の作業を開始する.
    Reactive Streams
    Description
    「Reactive Streams」は2013年にNetflix、Pivotal、TimeSafeの開発者によって初めて提案され制定されたもので、「反応式プログラミング」のための規範である.
    ビジネスシステム開発者は、「アクティブStreams」で定義されたインタフェースを実装することで、「アクティブプログラミング」を実現できます.
    Reactive Streams Interface
  • Processor
  • Publisher
  • Subscriber
  • Subscription
  • Reactive Streamsで定義されているコードは次のとおりです.個別のインプリメンテーションが必要であり,最も一般的なインプリメンテーションライブラリはRxJavaであり,またProject Reactorなどがある.
    public interface Processor<T, R> extends Subscriber<T>, Publisher<R> {}
    
    public interface Publisher<T> {
        public void subscribe(Subscriber<? super T> s);
    }
    
    public interface Subscriber<T> {
        public void onSubscribe(Subscription s);
        public void onNext(T t);
        public void onError(Throwable t);
        public void onComplete();
    }
    
    public interface Subscription {
        public void request(long n);
        public void cancel();
    }
  • SubscriberがPublisherに購読すると、Publisherはデータまたはシーケンスを渡します.
  • を転送する前に、パブリッシャーは、Subscribeで定義されたonSubscribe()を呼び出し、Subscriberは、Request(n)要求を呼び出していくつかのデータを送信する.
  • は、要求(n)を呼び出してデータ転送を要求する場合、パブリッシャは、0からN個のデータまたはシーケンスを速博アプリケーションに送信する.
  • このプロセスでは、エラーが発生するとonError()が呼び出され、データ(シーケンス)の転送が完了するとonComplete()が呼び出されます.
  • SubscriberがPublisherに要求するプロセスは、一般にBack-presureと呼ばれ、Pushのデータ(シーケンス)ストリームを制御することができる.「要求」(1)が呼び出されると、送信は1つしか要求されません.「要求」(MAX)が呼び出されると、最大値のデータが要求されます.
  • Reactor
    Reactorは「Reactive Streams」のインプリメンテーションであり、JVMに提供される非ブロック処理アクティブプログラミングライブラリである.Spring 5が提供する反応式プログラミングはすべてReactorに基づいて実現される.
    reactor 3のコアモジュール「reactor-core」はSpringWebfluxにすでに含まれています.
    Publisher実装、Flux、Mono
    ReactorのコアはFluxとMonoであり、Publisherのインプリメンテーションであり、「Reactive Streams」インタフェースでデータ(シーケンス)を提供する発行者として機能します.
    Fluxは、0~N個のデータを転送することができる.
    Monoは0から1個のデータを転送できます.
    Flux
    FluxはReactive Streamsで定義されたPublisherのインプリメンテーションで、0-N個のデータを公開(転送と解放)することができます.1つのデータを渡すたびにonNextイベントが発生します.Fluxのすべてのデータの転送処理が完了すると、onCompleteイベントが発生します.データの転送中にエラーが発生すると、onErrorイベントが発生します.
    Mono
    MonoはReactive Streamsで定義されたPublisherの実装体であり、0-1個のデータを処理する.