簡體   English   中英

從 Pub/Sub 訂閱中提取的 Google Cloud Function 會引發異常 - 已超過截止日期

[英]Google Cloud Function pulling from Pub/Sub subscription throws exception - Deadline Exceeded

我在 Python 3.7 中有一個 Google Cloud Function,它在同步拉取模式下從 Pub/Sub 訂閱中讀取。

在以 1/小時的速度運行 24 小時后,它拋出了這個異常堆棧跟蹤:

回溯(最近一次通話):文件
"/env/local/lib/python3.7/site-packages/google/api_core/grpc_helpers.py",
第 57 行,在 error_remapped_callable 中
返回 callable_(*args, **kwargs) 文件“/env/local/lib/python3.7/site-packages/grpc/_channel.py”,第 824 行,
通話中
返回 _end_unary_response_blocking(state, call, False, None) 文件“/env/local/lib/python3.7/site-packages/grpc/_channel.py”,行
726,在_end_unary_response_blocking
引發 _InactiveRpcError(state) grpc._channel._InactiveRpcError: <_InactiveRpcError 的 RPC 終止於:status =
StatusCode.DEADLINE_EXCEEDED details = "超過最后期限"
debug_error_string =
"{"created":"@1580454091.145703535","description":"錯誤來自
同行
ipv4:74.125.202.95:443","file":"src/core/lib/surface/call.cc","file_line":1056,"grpc_message":"截止日期
超過","grpc_status":4}"

上述異常是以下異常的直接原因:

回溯(最近一次通話):文件
"/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py",
第 346 行,在 run_http_function 中
結果 = _function_handler.invoke_user_function(flask.request) 文件
"/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py",
第 217 行,在 invoke_user_function 中
返回 call_user_function(request_or_event) 文件“/env/local/lib/python3.7/site-packages/google/cloud/functions/worker.py”,
第 210 行,在 call_user_function 中
在迭代中返回 self._user_function(request_or_event) 文件“/user_code/main.py”,第 39 行
response = sub.pull(sub_path, MAX_MESSAGES) 文件“/env/local/lib/python3.7/site-packages/google/cloud/pubsub_v1/_gapic.py”,
第 40 行,在
fx = lambda self, *a, **kw:wrapped_fx(self.api, *a, **kw) # noqa 文件
"/env/local/lib/python3.7/site-packages/google/cloud/pubsub_v1/gapic/subscriber_client.py",
第 1005 行,拉入
請求,重試=重試,超時=超時,元數據=元數據文件“/env/local/lib/python3.7/site-packages/google/api_core/gapic_v1/method.py”,
第 143 行,通話中
返回wrapped_func(*args, **kwargs) 文件“/env/local/lib/python3.7/site-packages/google/api_core/retry.py”,
第 286 行,在 retry_wrapped_func 中
on_error=on_error,文件“/env/local/lib/python3.7/site-packages/google/api_core/retry.py”,
第 184 行,在 retry_target 中
返回目標()文件“/env/local/lib/python3.7/site-packages/google/api_core/timeout.py”,
第 214 行,在 func_with_timeout 中
返回 func(*args, **kwargs) 文件“/env/local/lib/python3.7/site-packages/google/api_core/grpc_helpers.py”,
第 59 行,在 error_remapped_callable 中
6.raise_from(exceptions.from_grpc_error(exc), exc) 文件“”,第 3 行,在 raise_from
google.api_core.exceptions.DeadlineExceeded:超過 504 截止日期

這是關於什么的? 這是意料之中的還是某些配置問題的結果? 如果可以,應該如何處理?

pull 上的文檔(查看源代碼: https : //googleapis.dev/python/pubsub/latest/subscriber/api/client.html )沒有任何關於這可能是例外的信息。

拉動完成后,我立即確認消息。 我一次只允許執行一個函數。 我有 600 秒的確認截止日期。 一次拉取的消息塊數量似乎不到 100。 如果這是關於無法確認消息,則錯誤似乎可以做得更好。

當訂閱中沒有要讀取的消息時,客戶端會引發此異常。 這是最新的 PubSub 庫版本 >= 1.0.0 中的一個已知問題 如有必要,您可以降級到不存在此問題的 0.45.0 版本。

但是,作為一種解決方法,您可以捕獲 DeadlineExceeded 異常並重試該操作。 此外,根據Hemang評論,這里有一個小猴子補丁,您可以將其添加到正在運行的代碼中,這可能有助於獲得與 0.45.0 版相同的行為。

from google.cloud.pubsub_v1.gapic import subscriber_client_config as sub_config
sub_config.config['interfaces']['google.pubsub.v1.Subscriber']['retry_params']['messaging']['initial_rpc_timeout_millis'] = 25000

最后,請記住,在使用同步拉取時,擁有許多未完成的拉取請求有助於降低交付延遲,這反過來可能會導致拉取請求延遲更高(和 DeadlineExceeded 錯誤)。 雖然,如果延遲對應用程序至關重要,您可以考慮使用StreamingPull

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM