MQTT API
Machbase Neoは、MQTTプロトコルでデータを取り込み、検索できます。
MQTT APIは、Machbaseのappend機能を活用して書き込み性能を最大化できる点でHTTPより優れています。MQTTはセッション中に接続を維持するため、クライアントはメッセージを繰り返し送信してデータを記録できます。また、MQTTは多くのIoT機器で広く使用されています。
そのため、センサーが収集したデータをMachbase Neoに送信するには、MQTTが最も効率的です。

データ書き込みの流れ
以下の例は、MQTTクライアント(mosquitto_pub)でデータを効率的に記録する方法を示しています。
送信先トピックは、db/write/にテーブル名を連結した文字列である必要があります。
sequenceDiagram
CLIENT->> SERVER: CONNECT
activate SERVER
SERVER -->> CLIENT: CONNACK
deactivate SERVER
loop
CLIENT ->> SERVER: PUBLISH 'db/write/{table_name}'
activate SERVER
SERVER -->> CLIENT: PUBACK
deactivate SERVER
end
CLIENT->> SERVER: DISCONNECT
データ検索の流れ
一般的なMQTTブローカーは、以下の図のように特定のトピックを購読するすべてのクライアントにメッセージを配信します。パブリッシャーがTOPICにM1、M2を送信すると、SUBSCRIBER-AとSUBSCRIBER-Bは同じメッセージを受信します。
flowchart LR
PUBLISHER -->|m1,m2| TOPIC
TOPIC -->|m1, m2| A(SUBSCRIBER-A)
TOPIC -->|m1, m2| B(SUBSCRIBER-B)
Machbase Neoも標準のMQTTブローカーと同様に、すべてのメッセージを購読者に配信します。ただし、クエリの応答メッセージは、要求したクライアントにのみ送信します。つまり、パブリッシャーとサブスクライバーが同じ接続(MQTTでいうセッション)を共有している場合にのみ、クエリ結果が配信されます。Machbase Neoはメッセージブローカーとして動作しますが、クエリ結果のメッセージを他の購読者には複製しません。
たとえば、CLIENT-MとCLIENT-Pが同じTOPICを購読しているとします。
サーバーがCLIENT-M宛てのメッセージM1、M2をTOPICに送信すると、これらはCLIENT-Mにのみ届き、
CLIENT-Pは、サーバーが直接指定したP1、P2を受信します。別のクライアントPUBLISHER-XがTOPICにX1を送信すると、サーバーには届きますが、他のクライアントにはこのイベントは通知されません。
flowchart LR
M -->|m1|Q(db/query)
P -->|p1|Q(db/query)
R -->|m2|M(CLIENT-M)
R -->|p2|P(CLIENT-P)
Q -->|m1| SERVER
Q -->|p1| SERVER
SERVER--> |m2|R(db/reply)
SERVER--> |p2|R
アプリケーションからMQTTでMachbase Neoにクエリを実行するには、まずdb/replyを購読する必要があります。
以下のシーケンス図は、CLIENTがQoS 1を使用する例です。
Machbase Neoは、MQTT v3.1.1のQoS 0と1に対応しています。
CONNECTとCONNACKでMQTTセッションを確立した後、db/queryにクエリメッセージを送信する前に、必ずdb/replyを購読してください。購読していない場合は、クエリ結果を受信できません。
sequenceDiagram
CLIENT->> SERVER: CONNECT
activate SERVER
SERVER -->> CLIENT: CONNACK
deactivate SERVER
CLIENT ->> SERVER: SUBSCRIBE 'db/reply'
activate SERVER
SERVER -->> CLIENT: SUBACK
deactivate SERVER
loop async
CLIENT ->> SERVER: PUBLISH 'db/query'
activate SERVER
SERVER -->> CLIENT: PUBACK
deactivate SERVER
SERVER ->> CLIENT: PUBLISH 'db/reply'
activate CLIENT
CLIENT -->> SERVER: PUBACK
deactivate CLIENT
end
CLIENT->> SERVER: DISCONNECT
メッセージ➍、➎は、MQTTプロトコルの特性によりサーバーから非同期に送信されます。そのため、クライアントアプリケーションでは、この2つのメッセージが特定の順序で届くことを前提にしないでください。
db/appendにのみ発行する場合は、db/replyの購読は不要です。このトピックはクエリ結果を受信する場合にのみ必要です。