Closed Kraysent closed 5 months ago
Очень хочется в рамках этой же задачи в mermaid или https://draw.io или аналоге нарисовать и поддерживать диаграмму взаимодействия наших и внешних сервисов между собой (как то: API, worker-ы, Postgres, CDS, внешние большие каталоги и так далее), потому что система становистя относительно сложной и хочется иметь рисунок.
В качестве MVP хочется иметь следующее:
POST /api/v1/task
, в которую передаётся имя задачи и параметры и которая её стартует.GET /api/v1/task/status
для получения статуса задачи.После выполнения шагов выше можно сделать задачу которая получает доступ к БД и пишет в неё что-то.
Проблема: сейчас любая долгая операция (загрузка таблицы из CDS, далее будет кросс-идентификация) проводятся в том же потоке, что и обработка запроса пользователя. Это приводит к тому, что пользователь не может разорвать соединение и обязан дождаться, пока процесс закончится, чтобы получить ответ - это неправильно.
Потенциальное решение: поднять очередь Redis (https://python-rq.org/) и при запросе в API создать и положить в очередь задачу. Эта задача будет выполняться асинхронно в соседнем процессе при помощи worker-а. Она может писать в базу (перед создание worker-а можно установить соединение с базой при помощи https://python-rq.org/docs/workers/#custom-worker-classes. По мере выполнения задачи статус обновляется в базе, и если пользователь запрашивает статус задачи, API идёт в базу, выясняет его и отдаёт пользователю.
Видимо, нужно будет сделать таблицу задач и, скорее всего, таблицу pipeline-а обработки.
В рамках этой задачи хочется сделать таблицу задач, поднять Redis и сделать модуль для задач, откуда worker-ы смогут их подбирать.
Плюсы такого решения следующие:
Минусы: