กำหนดค่าการหมดเวลาและกำหนดเวลา

เอกสารนี้อธิบายวิธีตั้งค่าการหมดเวลาและเวลาครบกำหนดสำหรับคำขอ 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 วินาที เพิ่มค่านี้ได้สูงสุด 3600 วินาทีโดยใช้ allowLargeDeadlineDespiteInterruptionRisk

ตารางต่อไปนี้แสดงค่า 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 รายการ 360 วินาทีต่อการจัดส่ง 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 เวลาครบกำหนดเริ่มต้นเมื่อใช้ไลบรารีของไคลเอ็นต์หรือ 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 จะไม่ใช้เวลาทั้งหมดที่มีหากพบโซลูชันที่เหมาะสมก่อน

เปิดใช้การ 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 พื้นฐาน คุณสามารถกำหนดค่าการ Ping Keepalive ในซ็อกเก็ต 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)