MQTT送信バッファの強化とバックプレッシャー通知の設定

MQTTの送信順序保証

MQTTメッセージ送信の順序保証機能は、cloud_config.jsonかNode-REDノード(ice backend in/ice backend out)のDestination設定にて設定が可能です。

cloud_config.jsonに設定する場合

cloud_config.jsonのMQTT用Destinationに本機能の設定を行うことで、設定を反映することができます。

mqtt.optionsに以下のように設定を行います。

    "default": {
        "type": "mqtt",
        ...
        "config": {
            ...
            "options": {
                "ice":{
                    "sendInOrder": {
                        "enabled": true,
                        "ackTimeoutSec": 5,
                        "drainMsg": {
                            "mode": "always",
                            "intervalSec": 1
                        }
                    }
                }
            }
        }
    }

sendInOrderプロパティ配下の設定項目の説明は以下の通りです。

  • enabled

メッセージをpublish順序通りに送信するフラグ。trueの場合に順序保証機能が有効となります。省略時(規定値)はfalse。

  • ackTimeoutSec

順序保証機能が有効な場合に、ACK受信を待つ時間を秒で設定します。1~2147483647の整数を設定可能です。MQTT Brokerから指定時間ACKが戻らなかった際にメッセージを再送します。規定値(省略時)は5。

  • drainMsg.mode

順序保証機能が有効な場合に、メッセージの送信間隔制御を行うタイミングを設定します。"always"、"reconnect"、"off"が指定可能です。"always"の場合、常に送信間隔を制御(少なくともintervalSec以上の間隔を空けてメッセージ送信を行う)します。"reconnect"の場合、ネットワーク復旧時のみ送信間隔を制御します。"off"の場合、送信間隔を制御せずメッセージを即時送信します。省略時(規定値)は"off"。

  • drainMsg.intervalSec

modeが"always"、"reconnect"の場合のメッセージ送信間隔を秒で設定します。1~2147483647の整数を設定可能です。省略時(規定値)は1。

modeが"always"の場合、前のメッセージ送信からintervalSec経過するまで次のメッセージ送信を待機します。"reconnect"の場合、ネットワーク切断・復旧後に送信バッファが空になるまでの間のみメッセージの送信間隔制御を行い、送信バッファが空になると再度ネットワークが切断されるまで、待機時間なしで次のメッセージ送信を行います。

Node-REDノードに設定する場合

ice backend in、ice backend outノードの接続先設定(Destination)でmqttを選択した場合に設定可能です。 設定を行ったノードにのみ設定が反映されます。

DestinationのOptionsに以下のように設定を行います。

    {
        "ice":{
            "sendInOrder": {
                "enabled": true,
                "ackTimeoutSec": 5,
                "drainMsg": {
                    "mode": "always",
                    "intervalSec": 1
                }
            }
        }
    }

ice backend in、ice backend outの設定については、 Backend 接続用ノード を参照してください。

MQTT送信バッファの有効期限設定

MQTT送信バッファは、core_config.jsonかNode-REDノード(ice backend in/ice backend out)のDestination設定にて設定が可能です。

core_config.jsonに設定する場合

core_config.jsonに本機能の設定を行うことで、cloud_config.jsonに定義済みのadm、app、maを含めたすべてのMQTT接続に 設定を反映することができます。

mqtt.optionsに以下のように設定を行います。

    {
        "mqtt": {
            "options": {
                "outgoingStore":{
                    "type": "memory_ttl",
                    "max": 10000,
                    "ttlSec": 3600,
                    "checkIntervalSec": 60
                }
            }
        }
    }

設定項目の説明は以下の通りです。

  • type

使用する送信バッファの種類を指定します。有効期限付きの送信バッファを使用する場合、"memory_ttl"を指定します。省略時、もしくは"memory"設定時は、従来のインメモリ送信バッファが使用されます。

  • max

送信バッファのメッセージ数上限を1~65535の範囲で指定します。設定値を超えてメッセージが投入された場合、古いメッセージから削除します。規定値(省略時)は10000。

  • ttlSec

メッセージの有効期限を秒で指定します。0~2147483647の範囲で指定可能です。0の場合は有効期限なしとなります。送信バッファに格納されてから指定秒数経過したメッセージは有効期限切れとなり、checkIntervalSecのチェック時に削除されます。規定値(省略時)は3600。

  • checkIntervalSec

メッセージの有効期限切れのチェック間隔を秒で指定します。1~2147483647の範囲で指定可能です。規定値(省略時)は60。

Operability Add-onが適用されていない環境でtypeに"memory_ttl"を指定した場合、従来のインメモリ送信バッファ("memory")が適用されます。

maxやttlSecの設定により、送信バッファからメッセージが削除された場合、イベント通知機能によりメッセージ削除が通知されます。

Node-REDノードに設定する場合

ice backend in、ice backend outノードの接続先設定(Destination)でmqttを選択した場合に設定可能です。 設定を行ったノードにのみ設定が反映されます。

DestinationのOptionsに以下のように設定を行います。

    {
        "outgoingStore":{
            "type": "memory_ttl",
            "max": 10000,
            "ttlSec": 3600,
            "checkIntervalSec": 60
        }
    }

ice backend in、ice backend outの設定については、 Backend 接続用ノード を参照してください。

MQTTの再接続待機

MQTTの再接続待機は、core_config.jsonかNode-REDノード(ice backend in/ice backend out)のDestination設定にて設定が可能です。

core_config.jsonに設定する場合

core_config.jsonに本機能の設定を行うことで、cloud_config.jsonに定義済みのadm、app、maを含めたすべてのMQTT接続に 設定を反映することができます。

mqtt.optionsに以下のように設定を行います。

    {
        "mqtt": {
            "options": {
                "ice":{
                    "waitReconnect": {
                        "enabled": true,
                        "minMSec": 300000,
                        "maxMSec": 600000
                    }
                },
                "reconnectPeriod": 1000
            }
        }
    }

sendInOrderプロパティ配下の設定項目の説明は以下の通りです。 * enabled

trueの場合に再接続待機の機能が有効となります。省略時(規定値)はfalse。待機する時間は、minMSec~maxMSecまでの間でランダムです。

  • minMSec

再接続開始までの最小待ち時間をミリ秒で設定します。1~2147483647の整数を設定可能です。規定値(省略時)は300000。

  • maxMSec

再接続開始までの最大待ち時間をミリ秒で設定します。1~2147483647の整数を設定可能です。規定値(省略時)は600000。

  • reconnectPeriod

再接続試行の間隔をミリ秒で設定します。0~2147483647の整数を設定可能です。0を設定した場合は再接続を行いません。規定値(省略時)は1000。

ネットワーク切断を検知すると、再接続開始までminMSecmaxMSecのランダム秒待機します。再接続開始後は、reconnectPeriodで指定した一定間隔で再接続要求を行います。

Node-REDノードに設定する場合

ice backend in、ice backend outノードの接続先設定(Destination)でmqttを選択した場合に設定可能です。 設定を行ったノードにのみ設定が反映されます。

DestinationのOptionsに以下のように設定を行います。

    {
        "ice":{
            "waitReconnect": {
                "enabled": true,
                "minMSec": 300000,
                "maxMSec": 600000
            }
        },
        "reconnectPeriod": 1000
    }

ice backend in、ice backend outの設定については、 Backend 接続用ノード を参照してください。

バックプレッシャーイベントの通知

イベント通知機能はcore_config.jsonで有効/無効の切り替えが可能です。
イベント通知機能を有効化するためには、core_config.jsonのnotification.enabledプロパティにtrueを設定します。 falseを設定した場合や、設定省略した場合は無効となります。

    {
        <中略>
        },
        "notification": {
            "enabled": true,
            "initialDelay": 1000
        }
    }
notification.enabled

通知機能の有効/無効を設定します。規定値はfalse。

notification.initialDelay

AP起動時に通知されるイベントを、APに通知するまで何ミリ秒待機させるかを設定します。規定値は1000。statusのイベント通知にのみ有効です。

initialDelayは、APが通知受信用のCallbackを設定する前にイベント通知が行われるのを防ぐ目的で使用します。

デバイスアダプタ/エッジアプリケーションの通知設定

デバイスアダプタ、エッジアプリケーションでは、受け取る通知のタイプをプロファイルの設定で制御することができます。
デフォルトでは通知を受け取らず、notification.enabledにtrueを設定した場合のみ通知が有効になります。

通知機能を利用する場合、下記のようにプロファイルに設定を追加します。

    {
        "notification":{
            "enabled": true,
            "cloud_adapter": {
                "status": {
                    "ice": ["adm_input", "app_output"],
                    "eep": ["name_clientId"]
                },
                "result": true
            }
        }
    }
notification.enabled

通知機能の有効/無効を設定します。規定値はfalse。

notification.cloud_adapter

クラウドアダプタに関する通知の設定を行います。省略した場合、通知を受け取りません。

notification.cloud_adatper.status.ice

statusイベントを受信したいICEのDestinationを配列で列挙します。Destinationは{Destination名}_{Direction}で指定します。"_all"を指定すると、すべてのstatusを受信可能です。

notification.cloud_adapter.status.eep

statusイベントを受信したいEEPのDestinationを配列で列挙します。Destinationは{Destination名}_{Client ID}で指定します。"_all"を指定すると、すべてのstatusを受信可能です。

notification.cloud_adatper.result

resultイベントを受信するかどうかを指定します。規定値はfalse。

Node-REDの通知設定

ice notification inノードを使用することで、Node-REDで通知を受け取ることができます。
設定については、イベント通知受信用ノード