Я создаю API для веб-службы. В этом API есть пара конечных точек, которым требуется некоторое время (скажем, +5 минут) для вычисления, поэтому я создаю систему предварительной выборки, которая будет вызывать в фоновом режиме эти конечные точки каждый определенный период времени и кэшировать результаты, когда пользователи вызовите эти конечные точки, они получат кешированный ответ, не ожидая много времени. Функции, которые вызывают все эти конечные точки, будут делать три вещи:
У меня много проблем с этими конечными точками, потому что каждый раз, когда эта система предварительной выборки выходит из строя или возникает какая-либо проблема, они становятся доступными для всех пользователей, и если пользователь делает запрос, а кэшированный ответ отсутствует, то конечная точка запускает вычисления, которые занимают много времени.
Я не уверен, как мне с этим справиться, я мог бы добавить параметр prefetch
только для запроса и обработки данных, если он вызывается из системы предварительной выборки, в противном случае просто запросите БД для сохраненных обработанных данных, если нет данных в DB он вернет пустой ответ, но я думаю, что это намного лучше, чем то, что происходит сейчас.
Вот пример функции для данной конечной точки в Python:
@cache
def calculate_weather():
# Call some APIs and do some operations
# Store the processed data in DB
# return the processed data
Вот что я имею в виду:
@cache
def calculate_weather(prefetch):
if prefetch:
# Call some APIs and do some operations
# Store the processed data in DB
else:
# Get the processed data from DB
# return the processed data
Во втором примере функция, которую вызывает конечная точка API, будет иметь логический параметр prefetch
, который будет равен True
только при вызове функции из системы предварительной выборки.
Я думаю, что это решит эту проблему в краткосрочной перспективе, но, может быть, я могу сделать что-то еще, какие-либо предложения?
Хорошо
Я думаю, что у вас должно быть две разных конечных точки. Конечная точка для вашей системы предварительной выборки и другая конечная точка, которую будет вызывать пользователь. Очевидно, что они обрабатываются по-разному, поэтому они заслуживают своих собственных методов.
Возможно, есть лучший способ справиться с проблемой сверхдолгого времени отклика. Похоже, что в вашем примере клиенты в основном обращаются к кэшу... почему бы не вычислять исходные данные и не сохранять их в БД. Это зависит от данных, но, возможно, вы можете предварительно вычислять их асинхронно, когда, например, создается их учетная запись.