Отслеживайте наличие процесса - PullRequest
0 голосов
/ 08 мая 2020

У меня есть конечная точка api, которая при вызове инициирует создание отчета. Это трудоемкий процесс, и ответ может прийти довольно поздно. Итак, мы придумали архитектуру кеширования, и после завершения ответ сохраняется в redis.

Однако на стороне интерфейса мы решили время от времени делать запросы, чтобы получить ответ. Чтобы столкнуться с проблемой перекрывающихся запросов, когда один отчет инициализируется несколько раз подряд, я решил создать временный файл, который существует только тогда, когда отчет создается, и ответ api: «Этот отчет уже создается». После завершения генерации файл удаляется, а ответ уже кэшируется.

Это макет того, что я делаю

def post(self):
   serialized_data = self.serializer().deserialize({
            'task': json.loads(request.values.get('task')),
            'media_company': json.loads(request.values.get('mediaCompany'))
    })

   if not os.path.exists('/root/progress_data'):
        os.mkdir('/root/progress_data')

    self.build_range(serialized_data)

    serialized_data['media_company']['date_from'] = \
                                        self.date_from.strftime("%Y-%m-%d")
    serialized_data['media_company']['date_to'] = \
                                        self.date_to.strftime("%Y-%m-%d")
    progress_hash = hashlib.sha256(str(serialized_data).encode()).hexdigest()

    if self.progress_check(progress_hash):
        return json_response({
            "success": False,
            'result': "This report is already being generated",
        })

    file = open(f'/root/progress_data/{progress_hash}', 'w+')
    file.close()
    try:
        report = self.generate_report(serialized_data)
    except:
        os.remove(f'/root/progress_data/{progress_hash}')
        return json_response({
            "success": False,
            'result': "Error while generating report",
        })
    os.remove(f'/root/progress_data/{progress_hash}')
    return json_response({
        "success": True,
        'data': report,
    })

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

Кроме того, я думаю, что есть некоторые дыры, из-за которых файл не удаляется во всех случаях.

Не могли бы вы показать мне потенциальные дыры, другой способ проверки прогресса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...