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

เอกสารนี้อธิบายวิธีกำหนดค่าการตั้งค่าการหมดเวลาและกำหนดเวลาสำหรับคำขอ 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 ที่แนะนำตามความซับซ้อนของคำขอ และจำนวนการจัดส่งและยานพาหนะ

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