MQTT 仕様には、サーバーとクライアントの保持と状態を管理する接続フラグがあります。
クリーン セッションの仕様では、次のことが提案されています。
3.1.2.4 クリーン セッション位置: 接続フラグ バイトのビット 1。
このビットは、セッション状態の処理を指定します。クライアントとサーバーは、セッション状態を保存して、一連のネットワーク接続全体で信頼性の高いメッセージングを継続できるようにします。このビットは、セッション状態の存続期間を制御するために使用されます。
CleanSession が 0 に設定されている場合、サーバーは現在のセッションの状態に基づいてクライアントとの通信を再開する必要があります (クライアント識別子によって識別されます)。クライアント識別子に関連付けられたセッションがない場合、サーバーは新しいセッションを作成する必要があります。クライアントとサーバーは、クライアントとサーバーが切断された後、セッションを保存する必要があります [MQTT-3.1.2-4]。
CleanSession が 0 に設定されたセッションの切断後、サーバーは切断時にクライアントがセッション状態の一部として持っていたサブスクリプションに一致する QoS 1 および QoS 2 メッセージをさらに保存する必要があります。
そのため、切断後にクライアントが再接続するたびに、ブローカーは確認されていないすべての QoS-1 および QoS-2 メッセージをリレーします。したがって、ブローカーには状態があります。また、すべてのクライアントの状態を維持するために、サーバーは保持のためにいくつかのデータベースを使用します。これらのメッセージの状態 (サーバーが保存する) に Time to Live を与える方法はありますか? 古いメッセージを削除する (つまり、リレーしない) ようにブローカーに指示する方法。5日としましょう。
基本的に、QoS-1 でクリーン セッション = 0 を使用します。しかし、古いメッセージでブローカーの状態をクリアする方法は? 未確認の場合でも、5 日より古いメッセージを受信したくありません。