この記事ではCorda OS 4.5及びCorda Enterprise 4.5で実装された
SendAll / SendAllMapについて記載します。
Corda OS 4.5及びCorda Enterprise 4.5以前では、sendAPIを各カウンターパーティに対して1回ずつ使用することで、Flowを複数のカウンターパーティに送信していました。
Corda OS 4.5及びCorda Enterprise 4.5で実装されたSendAll / SendAllMapを使用することで、APIの一度の使用で複数の取引相手にメッセージを送信できる様になり、以前に比べ優れたパフォーマンスで実現できる様になりました。
概要
Cordaのネットワークは、カウンターパーティ間の通信にポイントツーポイントのメッセージングを使用します。 これは、Node間でメッセージを渡すことによって行われ、各Nodeは、基本的に、他の単一のNodeからのメッセージに応答するように登録されたFlowをもっています。
Flowの概念に詳しくない場合は、Cordaの公式ドキュメントを参照してください。 here
Corda OS 4.4とCorda Enterprise 4.4までは、ノードは、sendAPIを相手毎に複数回呼び出すことによってのみ、複数の相手にメッセージを送信できました。
Corda OS 4.5とCorda Enterprise 4.5では、複数のNodeにメッセージをより効率的に送信するために、2つの便利なAPI、 sendAllとsendAllMapが導入されました。
背景
次の図は、標準のsendAPIが実際にどのように機能するかを示しています。
この例では、Node1はNode2及びNode3との2つのセッションを開始し、send APIを2回使用して、それらのNodeにメッセージを送信します。 以下のコード例は上記図と同じことを示しています。
上手くいきますが...
上記の例は機能しますが、多くのNodeに送信する必要があるメッセージの場合、パフォーマンスの点で最適ではありません。 Cordaのすべての関数と同様に、 sendAPIはSuspendable です。つまり、FLowがブロッキング状態になると、それらの関数はディスクにシリアル化されます。
このアプローチの利点は、ノードが一度にアクティブな多くのFlowを処理できることです。これは、ノードの再起動やアップグレードまで、数日続くこともあります。
欠点は、多くの一時停止により、多くのシリアル化されたオブジェクトがディスクに作成されるため
I / Oが多くなることです。
Flowフレームワークの内部について詳しく知りたい場合は、
Cordaの公式ドキュメントを参照してください。here.
より効率的なソリューション
Corda 4.5では、複数のセッションにメッセージを一度に送信できる2つの新しいAPI sendAllとsendAllMapが導入されています 。
https://docs.corda.net/docs/corda-os/4.5/release-notes.html#new-flow-apis
新しいAPIで同時に処理できるセッション数の制限はありませんが
特にメッセージサイズが大きい場合は、常にメモリ使用量に注意してください。
SendAll
以下の図は、それがどのように機能するかを示しています。
Node1はNode2とNode3の両方に同じメッセージを送信します。 Node1は両方のカウンターパーティからの応答を待って中断されたままです。 次の例は、それをコードで示しています。
SendAllMap
以下のスキーマは、それがどのように機能するかを示しています。
Node1はNode2とNode3に異なるメッセージを送信します。 sendAllと同じように、ここでもNode1は両方のカウンターパーティからの応答を待って中断されたままです。
次の例は、それをコードで示しています。
エラー処理
カウンターパーティのいずれかがフロー中に例外を発生させた場合、それらは receiveAllによってキャッチされ、通常どおりFlow Hospitalによって処理されます。 これに関しては何も変更されていないため、お客様はフローの変更について心配する必要はありません。
Cordaの公式ドキュメントでFlow Hospitalの詳細をご覧ください。here
Corda Enterprise 4.5のパフォーマンスの向上
sendAllMapAPIが次のエンタープライズサブフローで使用されるようになりました。 より良い並列化の利点が、Corda Enterpriseのトランザクション管理全体にまで拡張されます。
-EnterpriseFinalityFlow、トランザクションのファイナライズに使用されるエンタープライズバージョンのサブフロー。
-EnterpriseCollectSignaturesFlow、他の必要な署名者の署名を自動的に収集するために使用されるエンタープライズバージョンのサブフロー。
公式ドキュメント:
https://docs.corda.net/docs/corda-os/4.5/api-flows.html#
https://docs.corda.net/docs/corda-os/4.5/api-flows.html#common-flow-tasks
https://docs.corda.net/docs/corda-enterprise/4.5/cordapps/api-flows.html#
Created by Yoshino
Last update 2020/8/17