本文說明如何設定 Route Optimization API 要求的逾時和期限設定。如果未設定或設定錯誤,可能會導致連線或回覆品質問題。
您可以在要求主體中定義逾時,並在要求標頭中定義期限。Route Optimization API 會在這些參數定義的時間限制內處理要求,並以最短時間值為準。
設定逾時和期限後,您就能透過下列方式管理處理時間:
- 延長處理時間:
- 解決高複雜度的要求。
- 取得更高品質的回覆。
- 縮短處理時間:
- 解決簡單要求的速度比預設值快。
- 縮短解決要求所需的時間,但回覆品質較低。
注意:只有在 solvingMode 設為預設值 DEFAULT_SOLVE 時,逾時和截止時間參數才會生效。其他 solvingMode 選項 (例如 VALIDATE_ONLY、DETECT_SOME_INFEASIBLE_SHIPMENTS 或 TRANSFORM_AND_RETURN_REQUEST) 通常不需要調整逾時時間,因為這些選項的速度明顯較快。
瞭解逾時和期限需求
設定逾時和期限前,請先詳閱本節,確認您瞭解端點和通訊協定選擇對這些設定的影響。
請參考下列規範,確認您是否採用合適的設定來達成目標。
- 針對連續和重複的要求,以及需要較長解決時間的複雜要求,請使用非封鎖端點。
- 對於小型要求和快速傳送結果,請使用封鎖端點,並接受品質上的取捨。
- 使用 gRPC:適用於日常工作流程,特別是生產應用程式。
- 使用 REST 進行測試、實驗或一次性要求。
點選下方按鈕,查看有助於判斷本文件哪些章節最符合您設定需求的圖表。
設定 timeout 參數
在要求主體中設定 timeout 參數的值,指定伺服器處理要求並傳回回應的時間上限。如果 API 在達到最大分配時間前找到最佳解決方案,實際花費的時間可能會比分配時間短。
使用時間長度通訊協定緩衝區設定 timeout 參數,時間長度以秒為單位,範圍為 1 秒到 1800 秒。使用 allowLargeDeadlineDespiteInterruptionRisk 增加這個值,最多可達 3600 秒。
建議 timeout 值
下表列出建議的 timeout 值,這些值會根據要求複雜度以及貨運和車輛數量而有所不同。
| 出貨次數和車輛數 | 無限制 | 時間範圍和載重限制寬鬆,或路線較長 | 時間範圍有限、載重限制、複雜限制或路線很長 |
| 1 - 8 | 2 秒 | 2 秒 | 5 秒 |
| 9 - 32 | 5 秒 | 10 秒 | 20 秒 |
| 33 - 100 | 15 秒 | 30 秒 | 60 秒 |
| 101 到 1,000 款 | 45 秒 | 90 年代 | 180 秒 |
| 1,001 - 10,000 | 120 秒 | 360 度全景相片 | 900s |
| 10,001 人以上 | 每 1 萬次運送 60 秒 + 120 秒 | 每 1 萬件出貨商品 360 秒 | 每 1 萬次出貨 900 秒 |
設定期限
在要求標頭中設定期限,定義 Route Optimization API 處理要求所花費的時間上限。以下子節說明如何設定 REST 和 gRPC 要求的期限。
REST 要求
使用 REST 呼叫封鎖端點時,您可以將期限延長至預設的 60 秒以上,因為 60 秒通常不足以處理複雜的要求。即使您已在要求主體中指定較長的期限,也必須執行這項操作,因為預設期限會覆寫要求主體中設定的任何大於 60 秒的 timeout 值。
如要將期限延長至預設的 60 秒以上,請設定 X-Server-Timeout 要求標頭。與要求主體不同,標頭的值是秒數,但不含「s」後置字元。這個標頭可設定的最大值,與 timeout 參數的限制一致。
下列程式碼範例顯示 X-Server-Timeout 設為 1800 秒的 HTTP 標頭。
curl -X POST 'https://routeoptimization.googleapis.com/v1/projects/:optimizeTours' \
-H "Content-Type: application/json" \
-H "X-Server-Timeout: 1800" \
-H "Authorization: Bearer $(gcloud auth application-default print-access-token)" \
--data @- << EOM
{
"model": {
...
}
}
EOM
用戶端程式庫和 gRPC 要求
使用用戶端程式庫或 gRPC 時,不需要設定期限。使用這些方法時,預設期限為 3600 秒,也就是這個 API 的要求時間上限。如要設定解決時間,請只在要求主體中設定逾時屬性。
影響逾時和期限的參數
下列參數會影響逾時和期限的運作方式:
- 使用
allowLargeDeadlineDespiteInterruptionRisk控制要求截止時間上限。 - 定義搜尋行為,並使用
searchMode兼顧解決方案品質和延遲時間。
allowLargeDeadlineDespiteInterruptionRisk
allowLargeDeadlineDespiteInterruptionRisk 參數會將要求期限上限提高至 3600 秒。如未設定這項參數,逾時和期限參數的最大值均為 1800 秒。
將 allowLargeDeadline DespiteInterruptionRisk 設為 true,將逾時和期限參數的值提高至最多 3600 秒。
allowLargeDeadline DespiteInterruptionRisk 的允許值如下:
true:將逾時和期限參數的最大值提高至 3600 秒,同時確認中斷風險。false(預設):將逾時和截止時間參數的最大值設為 1800 秒。
如果您認為需要超過 3600 秒的逾時時間,請與 Google 代表聯絡。
searchMode
searchMode 參數可控制最佳化工具搜尋解決方案的方式,讓您優先選擇更快的反應速度 (較低延遲) 或更高品質的解決方案。
如果優先考量較高的解決方案品質,最佳化工具會花費相當長的時間尋找高品質的解決方案。如要提出較長的要求,請考慮設定較長的逾時時間,並使用非封鎖端點,以免發生連線問題。
searchMode 的允許值如下:
SEARCH_MODE_UNSPECIFIED(預設):未指定的搜尋模式,等同於RETURN_FAST。RETURN_FAST:找到第一個合適的解決方案後,停止搜尋。CONSUME_ALL_AVAILABLE_TIME:花費所有可用時間尋找更佳解決方案。如果 API 提早找到最佳解決方案,就不會用完所有可用時間。
啟用 Keepalive Ping
向封鎖端點發出要求時,如果逾時時間超過 60 秒,keepalive ping 可避免在等待回應時連線中斷。Keepalive ping 是為維持連線活動而傳送的小型封包,可偵測及防止連線中斷。
請根據您使用的 API 通訊協定設定這些參數:
- REST:在 TCP 連線層級設定存留時間。
- gRPC:在基礎 TCP 通訊端或直接在 gRPC 通訊協定中設定 keepalive ping。
以下各節說明如何為這兩種通訊協定設定保持運作 Ping。
REST 保持運作
使用 REST 時設定存留信號,取決於您的 HTTP 用戶端程式庫。用戶端程式庫和工具 (例如 curl) 可能會提供特定設定選項,或自動啟用 Ping。
如果程式庫公開基礎 TCP 通訊端,您可以使用 SO_KEEPALIVE 等選項,直接在 TCP 通訊端上設定保持運作連線偵測 (ping)。方法是使用 setsockopt() 等函式或其對等函式。
這個託管於 GitHub 的函式示範如何為 Python 內建 HTTP 用戶端正確設定這項功能。
如要進一步瞭解 TCP 層級的 keepalive,請參閱 TLDP keepalive 總覽或 HTTP 用戶端程式庫說明文件。
gRPC 保持運作
gRPC 提供內建的連線存續機制,屬於通訊協定的一部分。如要瞭解如何以用戶端語言設定這項功能,請參閱 gRPC 保持運作指南。
注意:gRPC 伺服器可能會拒絕傳送過多連線偵測 (ping) 的用戶端。避免將 Keepalive 連線偵測 (ping) 頻率設得太高。
含有 keepalive 的 gRPC 範例要求
以下範例說明如何使用 Python 用戶端程式庫和 gRPC 層級的 keepalive ping 傳送 optimizeTours 要求。
from google.maps import routeoptimization_v1 as ro
from google.maps.routeoptimization_v1.services.route_optimization.transports import grpc as grpc_transport
import sys
_REQUEST_TIMEOUT_SECONDS = 1800
_KEEPALIVE_PING_SECONDS = 30
def create_channel(*args, **kwargs):
raw_options = kwargs.pop("options", ())
options = dict(raw_options)
options["grpc.keepalive_time_ms"] = _KEEPALIVE_PING_SECONDS * 1000
options["grpc.keepalive_timeout_ms"] = 5000
# Allow any number of pings between the request and the response.
options["grpc.http2.max_pings_without_data"] = 0
print(f"Using options: {options}", file=sys.stderr)
return grpc_transport.RouteOptimizationGrpcTransport.create_channel(
*args,
options=list(options.items()),
**kwargs,
)
def create_grpc_transport(*args, **kwargs):
if "channel" in kwargs:
raise ValueError(
"`channel` is overridden by this function, and must not be provided."
)
return grpc_transport.RouteOptimizationGrpcTransport(
*args,
channel=create_channel,
**kwargs,
)
def run_optimize_tours(request):
client = ro.RouteOptimizationClient(transport=create_grpc_transport)
return client.optimize_tours(request, timeout=_REQUEST_TIMEOUT_SECONDS)