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

เอกสารนี้อธิบายวิธีกำหนดค่าการตั้งค่าระยะหมดเวลาและกำหนดเวลาสำหรับคำขอ Route Optimization API การไม่ตั้งค่าเหล่านี้หรือตั้งค่าไม่ถูกต้องอาจทำให้เกิดปัญหาด้านคุณภาพการเชื่อมต่อหรือการตอบกลับ

คุณกำหนดระยะหมดเวลาในเนื้อหาคำขอและกำหนดเวลาในส่วนหัวของคำขอ Route Optimization API จะประมวลผลคำขอภายในระยะเวลาที่กำหนดโดยพารามิเตอร์เหล่านี้ โดยคำนึงถึงค่าเวลาที่สั้นที่สุด

การกำหนดค่าระยะหมดเวลาและกำหนดเวลาช่วยให้คุณจัดการเวลาในการประมวลผลได้ด้วยวิธีต่อไปนี้

  • เพิ่มระยะเวลาประมวลผล:
    • แก้ปัญหาคำขอที่มีความซับซ้อนสูง
    • รับคำตอบที่มีคุณภาพสูงขึ้น
  • ลดระยะเวลาในการประมวลผล:
    • แก้ปัญหาคำขอที่มีความซับซ้อนต่ำได้เร็วกว่าค่าเริ่มต้น
    • แก้ปัญหาคำขอโดยใช้เวลาน้อยลง แต่ได้คำตอบที่มีคุณภาพต่ำลง

ทำความเข้าใจความต้องการด้านระยะหมดเวลาและกำหนดเวลา

โปรดอ่านส่วนนี้ก่อนกำหนดค่าระยะหมดเวลาและกำหนดเวลา เพื่อยืนยันว่าคุณเข้าใจว่าตัวเลือกปลายทางและโปรโตคอลส่งผลต่อการตั้งค่าเหล่านี้อย่างไร

หลักเกณฑ์ต่อไปนี้จะช่วยคุณยืนยันได้ว่าคุณใช้การตั้งค่าที่เหมาะสมกับวัตถุประสงค์หรือไม่

  • ใช้ปลายทางที่ไม่บล็อกสำหรับคำขอที่ต่อเนื่องและซ้ำๆ และสำหรับคำขอที่ซับซ้อนซึ่งจะได้ประโยชน์จากเวลาในการแก้ปัญหาที่นานขึ้น
  • ใช้ปลายทางการบล็อกสำหรับคำขอขนาดเล็กและการแสดงผลลัพธ์ที่รวดเร็ว โดยยอมรับข้อดีข้อเสียด้านคุณภาพ
  • ใช้ 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 วินาที 360s 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 เป็น 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 เพื่อเพิ่มค่าของพารามิเตอร์ระยะหมดเวลาและกำหนดเวลาเป็นสูงสุด 3,600 วินาที

ค่าที่อนุญาตสำหรับ allowLargeDeadline DespiteInterruptionRisk มีดังนี้

  • true: เพิ่มค่าสูงสุดสำหรับพารามิเตอร์ระยะหมดเวลาและกำหนดเวลาเป็น 3,600 วินาที พร้อมรับทราบความเสี่ยงในการหยุดชะงัก
  • false (ค่าเริ่มต้น): เก็บค่าสูงสุดสำหรับพารามิเตอร์ระยะหมดเวลาและกำหนดเวลาไว้ที่ 1,800 วินาที

หากคุณเชื่อว่าจำเป็นต้องใช้ระยะหมดเวลานานกว่า 3, 600 วินาที โปรดติดต่อตัวแทนของ Google

searchMode

พารามิเตอร์ searchMode จะควบคุมวิธีที่เครื่องมือเพิ่มประสิทธิภาพค้นหาโซลูชัน ซึ่งช่วยให้คุณจัดลำดับความสำคัญของการตอบสนองที่รวดเร็วขึ้น (เวลาในการตอบสนองต่ำลง) หรือโซลูชันที่มีคุณภาพสูงขึ้นได้

