Django кэширование данных в реальном времени с фильтрацией и сортировкой DRF
Я создаю веб-приложение для управления парком движущихся транспортных средств. Каждый автомобиль имеет набор фиксированных данных (например, номерной знак) и другой набор данных, который обновляется 3 раза в секунду через websocket (состояние и GNSS-координаты). Это данные в реальном времени.
Во фронтенде мне нужно представление с сеткой, показывающей все автомобили. В сетке должны отображаться как фиксированные данные, так и последние известные значения данных реального времени для каждого из них. Пользователь должен иметь возможность сортировки или фильтрации по любой колонке.
Мой текущий стек: Django + Django Rest Framework + Django Channels + PostgreSQL для бэкенда, и react-admin (React+Redux+FinalForm) для фронтенда.
Проблема: Хранение данных в реальном времени в базе данных легко выполнило бы все мои требования, поскольку я получил бы выгоду от встроенного DRF и сортировки/фильтрации ORM от Django, но я считаю, что обращение к базе данных 3 раза/сек для каждого автомобиля может стать узким местом при увеличении масштаба.
Мое текущее решение предполагает наличие данных RT в объектах python, которые я сериализую/десериализую (pickle) в/из кэша Django (REDIS-backed) вместо того, чтобы хранить их как модели в базе данных. Однако мне приходится вручную извлекать данные и DRF-сериализовывать их в моих DRF представлениях. Поэтому сортировка и фильтрация не работают, так как нет SQL запросов.
Если бы в pgsql было что-то вроде таблиц с нулевым доступом к диску с поддержкой памяти, это было бы замечательно, но, согласно моим исследованиям, на сегодняшний день такой возможности нет.
Итак, мой вопрос таков: Каким будет правильный/обычный подход к моей проблеме?
Думаю, вам следует разделить код сервиса на более мелкие сервисы:
- Получение данных от транспортных средств
- Обрабатывать данные
- Разделите транспортные средства на более мелкие группы, используйте уникальный сокет для каждой группы
Попробуйте обновить последние значения как пакетные.
Используйте RAID для вашей базы данных.
И я думаю, что использование кэша для данных реального времени - это напрасная трата ресурсов сервера.