1.2. 【拡張仕様】データの永続化

本拡張仕様は、iSCP 2.0 により伝送されるデータの永続化する方法について規定します。

1.2.1. メッセージの拡張

本拡張仕様では、 Upstream Open RequestUpstream Close Request および Upstream Metadata の拡張フィールドを使用します。 これらの拡張フィールドの内容は、 拡張フィールド用のレジストリ に登録されています。

表 76 Upstream Open Request Extension Fields の拡張

和名

英名

データ型

永続化フラグ

Persist

真偽値

永続化フラグ - Persist

データポイントの永続化要否を表します。

表 77 Upstream Close Request Extension Fields の拡張

和名

英名

データ型

セッション終了フラグ

Close Session

真偽値

セッション終了フラグ - Close Session

セッションの終了要否を表します。

表 78 Upstream Metadata Extension Fields の拡張

和名

英名

データ型

永続化フラグ

Persist

真偽値

永続化フラグ - Persist

メタデータの永続化要否を表します。

1.2.2. データポイントの永続化

データポイントを送信するノードは、上りストリームを開く際、 Upstream Open Request の拡張フィールドを用いて、送信したデータの永続化要否をブローカーに伝えることができます。 送信したデータの永続化が必要な場合は、拡張フィールドの永続化フラグをセットします。

Upstream Open Request を受信したブローカーは、拡張フィールドの永続化フラグを確認し、値が true の場合は永続化処理の準備を行います。 永続化の準備では、セッションIDをキーとして、すでに永続化されているセッションが存在するかを確認します。 すでに永続化されているセッションが存在する場合は、 ブローカーはその上りストリームを経由して伝送された時系列データを、そのセッションに属するものとして永続化しなければなりません。

各セッションは、 Connect Request にて指定されたノードIDが表すノードが生成したものとみなされます。 もし、すでに永続化されているセッションの送信元ノードと、新たに永続化しようと Upstream Open Request を送ったノードが異なる場合は、 Upstream Open Response にて、 NODE_ID_MISMATCH の結果コードを返却しなければなりません。

Upstream Open Request を受信した時点で、永続化先のセッションが既に終了(finished)していた場合は、 Upstream Open Response にて、 SESSION_ALREADY_CLOSED の結果コードを返却しなければなりません。

すでに永続化されているセッションが存在しない場合は、ブローカーは、新しいセッションを暗黙的に開始することができます。 新しいセッションを暗黙的に開始した場合、その上りストリームを経由して伝送された時系列データを、開始したセッションに属するものとして永続化します。 新しいセッションを開始しない場合は、 SESSION_NOT_FOUND の結果コードを返却しなければなりません。

永続化フラグの値が false である場合、または、永続化フラグのフィールドに値がセットされていない場合は、ブローカーは永続化処理を行いません。 ただし、データの転送処理は必ず行わなければなりません。

Upstream Close Request にて上りストリームを正常終了した際、 ノードはブローカーにこのメッセージによって、そのストリームで送信された総データポイント数を通知します。 ブローカーは、通知された総データポイント数と実際に受信したデータポイント数を比較して、データの永続化率を算出することができます。

Upstream Chunk により、データが送信された際に、永続化先のセッションが既に終了(finished)していた場合は、 Upstream Chunk Ack にて、 SESSION_ALREADY_CLOSED の結果コードを返却しなければなりません。

1.2.3. 基準時刻の永続化

Upstream Metadata による基準時刻の送信時においても、データポイント送信時と同様に、 Upstream Metadata の拡張フィールドを用いて、送信した基準時刻の永続化要否をブローカーに伝えることができます。 送信した基準時刻の永続化が必要な場合は、拡張フィールドの永続化フラグをセットします。

Upstream Metadata にて基準時刻を受信したブローカーは、拡張フィールドの永続化フラグを確認し、値が true の場合は永続化処理を行います。 永続化処理では、セッションIDをキーとして、すでに永続化されているセッションが存在するかを確認します。 すでに永続化されているセッションが存在する場合は、ブローカーは、送信された基準時刻をそのセッションに属するものとして永続化しなければなりません。

