Постоянное хранение точек данных перед записью в базу данных

У меня есть приложение Django, которое получает данные с датчиков. Затем эти данные обрабатываются и записываются в influxDB с помощью библиотеки influxdb-client-python. Я хотел бы записывать данные асинхронно и таким образом возвращать ответ производителю данных до того, как они будут записаны в базу данных.

Однако, как только я отправлю ответ, я больше не могу позволить себе потерять эти данные. Поскольку я никогда не могу быть уверен, что сервер действительно сможет записать данные в influxDB, я подумал о том, чтобы сначала записать их в файл и вернуть ответ после успешной записи (подобно WAL). Это создает новые проблемы, такие как уверенность в том, что WAL действительно записывается в файл, и, самое главное, уверенность в том, что это безопасно для потоков, поскольку сервер может обрабатывать несколько запросов одновременно.

Есть ли лучший способ сделать это, возможно, встроенный в Django?

Это похоже на очередь, фоновые задачи и т.д. Вы правы, это только смещает проблему, но очереди также очень надежны

Стандартные библиотеки для этого с Django и/или Rest Framework следующие:

  • Celery - Полнофункциональный, зрелый, подключаемый бэкенд очередей
  • .
  • Django RQ - Проще, использует только redis
  • .

Celery, вероятно, является правильной отправной точкой здесь, поскольку он позволяет вам использовать "настоящий" бэкенд очереди, но Django RQ+redis также подойдет, если нет большой нагрузки.

Не зная ничего больше о вашем приложении или архитектуре, трудно сказать больше. Существует множество систем очередей (Rabbit, ZeroMQ, AWS SQS, Google и т.д.). Вы также можете рассмотреть возможность создания очереди+процессора, используя, например, AWS SQS и AWS Lambda Functions (или версии от Google).

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