เมื่อคุณให้ความสำคัญกับคุณภาพของโซลูชันที่สูงขึ้น เครื่องมือเพิ่มประสิทธิภาพจะใช้เวลาพอสมควรในการค้นหาโซลูชันคุณภาพสูง สำหรับคำขอที่ใช้เวลานานกว่านี้ ให้พิจารณาตั้งค่าระยะหมดเวลาที่นานขึ้นและใช้ปลายทางที่ไม่บล็อกเพื่อหลีกเลี่ยงปัญหาการเชื่อมต่อ

ค่าที่อนุญาตสำหรับ searchMode มีดังนี้

  • SEARCH_MODE_UNSPECIFIED (ค่าเริ่มต้น): โหมดการค้นหาที่ไม่ได้ระบุ ซึ่งเทียบเท่ากับ RETURN_FAST
  • RETURN_FAST: หยุดการค้นหาหลังจากพบโซลูชันที่ดีรายการแรก
  • CONSUME_ALL_AVAILABLE_TIME: ใช้เวลาทั้งหมดที่มีในการค้นหาโซลูชันที่ดีกว่า API จะไม่ใช้เวลาทั้งหมดที่มีหากพบโซลูชันที่เหมาะสมที่สุดตั้งแต่เนิ่นๆ

เปิดใช้คีพอะไลฟ์ปิง

เมื่อคุณส่งคำขอไปยังปลายทางที่บล็อกซึ่งมีระยะหมดเวลานานกว่า 60 วินาที คำสั่ง ping แบบ Keepalive จะช่วยป้องกันไม่ให้การเชื่อมต่อขาดหายไปขณะรอการตอบกลับ Keepalive Ping คือแพ็กเก็ตขนาดเล็กที่ส่งเพื่อรักษาการเชื่อมต่อให้ทำงานอยู่ รวมถึงตรวจจับและป้องกันการสูญเสียการเชื่อมต่อ

กำหนดค่าพารามิเตอร์เหล่านี้ตามโปรโตคอล API ที่คุณใช้

  • REST: กำหนดค่า Keepalive ในระดับการเชื่อมต่อ TCP
  • gRPC: กำหนดค่าคีปอะไลฟ์ปิงในซ็อกเก็ต TCP ที่สำคัญหรือในโปรโตคอล gRPC โดยตรง

ส่วนต่อไปนี้จะอธิบายวิธีตั้งค่าคีปอะไลฟ์ปิงสำหรับทั้ง 2 โปรโตคอล

Keepalive ของ REST

การกำหนดค่าคีปอะไลฟ์ปิงเมื่อใช้ REST จะขึ้นอยู่กับไลบรารีไคลเอ็นต์ HTTP ไลบรารีของไคลเอ็นต์และเครื่องมือต่างๆ เช่น curl อาจมีตัวเลือกการกำหนดค่าที่เฉพาะเจาะจงหรือเปิดใช้คําสั่ง ping โดยอัตโนมัติ

หากไลบรารีแสดงซ็อกเก็ต TCP ที่สำคัญ คุณสามารถกำหนดค่าคีปอะไลฟ์ปิงได้โดยตรงในซ็อกเก็ต TCP โดยใช้ตัวเลือกต่างๆ เช่น SO_KEEPALIVE โดยใช้ฟังก์ชันอย่าง setsockopt() หรือฟังก์ชันที่เทียบเท่า

ฟังก์ชันที่โฮสต์ใน GitHub นี้แสดงวิธีตั้งค่านี้อย่างถูกต้องสำหรับไคลเอ็นต์ HTTP ในตัวของ Python

ดูรายละเอียดเพิ่มเติมเกี่ยวกับ Keepalive ระดับ TCP ในภาพรวม Keepalive ของ TLDP หรือในเอกสารประกอบไลบรารีของไคลเอ็นต์ HTTP

gRPC keepalive

gRPC มีกลไก Keepalive ในตัวเป็นส่วนหนึ่งของโปรโตคอล ดูวิธีการตั้งค่านี้ในภาษาของไคลเอ็นต์ได้ที่คู่มือ Keepalive ของ gRPC

คำขอตัวอย่าง gRPC ที่มี Keepalive

ตัวอย่างต่อไปนี้แสดงวิธีส่งคำขอ optimizeTours โดยใช้ไลบรารีของไคลเอ็นต์ Python และคีปอะไลฟ์ปิงระดับ 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)