Как сделать так, чтобы мой API не мог обрабатывать один и тот же метод одновременно
У меня есть метод в моем API, который обрабатывает операции синхронизации с ERP компании. Этот метод вызывается раз в 30 минут скриптом, который я сделал для того, чтобы все всегда было актуально. Однако, если кто-то хочет, он может самостоятельно сделать запрос к конечной точке, но при этом ему нужно сообщить, обрабатывается ли операция в данный момент или нет
Итак, мое решение: я держу флаг в базе данных и устанавливаю его в значение true
, когда транзакция продолжается, и false
, когда она заканчивается, поэтому мое приложение будет проверять его и продолжать/останавливать, основываясь на этом условии
Есть только одна проблема: поскольку я храню все в одной транзакции, флаг фактически бесполезен, так как только внутри этой транзакции он будет установлен в значение true
. Я думал обновлять флаг перед началом транзакции и возвращать его при возникновении ошибки, но я не могу гарантировать, что процесс возврата будет происходить в 100% случаев (поэтому есть возможность заблокировать операцию)
Мой код следующий, если кому-то он нужен для справки:
@api_view(['POST'])
def syncErpItems(request):
try:
with transaction.atomic():
job = Jobs.objects.get(name='items')
if job.updating:
return Response({'message': 'Sync already ongoing'})
job.updating = True
job.save()
updateItems()
job.updating = False
job.last_execution = timezone.now()
job.save()
return Response({'message': 'Success'})
except Exception as e:
return Response({'message': 'Error on sync: ' + str(e)})
Кое-что следует иметь в виду:
- Нет возможности позволить блокировке произойти и вручную исправить ее позже, учитывая другие обстоятельства .
- Операция синхронизации занимает около 30/40 секунд, при этом из ERP поступает много контента