เอกสารนี้อธิบายวิธีกำหนดค่าการตั้งค่าการหมดเวลาและกำหนดเวลาสำหรับคำขอ 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
เป็น 1800 วินาที
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_FAST
RETURN_FAST
: หยุดการค้นหาหลังจากพบโซลูชันแรกที่ใช้ได้CONSUME_ALL_AVAILABLE_TIME
: ใช้เวลาทั้งหมดที่มีในการค้นหาวิธีแก้ปัญหาที่ดีกว่า API จะไม่ใช้เวลาทั้งหมดที่มีหากพบโซลูชันที่เหมาะสม ตั้งแต่เนิ่นๆ
เปิดใช้ Ping Keepalive
เมื่อส่งคำขอไปยังปลายทางการบล็อกที่มีการหมดเวลาที่นานกว่า 60 วินาที การ Ping Keepalive จะช่วยป้องกันการขาดการเชื่อมต่อขณะที่คุณรอการตอบกลับ 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)