Синхронизация автономного приложения с большим количеством данных с сервером
Привет, товарищи из stackoverflowers,
У нас есть приложение electron, с JSON DB для сохранения состояния приложения в автономном режиме. Когда приложение синхронизируется (для отправки новых действий & получения новых данных), на сервере (Django) создается новый JSON, который заменяет тот, который ранее использовался из электронного приложения.
До сих пор все было хорошо, приложение использовалось много раз, пока одна из функций не начала взрывать размер JSON-ответа. Для дополнительного контекста, сериализация объекта ответа в JSON-объект на сервере может занимать до ~30 секунд, что будет расти еще больше, учитывая, что данные накапливаются.
На данный момент мы думаем, что лучше всего внедрить websockets, перенести генерацию JSON в фоновый режим и отправлять приложению сообщение о завершении работы.
Поскольку я не очень опытен в работе с автономными приложениями, мне интересно, является ли это законным решением? Мы на правильном пути или есть альтернативы? Нет ли стандартной схемы решения подобных проблем?
Мы также думали о diff sync, который будет включать только небольшую часть JSON DB каждый раз в ответ (например, updated_at
), но что тогда произойдет с удаленными элементами? Как вы узнаете, какие из них должны быть удалены?
Заранее спасибо за то, что нашли время прочитать и с нетерпением ждем ваших мыслей!
Насколько велик JSON-объект, который вы пытаетесь отправить с помощью Django? О каком типе данных идет речь?
Поскольку Python Dictonaries aka JSON требуют большого количества памяти при использовании, я бы старался избегать использования диктонариев в python, где это возможно. Особенно в производственной среде, где хранится большое количество данных. Существует множество способов оптимизации, о чем есть тонны различных статей в интернете.
Разбивайте свои ответы
Одним из вариантов может быть отправка не одного большого JSON-объекта, а нескольких меньших. Если уменьшить размер одного запроса до меньшего, можно получить большую пропускную способность. Серверу требуется меньше времени на вычисление части ответа. Пока отправляется первый ответ, следующий уже вычисляется.
Кэш похожего содержимого
Вместо того чтобы отправлять все содержимое, отправьте только новое. Как вы уже говорили, это можно сделать в БД.
Возможно использование SQL DB, если это возможно
Я знаю, что это звучит немного странно, но я бы использовал базу данных SQL, поскольку у вас уже есть одна БД. Учитывая тот факт, что Django поставляется вместе с очень удобным DB Engine (или как там называются модели), вы будете иметь более высокую скорость обработки, так как весь процесс преобразования данных и т.д. будет обрабатываться django.
Поскольку я не знаю, о каком приложении и данных вы говорите, я могу только предполагать некоторые вещи. (А я здесь новичок)
Надеюсь, это поможет :)