Оптимизация сопоставления устройств на сетевом сервере
Для Redis I / O использование памяти и общая производительность вычислений при увеличении повторного использования DevAddr и увеличении размера DevAddr.
В настоящее время NS пробегает устройства по DevAddr и декодирует proto. Прототипы большие, содержат состояние Mac и недавние сообщения восходящего и нисходящего каналов, плюс может быть много протоколов (сотни) дублированных DevAddr.
Нам нужно материализованное представление в Redis для сопоставления восходящих каналов с устройствами по UID перед загрузкой сопоставленного устройства.
Храните соответствующую информацию для сопоставления в выделенных ключах, в основном DevAddr, FCnt, NwkSIntKeys и UID.
Сортированный набор и / или хеш-карта были бы полезны, поскольку это позволяет Redis сортировать и запрашивать отправку с помощью FCnt, получая ключи целостности и UID.
Обновите это материализованное представление для каждого восходящего канала и подтверждения присоединения.
У нас может быть скользящая миграция с откатом к существующей схеме сопоставления.
Модульные тесты, потенциально с утверждением ключей 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 сбрасывается, пока это не разрешено с найденными записями.
Хорошее предложение, но я думаю, что лучше сделать это в качестве следующего шага, потому что это будет огромный пиар для обзора с большим количеством относительно сложных функций.