MQTT v5のデータ書き込み
MQTT v5のトピック
Since v8.0.33MQTT v5では、各メッセージにユーザー定義のプロパティを付加できます。以前のバージョン(MQTT v3.1/v3.1.1)より柔軟で、メッセージに追加のメタデータを含められます。
MQTT v5では、トピックをdb/write/{table}のように簡単に指定し、以下のユーザープロパティを送信できます。
| ユーザープロパティ | 既定値 | 値 |
|---|---|---|
| format | json | csv, json, ndjson |
| timeformat | ns | 時刻の形式:s、ms、us、ns |
| tz | UTC | タイムゾーン:UTC、Local、地域指定 |
| compress | gzip | |
| method | insert | insert, append |
| reply | サーバーが結果メッセージを送信するトピック | |
| db | MACHBASEDB | 複数データベース環境で対象データベース名を指定します。 Since v8.7.0 |
format=csvの場合の追加プロパティ
| ユーザープロパティ | 既定値 | 値 |
|---|---|---|
| delimiter | , | |
| header | skip, columns |
header=columnsはmethod=appendと併用できません。複数データベース
サーバーが複数の名前付きデータベースをホストする場合、dbユーザープロパティで対象を指定できます。method=insertとmethod=appendの両方に適用されます。dbを省略するか空にすると、既定のデータベースMACHBASEDBが対象になります。
トピックの{table}部分に、db.user.tableまたはuser.table形式の修飾名を含めることもできます(MQTT v3.1のデータ書き込みを参照)。トピックに修飾名がある場合は、常にdbユーザープロパティより優先されます。
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property db OTHERDB \
-s << 'EOF'
[ "my-car", 1670380342000000000, 32.1 ]
EOFAPPEND方式
MQTTは接続指向のプロトコルであるため、同じセッションを維持してデータを繰り返し送信できます。 これは、HTTPの代わりにMQTTを使用する大きな利点です。
以下は、mosquitto_pubを使用したデモです。
このツールは1件のメッセージを発行すると接続を切るため、HTTPのwrite APIより性能が向上しない場合や、遅くなる場合があります。
この方式は、接続を比較的長く維持し、複数のメッセージを送信できるクライアントで使用してください。
JSON
複数レコードの発行
以下の例のペイロードは、タプルの配列(JSONでは配列の配列)です。 1つのMQTTメッセージで、複数のレコードをappendします。
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property method append \
-s << 'EOF'
[
[ "my-car", 1670380342000000000, 32.1 ],
[ "my-car", 1670380343000000000, 65.4 ],
[ "my-car", 1670380344000000000, 76.5 ]
]
EOF- JSHアプリ
次のJSHアプリは、JavaScriptからMQTTでMachbase Neoのテーブルに複数のレコードを書き込む方法を示します。
このコードは、独立したJSHスクリプト、またはTQLスクリプトのSCRIPT()関数で実行できます。
append方式と配列ペイロードにより、IoTやリアルタイムのデータ収集に適した高いスループットを確保できます。
コードの主要な部分を、以下で順に示します。
| |
単一レコードの発行
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property method append \
-s << 'EOF'
[ "my-car", 1670380345000000000, 87.6 ]
EOFgzip圧縮したJSONの発行
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property method append \
-D PUBLISH user-property compress gzip \
-f mqtt-data.json.gzNDJSON
Since v8.0.33NDJSON(Newline Delimited JSON)は、各行が完全なJSONオブジェクトとなるストリーミング形式です。大規模なデータやストリーミングデータの処理に便利です。 各行には、テーブルの列名と一致するフィールドを含める必要があります。
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property method append \
-D PUBLISH user-property format ndjson \
-s << 'EOF'
{"NAME":"ndjson-data", "TIME":1670380342000000000, "VALUE":1.001}
{"NAME":"ndjson-data", "TIME":1670380343000000000, "VALUE":2.002}
EOFCSV
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property format csv \
-D PUBLISH user-property method append \
-D PUBLISH user-property header skip \
-D PUBLISH user-property timeformat s \
-s << 'EOF'
NAME,TIME,VALUE
my-car,1670380346,87.7
my-car,1670380347,98.6
my-car,1670380348,99.9
EOF強調したheader=skipオプションは、最初の行がヘッダーであることを示します。
gzip圧縮したCSVの発行
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property format csv \
-D PUBLISH user-property method append \
-D PUBLISH user-property header skip \
-D PUBLISH user-property timeformat s \
-D PUBLISH user-property compress gzip \
-f mqtt-data.csv.gzINSERT方式
MQTTで性能を最適化するには、append方式を推奨します。
データのフィールド順がテーブルの列順と異なる場合や、一部の列だけを含む場合に、insert方式を使用してください。
フィールド数または順序がテーブルと異なる場合は、appendではなくinsertを使用する必要があります。
JSON
db/writeは、SQLのINSERT INTO table(...) VALUES(...)と同じように動作します。テーブルの列順と異なる場合や一部の列だけを書き込む場合は、JSONペイロードに列情報を含めてください。
methodプロパティの既定値はinsertのため、省略できます。
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property method insert \
-s << 'EOF'
{
"data": {
"columns": ["name", "time", "value"],
"rows": [
[ "wave.pi", 1687481466000000000, 1.2345],
[ "wave.pi", 1687481467000000000, 3.1415]
]
}
}
EOFNDJSON
Since v8.0.33このリクエストメッセージは、INSERT INTO {table} (columns...) VALUES (values...)文と同じ構造です。
methodプロパティの既定値はinsertのため、省略できます。
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property method insert \
-D PUBLISH user-property format ndjson \
-D PUBLISH user-property timeformat s \
-s << 'EOF'
{"NAME":"ndjson-data", "TIME":1670380342, "VALUE":1.001}
{"NAME":"ndjson-data", "TIME":1670380343, "VALUE":2.002}
EOFCSV
テーブルの列とフィールド数または順序が異なるCSVデータをINSERT方式で送信するには、MQTT v5のユーザー定義プロパティを使用する必要があります。
mosquitto_pub -h 127.0.0.1 -p 5653 -V 5 -t db/write/EXAMPLE \
-D PUBLISH user-property format csv \
-D PUBLISH user-property method insert \
-D PUBLISH user-property header columns \
-D PUBLISH user-property timeformat ms \
-s << 'EOF'
VALUE,NAME,TIME
87.7,my-car,1670380346000
98.6,my-car,1670380347000
99.9,my-car,1670380348000
EOFTQL
db/tql/{file.tql}トピックは、TQLファイルの実行に使用します。
データを変換して保存するには、適切なTQLスクリプトを用意し、db/tql/{file.tql}トピックにデータを発行します。
MQTTとTQLでのデータ書き込みについては、書き込みAPIとしての使用を参照してください。
メッセージの最大サイズ
MQTT仕様では、PUBLISHメッセージの最大ペイロードサイズは256MBです。悪意のあるクライアントや誤動作したクライアントが大きなメッセージを送り続けると、サーバーのネットワークとリソースを消費し、サービス障害を引き起こす可能性があります。最大メッセージサイズは、クライアントの必要量より少し大きく設定することを推奨します。MQTTの既定の最大メッセージサイズは1MB(1048576)です。以下のように、コマンドラインフラグまたは設定ファイルのMaxMessageSizeLimitで調整できます。
machbase-neo serve --mqtt-max-message 1048576