Antipattern: ปิดใช้การเชื่อมต่อ HTTP แบบถาวร (Keep-alive ที่นำมาใช้ใหม่ได้)

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่ เอกสารประกอบของ Apigee X
info

พร็อกซี API คืออินเทอร์เฟซสำหรับแอปพลิเคชันไคลเอ็นต์ที่ใช้เชื่อมต่อกับบริการแบ็กเอนด์ Apigee Edge มีวิธีต่างๆ ในการเชื่อมต่อกับบริการแบ็กเอนด์ผ่านพร็อกซี API ดังนี้

  • TargetEndpoint เพื่อเชื่อมต่อกับบริการ HTTP/HTTPs, NodeJS หรือบริการเป้าหมายที่โฮสต์
  • นโยบาย ServiceCallout เพื่อเรียกใช้บริการภายนอกก่อนหรือหลังการเรียกใช้เซิร์ฟเวอร์เป้าหมาย ใน TargetEndpoint
  • โค้ดที่กำหนดเองซึ่งเพิ่มลงในนโยบาย JavaScript หรือนโยบาย JavaCallout เพื่อเชื่อมต่อกับบริการแบ็กเอนด์

การเชื่อมต่อแบบต่อเนื่อง

การเชื่อมต่อแบบต่อเนื่องของ HTTP, หรือที่เรียกว่าการเชื่อมต่อ HTTP แบบ Keep-alive หรือการใช้การเชื่อมต่อ HTTP ซ้ำ เป็นแนวคิดที่อนุญาตให้การเชื่อมต่อ TCP เดียวส่งและ รับ คำขอ HTTP/การตอบสนองหลายรายการ แทนที่จะเปิดการเชื่อมต่อใหม่สำหรับคำขอ/การตอบสนองแต่ละคู่

Apigee Edge ใช้การเชื่อมต่อแบบต่อเนื่องเพื่อสื่อสารกับบริการแบ็กเอนด์ การเชื่อมต่อจะใช้งานได้ เป็นเวลา 60 วินาทีโดยค่าเริ่มต้น นั่นคือ หากการเชื่อมต่อไม่มีการใช้งานในพูลการเชื่อมต่อเป็นเวลานานกว่า 60 วินาที การเชื่อมต่อจะปิดลง

ระยะหมดเวลา Keep-alive สามารถกำหนดค่าได้ผ่านพร็อพเพอร์ตี้ที่ชื่อว่า keepalive.timeout.millis, ซึ่งระบุไว้ในการกำหนดค่า TargetEndpoint ของพร็อกซี API ตัวอย่างเช่น ระยะเวลา Keep-alive สามารถตั้งค่าเป็น 30 วินาทีสำหรับบริการแบ็กเอนด์ที่เฉพาะเจาะจงใน TargetEndpoint

ในตัวอย่างด้านล่าง keepalive.timeout.millis ตั้งค่าเป็น 30 วินาทีในการกำหนดค่า TargetEndpoint

<!-- /antipatterns/examples/disable-persistent-connections-1.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">30000</Property>
    </Properties>
  </HTTPTargetConnection>Disable HTTP persistent (Reusable keep-alive) connections
</TargetEndpoint>

ในตัวอย่างด้านบน keepalive.timeout.millis จะควบคุมลักษณะการทำงานแบบ Keep-alive สำหรับบริการแบ็กเอนด์ที่เฉพาะเจาะจงในพร็อกซี API นอกจากนี้ยังมีพร็อพเพอร์ตี้ที่ควบคุมลักษณะการทำงานแบบ Keep-alive สำหรับบริการแบ็กเอนด์ทั้งหมดในพร็อกซีทั้งหมด The HTTPTransport.keepalive.timeout.millis สามารถกำหนดค่าได้ในคอมโพเนนต์ Message Processor พร็อพเพอร์ตี้นี้มีค่าเริ่มต้นเป็น 60 วินาทีด้วย การแก้ไขพร็อพเพอร์ตี้นี้จะส่งผลต่อลักษณะการทำงานของการเชื่อมต่อแบบ Keep-alive ระหว่าง Apigee Edge กับบริการแบ็กเอนด์ทั้งหมดในพร็อกซี API ทั้งหมด

รูปแบบที่ไม่แนะนำ

ไม่แนะนำให้ปิดใช้การเชื่อมต่อแบบต่อเนื่อง (Keep-alive) โดยตั้งค่าพร็อพเพอร์ตี้ keepalive.timeout.millis เป็น 0 ในการกำหนดค่า TargetEndpoint ของพร็อกซี API ที่เฉพาะเจาะจง หรือตั้งค่า HTTPTransport.keepalive.timeout.millis เป็น 0 ใน Message Processor เนื่องจาก จะส่งผลต่อประสิทธิภาพ

ในตัวอย่างด้านล่าง การกำหนดค่า TargetEndpoint จะปิดใช้การเชื่อมต่อแบบต่อเนื่อง (Keep-alive) สำหรับบริการแบ็กเอนด์ที่เฉพาะเจาะจงโดยตั้งค่า keepalive.timeout.millis เป็น 0:

<!-- /antipatterns/examples/disable-persistent-connections-2.xml -->
<TargetEndpoint name="default">
  <HTTPTargetConnection>
    <URL>http://mocktarget.apigee.net</URL>
    <Properties>
      <Property name="keepalive.timeout.millis">0</Property>
     </Properties>
  </HTTPTargetConnection>
</TargetEndpoint>

หากปิดใช้การเชื่อมต่อแบบ Keep-alive สำหรับบริการแบ็กเอนด์อย่างน้อย 1 รายการ Edge จะต้องเปิดการเชื่อมต่อใหม่สำหรับคำขอใหม่แต่ละรายการไปยังบริการแบ็กเอนด์เป้าหมาย หากแบ็กเอนด์เป็น HTTPs, Edge จะทำการจับมือ SSL สำหรับคำขอใหม่แต่ละรายการด้วย ซึ่งจะเพิ่มเวลาในการตอบสนองโดยรวมของคำขอ API

ผลกระทบ

  • เพิ่มเวลาในการตอบสนองโดยรวมของคำขอ API เนื่องจาก Apigee Edge ต้องเปิดการเชื่อมต่อใหม่และ ทำการจับมือ SSL สำหรับคำขอใหม่ทุกรายการ
  • การเชื่อมต่ออาจหมดลงในสภาวะที่มีการรับส่งข้อมูลสูง เนื่องจากต้องใช้เวลาในการปล่อยการเชื่อมต่อ กลับสู่ระบบ

แนวทางปฏิบัติแนะนำ

  • บริการแบ็กเอนด์ควรปฏิบัติตามและจัดการการเชื่อมต่อแบบต่อเนื่องของ HTTP ตามมาตรฐาน HTTP 1.1 มาตรฐาน
  • บริการแบ็กเอนด์ควรตอบกลับด้วยส่วนหัว Connection:keep-alive หากจัดการการเชื่อมต่อแบบต่อเนื่อง (Keep-alive) ได้
  • บริการแบ็กเอนด์ควรตอบกลับด้วยส่วนหัว Connection:close หากจัดการการเชื่อมต่อแบบต่อเนื่องไม่ได้

การใช้รูปแบบนี้จะช่วยให้ Apigee Edge จัดการการเชื่อมต่อแบบต่อเนื่องหรือไม่ต่อเนื่อง กับบริการแบ็กเอนด์ได้โดยอัตโนมัติ โดยไม่ต้องทำการเปลี่ยนแปลงพร็อกซี API

อ่านเพิ่มเติม