Otimize a correspondência de dispositivos no servidor de rede
Para Redis I / O, uso de memória e desempenho geral de computação quando aumentamos a reutilização do DevAddr e aumentamos o tamanho do DevAddr.
Atualmente, NS alcança dispositivos por DevAddr e decodifica o proto. Os protos são grandes, contendo o estado do mac e as mensagens recentes de uplink e downlink, além de poder haver muitos protos (centenas) de DevAddr duplicados.
Precisamos de uma visão materializada no Redis para combinar uplinks com dispositivos por UID, antes de carregar o dispositivo correspondido.
Armazene informações relevantes para correspondência em chaves dedicadas, basicamente DevAddr, FCnt, NwkSIntKeys e UID.
Um conjunto classificado e / ou mapa de hash seria útil, pois permite a classificação e a partir da consulta do Redis por FCnt, obtendo as chaves de integridade e UID.
Atualize esta visão materializada em cada uplink e adesão-aceitação.
Podemos ter uma migração contínua com fallback para o esquema de correspondência existente.
Testes de unidade, potencialmente com a afirmação das chaves Redis e seus valores no teste.
Pode revisar
Eu acho que uma abordagem melhor seria lidar com isso de outra maneira, o que também aumenta o desempenho no caso geral - separar os dados que consomem espaço dos protos e armazená-los separadamente - ou seja, recent_uplinks
, recent_downlinks
etc., também faz mais sentido armazená-los em listas em vez de protos empacotados - isso significa que não precisaríamos realmente consultar as mensagens existentes, mas apenas anexar uma nova, que é muito mais eficiente, mas vamos começar apenas com o proto e partir daí.
Visto que temos máscaras de campo, a divisão do proto seria bastante simples e totalmente gerenciada pelas implementações de registro do Redis.
Portanto, a sugestão é ter:
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
- resto do protoA migração aconteceria automaticamente, da mesma forma como os campos obsoletos já são tratados nos registros.
Qual é o status aqui?
Espero que esteja pronto para fusão no final da próxima semana.
A implementação é feita por semanas, trabalhando na refatoração e, em seguida, adaptando os testes desde então
Considere deixar o erro retornado mais claro se o dispositivo não for compatível. Veja, por exemplo, https://github.com/TheThingsNetwork/lorawan-stack/issues/2394.
Não podemos fornecer muitas informações, mas device_not_found
implica que o dispositivo não pode ser encontrado, embora possa ser que o DevAddr não tenha sido encontrado, que o MIC não corresponda às entradas encontradas e / ou que o FCnt seja redefinido enquanto isso não for permitido com as entradas encontradas.
Boa sugestão, mas acho que é melhor fazer isso como uma próxima etapa, porque será um grande PR para revisar com muitas funcionalidades relativamente complexas