Я знаю, что экспоненциальное отключение - это хорошо, когда вызовы RPC терпят неудачу. До сих пор в моем GAE/P приложении Я выполнил экспоненциальную выдержку с помощью очереди задач:GAE/P: реализация экспоненциального отклика для вызовов RPC
deferred.defer(function_that_makes_RPC_call)
Если функция, которая делает вызов RPC вызывает исключение, то экспоненциальные потери мощность из очереди задач заботятся о ней , и мне не о чем беспокоиться.
Проблема, однако, заключается в том, что deferred.defer сам по себе является вызовом RPC, который может выйти из строя! Иногда я получаю эту ошибку:
DeadlineExceededError: The API call taskqueue.BulkAdd() took too long to respond and was cancelled.
Так я, кажется, уже не могу быть ленивым и должен реализовать свою собственную экспоненциальную отсрочку. :(
Подумываю поставить обертки вокруг deferred.defer
, который реализует экспоненциальную выдержку, используя backoff, как это:
@backoff.on_exception(backoff.expo,
(exception1, exception2, ...),
max_tries=8)
def defer_wrapper(function_that_makes_RPC_call):
deferred.defer(function_that_makes_RPC_call)
Здесь декоратор реализует отсрочку, где повтор происходит, когда один из перечисленных исключений (например, exception1, exception2, ...) поднимается
пару вопросов по этому поводу:.
- это хороший Soluti для реализации экспоненциального отсрочки?
- Какие исключения мне нужно перечислить? Все, кроме DeadlineExceededError?
Я знаю, что это несколько излишним иметь свою собственную экспоненциальную выдержку, а затем представить в очередь задач, но я имею в виде, что deferred.defer
должны терпеть неудачу реже, чем другие RPC вызовов, и я хотел бы ответить на запросите как можно скорее.
Я думаю, что этот DeadlineExceededError специфичен для вызовов API и составляет 5 секунд, в отличие от запроса DeadlineExceededError, равного 60 секундам. См. Https://cloud.google.com/appengine/articles/deadlineexceedederrors –
Ах, * что * DeadlineExceededError? Да, ты прав. –