เอกสารนี้อธิบายวิธีกำหนดค่าการตั้งค่าการหมดเวลาและกำหนดเวลาสำหรับคำขอ Route Optimization API การไม่ตั้งค่าเหล่านี้หรือการตั้งค่าอย่างไม่ถูกต้อง อาจทำให้เกิดปัญหาด้านคุณภาพการเชื่อมต่อหรือการตอบสนอง
คุณกำหนดการหมดเวลาในเนื้อหาคำขอและกำหนดเวลาในส่วนหัวของคำขอ API การเพิ่มประสิทธิภาพเส้นทางจะประมวลผลคำขอภายในขีดจำกัดเวลาที่กำหนด โดยพารามิเตอร์เหล่านี้ โดยจะพิจารณาค่าเวลาที่สั้นที่สุด
การกำหนดค่าการหมดเวลาและกำหนดเวลาช่วยให้คุณจัดการเวลาในการประมวลผลได้ด้วยวิธีต่อไปนี้
- เพิ่มเวลาในการประมวลผล:
- ตอบคำขอที่มีความซับซ้อนสูง
- รับคำตอบที่มีคุณภาพสูงขึ้น
- ลดเวลาในการประมวลผล:
- ตอบคำขอที่มีความซับซ้อนต่ำได้เร็วกว่าค่าเริ่มต้น
- แก้ปัญหาคำขอได้ในเวลาที่สั้นลง แต่จะได้รับคำตอบที่มีคุณภาพต่ำกว่า
หมายเหตุ: พารามิเตอร์การหมดเวลาและกำหนดเวลาจะมีผลก็ต่อเมื่อตั้งค่า solvingMode เป็นค่าเริ่มต้น DEFAULT_SOLVE โดยปกติแล้ว solvingMode อื่นๆ เช่น VALIDATE_ONLY, DETECT_SOME_INFEASIBLE_SHIPMENTS หรือ TRANSFORM_AND_RETURN_REQUEST ไม่จำเป็นต้องปรับการหมดเวลาเนื่องจากเร็วกว่ามาก
ทำความเข้าใจความต้องการเกี่ยวกับระยะหมดเวลาและกำหนดเวลา
โปรดอ่านส่วนนี้ก่อนกำหนดค่าการหมดเวลาและกำหนดเวลาเพื่อยืนยันว่าคุณเข้าใจวิธีที่ตัวเลือกปลายทางและโปรโตคอลส่งผลต่อการตั้งค่าเหล่านี้
หลักเกณฑ์ต่อไปนี้จะช่วยให้คุณยืนยันได้ว่าคุณใช้การตั้งค่าที่เหมาะสมกับวัตถุประสงค์ของคุณหรือไม่
- ใช้ปลายทางที่ไม่บล็อกสำหรับคำขอต่อเนื่องและคำขอซ้ำ รวมถึงสำหรับ คำขอที่ซับซ้อนซึ่งได้รับประโยชน์จากเวลาในการแก้ปัญหาที่นานขึ้น
- ใช้ปลายทางการบล็อกสำหรับคำขอขนาดเล็กและการแสดงผลอย่างรวดเร็ว โดยยอมรับการแลกเปลี่ยนคุณภาพ
- ใช้ gRPC: สำหรับเวิร์กโฟลว์ในแต่ละวัน โดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันเวอร์ชันที่ใช้งานจริง
- ใช้ REST สำหรับการทดสอบ การทดลอง หรือคำขอแบบครั้งเดียว
คลิกปุ่มด้านล่างเพื่อดูแผนภาพที่จะช่วยคุณระบุส่วนของเอกสารนี้ที่เกี่ยวข้องกับการตั้งค่าของคุณมากที่สุด
ตั้งค่าพารามิเตอร์ timeout
ตั้งค่าพารามิเตอร์ timeout ในเนื้อหาคำขอเพื่อระบุ
เวลาสูงสุดที่เซิร์ฟเวอร์จะดำเนินการกับคำขอก่อนที่จะส่งคืนการตอบกลับ
เวลาที่ใช้จริงอาจสั้นกว่าเวลาที่จัดสรรไว้ หาก API พบ
โซลูชันที่เหมาะสมก่อนถึงเวลาที่จัดสรรไว้สูงสุด
ตั้งค่าพารามิเตอร์ timeout โดยใช้โปรโตคอลระยะเวลา
บัฟเฟอร์
ซึ่งเป็นระยะเวลาในหน่วยวินาทีที่อาจมีตั้งแต่ 1 วินาทีถึง 1,800 วินาที
เพิ่มค่านี้ได้สูงสุด 3600 วินาทีโดยใช้
allowLargeDeadlineDespiteInterruptionRisk
ค่า 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 | 900 |
| 10,001 ขึ้นไป | 60 วินาที + 120 วินาทีต่อการจัดส่ง 10,000 รายการ | การเกิดอุบัติเหตุต่อการจัดส่ง 10,000 ครั้ง | 900 วินาทีต่อการจัดส่ง 10,000 รายการ |
กำหนดเวลา
กำหนดกำหนดเวลาในส่วนหัวของคำขอเพื่อกำหนดเวลาสูงสุดที่ Route Optimization API ใช้ในการประมวลผลคำขอ ส่วนย่อยต่อไปนี้จะอธิบาย วิธีตั้งค่ากำหนดเวลาสำหรับคำขอ REST และ gRPC
คำขอ REST
เมื่อใช้ REST เพื่อเรียกปลายทางการบล็อก คุณสามารถขยายกำหนดเวลาให้เกิน
ค่าเริ่มต้น 60 วินาที ซึ่งมักจะสั้นเกินไปสำหรับคำขอที่ซับซ้อน คุณต้องดำเนินการนี้แม้ว่าจะได้ระบุกำหนดเวลาที่นานกว่าในเนื้อหาคำขอแล้วก็ตาม เนื่องจากกำหนดเวลาเริ่มต้นจะลบล้างค่า timeout ใดๆ ที่ตั้งไว้ในเนื้อหาคำขอซึ่งนานกว่า 60 วินาที
ขยายกำหนดเวลาเกิน 60 วินาทีเริ่มต้นโดยการตั้งค่าส่วนหัวของคำขอ X-Server-Timeout ค่าของส่วนหัวจะเป็นจำนวนวินาที แต่ไม่มีคำต่อท้าย "s" ซึ่งแตกต่างจากในเนื้อหาคำขอ ค่าสูงสุด
ที่คุณตั้งค่าสำหรับส่วนหัวนี้ได้สอดคล้องกับข้อจำกัดของพารามิเตอร์ timeout
ตัวอย่างโค้ดต่อไปนี้แสดงส่วนหัว HTTP ที่ตั้งค่า X-Server-Timeout เป็น 1,800 วินาที
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 กำหนดเวลาเริ่มต้นเมื่อใช้คือ 3, 600 วินาที ซึ่งเป็นเวลาคำขอสูงสุดสำหรับ API นี้ กำหนดค่าเวลาในการแก้ปัญหาโดยตั้งค่าพร็อพเพอร์ตี้การหมดเวลาใน เนื้อหาคำขอเท่านั้น
พารามิเตอร์ที่ส่งผลต่อการหมดเวลาและกำหนดเวลา
พารามิเตอร์ต่อไปนี้ส่งผลต่อการทำงานของทั้งการหมดเวลาและกำหนดเวลา
- ควบคุมกำหนดเวลาคำขอสูงสุดด้วย
allowLargeDeadlineDespiteInterruptionRisk - กำหนดลักษณะการทำงานของการค้นหา โดยปรับสมดุลคุณภาพของโซลูชันกับ
เวลาในการตอบสนองด้วย
searchMode
allowLargeDeadlineDespiteInterruptionRisk
พารามิเตอร์ allowLargeDeadlineDespiteInterruptionRisk จะเพิ่ม
กำหนดเวลาคำขอสูงสุดเป็น 3,600 วินาที หากไม่ได้ตั้งค่าพารามิเตอร์นี้ ค่าสูงสุดสำหรับทั้งพารามิเตอร์การหมดเวลาและพารามิเตอร์กำหนดเวลาคือ 1, 800 วินาที
ตั้งค่า allowLargeDeadline DespiteInterruptionRisk เป็น true เพื่อ
เพิ่มค่าของพารามิเตอร์การหมดเวลาและพารามิเตอร์กำหนดเวลาเป็นสูงสุด 3600 วินาที
ค่าที่อนุญาตสำหรับ allowLargeDeadline DespiteInterruptionRisk มีดังนี้
true: เพิ่มค่าสูงสุดสำหรับพารามิเตอร์การหมดเวลาและกำหนดเวลาเป็น 3600 วินาทีพร้อมรับทราบความเสี่ยงที่จะเกิดการหยุดชะงักfalse(ค่าเริ่มต้น): คงค่าสูงสุดสำหรับพารามิเตอร์การหมดเวลาและกำหนดเวลาไว้ที่ 1,800 วินาที
หากคุณเชื่อว่าจำเป็นต้องมีระยะหมดเวลาที่นานกว่า 3, 600 วินาที โปรดติดต่อตัวแทนของ Google
searchMode
พารามิเตอร์ searchMode จะควบคุมวิธีที่เครื่องมือเพิ่มประสิทธิภาพค้นหา
โซลูชัน ซึ่งช่วยให้คุณจัดลำดับความสำคัญได้ว่าจะให้ความสำคัญกับการตอบสนองที่รวดเร็ว (เวลาในการตอบสนองต่ำ) หรือ
โซลูชันที่มีคุณภาพสูงกว่า
เมื่อคุณให้ความสำคัญกับคุณภาพของโซลูชันที่สูงขึ้น เครื่องมือเพิ่มประสิทธิภาพจะใช้เวลาพอสมควร ในการค้นหาโซลูชันคุณภาพสูง สำหรับคำขอที่ยาวนานกว่านี้ ให้พิจารณา ตั้งค่าการหมดเวลาให้นานขึ้นและใช้ปลายทางที่ไม่บล็อกเพื่อหลีกเลี่ยงปัญหา การเชื่อมต่อ
ค่าที่อนุญาตสำหรับ searchMode มีดังนี้
SEARCH_MODE_UNSPECIFIED(ค่าเริ่มต้น): โหมดการค้นหาที่ไม่ได้ระบุ เทียบเท่ากับRETURN_FASTRETURN_FAST: หยุดการค้นหาหลังจากพบโซลูชันแรกที่ใช้ได้CONSUME_ALL_AVAILABLE_TIME: ใช้เวลาทั้งหมดที่มีในการค้นหาวิธีแก้ปัญหาที่ดีกว่า API จะไม่ใช้เวลาทั้งหมดที่มีหากพบโซลูชันที่เหมาะสม ตั้งแต่เนิ่นๆ
เปิดใช้ Ping Keepalive
เมื่อส่งคำขอไปยังปลายทางการบล็อกที่มีการหมดเวลาที่นานกว่า 60 วินาที การปิง Keep-Alive จะช่วยป้องกันการสูญเสียการเชื่อมต่อขณะที่คุณรอการตอบกลับ Ping Keepalive คือแพ็กเก็ตขนาดเล็กที่ส่งเพื่อรักษา กิจกรรมการเชื่อมต่อ รวมถึงตรวจหาและป้องกันการเชื่อมต่อขาดหาย
กำหนดค่าพารามิเตอร์เหล่านี้ตามโปรโตคอล API ที่คุณใช้
- REST: กำหนดค่า Keepalive ในระดับการเชื่อมต่อ TCP
- gRPC: กำหนดค่า Ping Keepalive ในซ็อกเก็ต TCP พื้นฐานหรือในโปรโตคอล gRPC โดยตรง
ส่วนต่อไปนี้จะอธิบายวิธีตั้งค่า Ping Keepalive สำหรับทั้ง 2 โปรโตคอล
Keepalive ของ REST
การกำหนดค่า Ping Keepalive เมื่อใช้ REST จะขึ้นอยู่กับไลบรารีไคลเอ็นต์ HTTP
ไลบรารีและเครื่องมือของไคลเอ็นต์ เช่น curl อาจมีตัวเลือกการกำหนดค่าที่เฉพาะเจาะจง
หรือเปิดใช้การ Ping โดยอัตโนมัติ
หากไลบรารีแสดงซ็อกเก็ต TCP พื้นฐาน คุณสามารถกำหนดค่า Keepalive
ping ในซ็อกเก็ต TCP ได้โดยตรงโดยใช้ตัวเลือกต่างๆ เช่น SO_KEEPALIVE โดยทำได้โดยใช้ฟังก์ชันต่างๆ เช่น setsockopt() หรือฟังก์ชันที่เทียบเท่า
ฟังก์ชันที่โฮสต์ใน GitHub นี้แสดงวิธีตั้งค่านี้อย่างถูกต้อง สำหรับไคลเอ็นต์ HTTP ในตัวของ Python
ดูรายละเอียดเพิ่มเติมเกี่ยวกับ Keepalive ระดับ TCP ได้ในภาพรวมของ Keepalive ของ TLDP หรือในเอกสารประกอบของไลบรารีไคลเอ็นต์ HTTP
Keepalive ของ gRPC
gRPC มีกลไกการทำงานแบบ Keepalive ในตัวของตัวเองซึ่งเป็นส่วนหนึ่งของโปรโตคอล ดูคู่มือ Keepalive ของ gRPC เพื่อดูวิธีการตั้งค่านี้ในภาษาของไคลเอ็นต์
หมายเหตุ: เซิร์ฟเวอร์ gRPC อาจปฏิเสธไคลเอ็นต์ที่ส่ง Ping มากเกินไป หลีกเลี่ยง การตั้งค่าความถี่ของ Ping Keepalive สูงเกินไป
ตัวอย่างคำขอ gRPC ที่มี Keepalive
ตัวอย่างต่อไปนี้แสดงวิธีส่งคำขอ optimizeTours โดยใช้
ไลบรารีของไคลเอ็นต์ Python และการ Ping Keepalive ระดับ gRPC
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)