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 для вашей базы данных.

И я думаю, что использование кэша для данных реального времени - это напрасная трата ресурсов сервера.

Вернуться на верх