最初の非同期IO FLINKの全体的な理解の写真
アリ功専用FLINKは、利点がよく言っていない、公式のラインがあり、ライブラリーを書くために、プランジャーより良いパフォーマンスんです
見てその後、FLINKは、2つの主要な非同期IOに分かれています
一つは発注発注されます
一つは順不同乱れています
主な違いは、故障している受注を送信し続けますダウンストリーム出力に命じ、(この順番は自然の両方の非同期のシーケンシャルな書き込みライブラリが保証されていないので、シーケンシャル書き込みライブラリがないことに注意してください)の下流配列に出力され、送信下流に最初に処理前に誰
これら二つのモデルの実装を知るために、2枚の写真
注文:ライブラリのデータを非同期書き込みヘッドが完成されている場合ヘッド場合、記録データは、非同期スレッドライブラリによって書き込まれ、エミッタがキューデータの先頭を引っ張って止めるつもりはないデーモンで、エミッタは、下りのデータ伝送に向かいます非同期書き込みライブラリの要素がまだ完了していない、プランジャー
障害:レコードデータを非同期スレッドライブラリによって書き込まれます、直接completedQueueで成功した後、ライブラリへの非同期書き込みは、エミッタがデーモンであるとき、completedQueueはデータが存在する限り、レコードuncompleteedQueue、上から始め、2つのキューがあり、キューは、ダウンストリームデータを送信し続けます引っ張っ
私たちは、非同期のjavaキューとスレッドの使用は、オーバー合計する、原理は非常に単純である二つの単語を見て、今のソースコードを見ることができます
ここでFLINKでAsyncIOを見に自然OneInputStreamOperator実装クラスで演算子として設計されています
そして、ルックAsyncWaitOperator.javaを取ります
それはopenメソッド(openメソッドがすべて統一タスクマネージャの仕事を開始するときに呼び出されます、そして前回の記事については変えることができます)を参照してください。
ここではデーモンスレッドエミッタは、開始し、具体的スレッド行われてきたものを見
そこ注文に向かって話すと乱れないので、プルデータでは、2でエミッタプルデータを発するように下りデータを取得するために、従来のです
この効果は、エミッタ引っ張るデータが下流の循環に伝達され、ここで知られています
そのopenメソッドで戻るAsyncWaitOperator.javaは、エミッタを初期化し、それはそれはそれはProcessElement()メソッドだかどうかを確認するために、受信したデータを処理する方法であります
実際には、主な方法は3ヶ月です
初!!!レコードには、クラスラッパーのパッケージになった CompleteableFuture(完全なコードが実行されるまでに完了するときに、ユーザの使用者が決定するときに、この方法は、実際に待機します)を作成し、StreamRecordQueueEntry、このラッパークラスの主コンストラクタ
1は、主に対応するキューに要素を追加することの話で、秩序及び無秩序の二種類もあります
差分データを追加するときにこれらの2つのモードは、最初に、ここで話すことはありません。
2を呼び出し、ユーザのコードが続いている、非同期ネットワークは、教えてくださいIOの例を見て
パラメータとして将来を与え、ユーザ自身のスレッドに(ここでは、あなたがスレッドが余裕がない場合ので、プランジャーの上に、その後、processElementメソッドを非同期実行するために、新しいスレッドを開始知りたい、とない非同期理由を考えます)等書き込みライブラリ読み取りライブラリ、および次いで(クラスパッケージのCompleteableFutureフロントある)完全なメソッドパラメータを呼び出し、その結果に導入しました
Facie完全なソース方法
プロパティのStreamRecordQueueEntryつをパッケージごとresultFutureの記録はCompletableFutureです
彼らの論理的な終わりが彼らが新しいスレッドを開始するには、この非同期スレッドの実装を完了し、結果を入力したときにそれは今、ユーザーコードの後に、クリアされます
このことを、なぜそれを使用
図は、それぞれに対応する2とキュー秩序、無秩序キューと、順序および障害の原理の実現の始まりを参照します
OrderedStreamElementQueueクラス
UnorderedStreamElementQueueクラス
戻る前にデータを取得する方法の二つのモデル、細部に1エミッタを行っていない2つの場所があり、そして第二に、データの2つのモードがOrderedStreamElementQueueに参加する方法です
orderedモード:
エミッタデータを引っ張る1.最初のルック規則的パターン、および追加されたデータ
其tryPut()方法
onComplete方法
onCompleteHandler方法
这里比较绕,先将接收的数据加入queue中,然后onComplete()中当上一个异步线程getFuture() 其实就是每个元素包装类里面的那个CompletableFuture,当他结束时(会在用户方法用户调用complete时结束)异步调用传入的对象的 accept方法,accept方法中调用了onCompleteHandler()方法,onCompleteHandler方法中会判断queue是否为空,以及queue的头元素是否完成了用户的异步方法,当完成的时候,就会将headIsCompleted这个对象signalAll()唤醒
2.接着看有序模式Emitter的拉取数据
这里有序方式拉取数据的逻辑很清晰,如果为空或者头元素没有完成用户的异步方法,headIsCompleted这个对象会wait住(上面可以知道,当加入元素的到queue且头元素完成异步方法的时候会signalAll())然后将头数据返回,往下游发送
这样就实现了有序发送,因为Emitter只拉取头元素且已经完成用户异步方法的头元素
无序模式:
这里和有序模式就大同小异了,只是变成了,接收数据后直接加入uncompletedQueue,当数据完成异步方法的时候就,放到completedQueue里面去并signalAll(),只要completedqueue里面有数据,Emitter就拉取往下发
这样就实现了无序模式,也就是异步写入谁先处理完就直接放到完成队列里面去,然后往下发,不用管接收数据的顺序