ネットワークサーバーでデバイスマッチングを最適化する
Redis I / Oの場合、DevAddrの再利用を増やし、DevAddrのサイズを増やすと、メモリ使用量と全体的なコンピューティングパフォーマンスが向上します。
現在、NSはDevAddrによってデバイスにまたがり、プロトをデコードします。 プロトは大きく、mac状態と最近のアップリンクおよびダウンリンクメッセージが含まれています。さらに、重複するDevAddrのプロト(数百)が多数存在する可能性があります。
一致したデバイスをロードする前に、UIDによってデバイスへのアップリンクを一致させるためのRedisのマテリアライズドビューが必要です。
マッチングに関連する情報を専用キーに保存します。基本的には、DevAddr、FCnt、NwkSIntKeys、およびUIDです。
ソートされたセットやハッシュマップは、FCntによるRedisのソートとfrom-queryを可能にし、整合性キーとUIDを取得できるので便利です。
各アップリンクおよびjoin-acceptでこのマテリアライズドビューを更新します。
既存のマッチングスキームへのフォールバックを伴うローリング移行を行うことができます。
ユニットテスト。テストでRedisキーとその値をアサートする可能性があります。
レビューできます
より良いアプローチは、別の方法でこれに取り組むことだと思います。これにより、一般的なケースでもパフォーマンスが向上します。つまり、スペースを消費するデータをプロトから分割し、それらを別々に保存します。つまり、 recent_uplinks
、 recent_downlinks
など、マーシャリングされたプロトではなくリストにこれらを保存する方が理にかなっています。つまり、既存のメッセージを実際にクエリする必要はなく、新しいメッセージを追加するだけで済みます。これははるかに効率的ですが、プロトだけから始めて、そこから始めましょう。
フィールドマスクがあることを考えると、プロトの分割は非常に簡単で、Redisレジストリの実装によって完全に処理されます。
したがって、提案は次のようになります。
ns:devices:uid:foo:bar:recent_uplinks
ns:devices:uid:foo:bar:recent_downlinks
ns:devices:uid:foo:bar:mac_state:recent_uplinks
ns:devices:uid:foo:bar:mac_state:recent_downlinks
ns:devices:uid:foo:bar:pending_mac_state:recent_uplinks
ns:devices:uid:foo:bar:pending_mac_state:recent_downlinks
ns:devices:uid:foo:bar
-残りのプロト非推奨のフィールドがすでにレジストリで処理されているのと同様に、移行は自動的に行われます。
ここのステータスは何ですか?
これは来週の終わりまでにマージの準備ができていると思います。
実装は数週間行われ、それ以来、リファクタリングとテストの適応に取り組んでいます。
デバイスが一致しない場合は、返されたエラーをより明確にすることを検討してください。 たとえば、 https://github.com/TheThingsNetwork/lorawan-stack/issues/2394を参照して
たくさんの情報を提供することはできませんが、 device_not_found
はデバイスが見つからないことを意味しますが、DevAddrがまったく見つからない、MICが見つかったエントリと一致しない、および/または、FCntがリセットされたが、見つかったエントリでは許可されていない。
良い提案ですが、比較的複雑な機能がたくさんあるレビューするのは巨大なPRになるので、次のステップとしてそれを行うのが最善だと思います