データの永続化と同様、すでに永続化されているセッションの送信元ノードと、新たに永続化しようと Upstream Metadata を送ったノードが異なる場合は、 Upstream Metadata Ack にて、 NODE_ID_MISMATCH の結果コードを返却しなければなりません。

すでに永続化されているセッションが存在しない場合は、ブローカーは、新しいセッションを暗黙的に開始することができます。 新しいセッションを暗黙的に開始した場合、送信された基準時刻を、開始したセッションに属するものとして永続化します。 新しいセッションを開始しない場合は、 SESSION_NOT_FOUND の結果コードを返却しなければなりません。

永続化フラグの値が false である場合、または、永続化フラグのフィールドに値がセットされていない場合は、ブローカーは永続化処理を行いません。 ただし、メタデータの転送処理は必ず行わなければなりません。

Upstream Metadata により、基準時刻が送信された際に、永続化先のセッションが既に終了(finished)していた場合は、 Upstream Metadata Ack にて、 SESSION_ALREADY_CLOSED の結果コードを返却しなければなりません。

1.2.4. ストリームと連動したセッションの終了

ノードは、上りストリームを終了する際に、そのストリームが紐づくセッションの終了を、 Upstream Close Request の拡張フィールドを用いて、ブローカーに要求することができます。 ストリームが紐づくセッションを終了したい場合は、拡張フィールドのセッション終了フラグをセットします。

セッション終了フラグがセットされた Upstream Close Request を受け取ったサーバーは、対応するセッションを終了させようと試みます。 もし、他に開いている上りストリームが存在している場合は、セッションを終了することはできません。 セッションを終了できなかった場合は、 Upstream Close Response にて、 SESSION_CANNOT_CLOSED の結果コードを返却しなければなりません。 また、セッション終了以外のすべての処理が正常に実行できる場合は、結果コードの返却前に、セッション終了以外のすべての処理を実行しなければなりません。

1.2.5. データの完全回収

QoS=RELIABLE を使用してデータを送信した場合、伝送欠損が発生し得るのは下位のネットワーク接続が異常切断したタイミングのみです。 iSCP はストリームの再開メカニズムを持つため、ストリームの有効期限内にネットワーク接続を再開しストリームを再開することで、At Most Once な伝送を継続することができます。 永続化フラグを true に設定し、かつ、有効期限切れを発生させずにデータを伝送した場合は、ブローカーが上りストリームからデータを受け取った際にデータを永続化するため、 伝送された時系列データは全て正しく永続化されます。

ネットワーク接続が異常切断したあと、ストリームの有効期限内に接続を再開することができなかった場合は、異常切断後のデータがブローカーに到達しません。 このような場合に備え、ブローカーは別途データポイントやメタデータを永続化するエンドポイントを提供する必要があります。 データを完全回収するためには、ノードはACKの受信によりサーバーへの到達が確認されていないデータを、この永続化エンドポイントを使用して永続化しなければなりません。

一方、 QoS=UNRELIABLE を使用してデータを送信した場合は、いつでも伝送欠損が発生し得ます。 データを送信した後妥当なタイムアウト時間だけ待機してもACKが受信できない場合は、ノードは、ACKを受信できなかったデータを伝送欠損とみなします。 データを完全回収するためには、伝送欠損とみなされたデータを永続化エンドポイントを使用して永続化しなければなりません。

伝送欠損扱いとなったデータの再送信のタイミングは、本仕様では規定しません。 例えば、iSCP による他のデータの伝送中であっても、伝送帯域に余裕があれば再送信して構いません。 iSCP による他のデータ送信が終了してから、空いた帯域を使用して再送信することもできます。

1.2.6. 結果コード

本拡張仕様で使用する結果コードを定義します。 これらの結果コードは、 結果コード用のレジストリ に登録されています。

表 79 異常コード

コード名

数値

説明

NODE_ID_MISMATCH

0x80 (128)

すでに永続化されているセッションの送信元ノードと、新たに永続化しようとするノードが異なることを表します。

SESSION_NOT_FOUND

0x81 (129)

永続化先に指定されたセッションが存在しないことを表します。

SESSION_ALREADY_CLOSED

0x82 (130)

永続化先に指定されたセッションが既に終了していることを表します。

SESSION_CANNOT_CLOSED

0x83 (131)

永続化先に指定されたセッションが既に終了していることを表します。