Antipattern: ตัวจัดสรรภาระงานที่มีเซิร์ฟเวอร์เป้าหมายเดียวที่ตั้งค่า MaxFailures เป็นค่าที่ไม่ใช่ 0

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

การกำหนดค่า TargetEndpoint จะกำหนดวิธีที่ Apigee Edge เชื่อมต่อกับบริการแบ็กเอนด์หรือ API โดยจะส่งคำขอและรับการตอบกลับไปยัง/จากบริการแบ็กเอนด์ บริการแบ็กเอนด์อาจเป็นเซิร์ฟเวอร์ HTTP/HTTPS, NodeJS หรือ Hosted Target

คุณเรียกใช้บริการแบ็กเอนด์ใน TargetEndpoint ได้ด้วยวิธีใดวิธีหนึ่งต่อไปนี้

  • URL โดยตรงไปยังเซิร์ฟเวอร์ HTTP หรือ HTTPS
  • ScriptTarget ไปยังสคริปต์ Node.js ที่โฮสต์ใน Edge
  • HostedTarget ไปยัง NodeJS ที่ติดตั้งใช้งานในสภาพแวดล้อม Hosted Target
  • การกำหนดค่า TargetServer

ในทำนองเดียวกัน คุณสามารถใช้นโยบาย Service Callout เพื่อเรียกใช้บริการภายนอกใดก็ได้จากโฟลว์พร็อกซี API นโยบายนี้รองรับการกำหนด URL เป้าหมาย HTTP/HTTPS โดยตรงในนโยบายเองหรือใช้การกำหนดค่า TargetServer

การกำหนดค่า TargetServer

การกำหนดค่า TargetServer จะแยก URL ปลายทางที่เป็นรูปธรรมจากการกำหนดค่า TargetEndpoint หรือในนโยบาย Service Callout โดยจะอ้างอิง TargetServer ด้วยชื่อแทน URL ใน TargetEndpoint การกำหนดค่า TargetServer จะมีชื่อโฮสต์ของบริการแบ็กเอนด์ หมายเลขพอร์ต และรายละเอียดอื่นๆ

ตัวอย่างการกำหนดค่า TargetServer มีดังนี้

<TargetServer name="target1">
  <Host>www.mybackendservice.com</Host>
  <Port>80</Port>
  <IsEnabled>true</IsEnabled>
</TargetServer>

TargetServer ช่วยให้คุณมีการกำหนดค่าที่แตกต่างกันสำหรับแต่ละสภาพแวดล้อมได้ คุณสามารถกำหนดค่า TargetEndpoint/นโยบาย Service Callout ด้วย TargetServer ที่ตั้งชื่อไว้ตั้งแต่ 1 รายการขึ้นไปโดยใช้ LoadBalancer การรองรับการทำ Load Balancing ในตัวจะช่วยเพิ่มความพร้อมใช้งาน ของ API และการเฟลโอเวอร์ระหว่างอินสแตนซ์เซิร์ฟเวอร์แบ็กเอนด์ที่กำหนดค่าไว้

ตัวอย่างการกำหนดค่า TargetEndpoint โดยใช้ TargetServer มีดังนี้

<TargetEndpoint name="default">
    <HTTPTargetConnection>>
      <LoadBalancer>
        <Server name="target1"/>
      <Server name="target2"/>
      </LoadBalancer>
    </HTTPTargetConnection>
</TargetEndpoint>

MaxFailures

การกำหนดค่า MaxFailures จะระบุจำนวนสูงสุดของคำขอที่ล้มเหลวไปยังเซิร์ฟเวอร์เป้าหมาย หลังจากนั้นระบบจะทำเครื่องหมายเซิร์ฟเวอร์เป้าหมายว่าไม่พร้อมใช้งานและนำออกจากรอบการหมุนเวียนสำหรับคำขอทั้งหมดในอนาคต

ตัวอย่างการกำหนดค่าที่มีการระบุ MaxFailures

<TargetEndpoint name="default">
    <HTTPTargetConnection>
      <LoadBalancer>
        <Server name="target1"/>
       <Server name="target2"/>
       <MaxFailures>5</MaxFailures>
      </LoadBalancer>
    </HTTPTargetConnection>
</TargetEndpoint>

ในตัวอย่างข้างต้น หากคำขอ 5 รายการติดต่อกันล้มเหลวสำหรับ "target1" ระบบจะนำ "target1" ออกจากรอบการหมุนเวียนและส่งคำขอทั้งหมดในอนาคตไปยัง target2 เท่านั้น

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

ไม่แนะนำให้ใช้ TargetServer รายการเดียวในการกำหนดค่า LoadBalancer ของ TargetEndpoint หรือนโยบาย Service Callout ที่ตั้งค่า MaxFailures เป็นค่าที่ไม่ใช่ 0 เนื่องจากอาจส่งผลเสียได้

พิจารณาตัวอย่างการกำหนดค่าต่อไปนี้ที่มี TargetServer รายการเดียวชื่อ "target1" โดยตั้งค่า MaxFailures เป็น 5 (ค่าที่ไม่ใช่ 0)

<TargetEndpoint name="default">
  <HTTPTargetConnection>
      <LoadBalancer>
        <Algorithm>RoundRobin</Algorithm>
        <Server name="target1" />
        <MaxFailures>5</MaxFailures>
      </LoadBalancer>
  </HTTPTargetConnection>

หากคำขอไปยัง TargetServer "target1" ล้มเหลว 5 ครั้ง (จำนวนที่ระบุใน MaxFailures) ระบบจะนำ TargetServer ออกจากรอบการหมุนเวียน เนื่องจากไม่มี TargetServer อื่นให้เฟลโอเวอร์ คำขอทั้งหมดในอนาคตไปยังพร็อกซี API ที่มีการกำหนดค่านี้จะล้มเหลวโดยมีข้อผิดพลาด 503 Service Unavailable

แม้ว่า TargetServer "target1" จะกลับสู่สถานะปกติและสามารถส่งการตอบกลับที่สำเร็จได้ คำขอไปยังพร็อกซี API จะยังคงแสดงข้อผิดพลาด 503 เนื่องจาก Edge จะไม่ใส่ TargetServer กลับเข้าไปในรอบการหมุนเวียนโดยอัตโนมัติ แม้ว่าเป้าหมายจะกลับมาทำงานอีกครั้งแล้วก็ตาม หากต้องการแก้ไขปัญหานี้ คุณต้องติดตั้งใช้งานพร็อกซี API อีกครั้ง เพื่อให้ Edge ใส่ TargetServer กลับเข้าไปในรอบการหมุนเวียน

หากใช้การกำหนดค่าเดียวกันในนโยบาย Service Callout คำขอ API จะได้รับข้อผิดพลาด 500 หลังจากที่คำขอไปยัง TargetServer "target1" ล้มเหลว 5 ครั้ง

ผลกระทบ

การใช้ TargetServer รายการเดียวในการกำหนดค่า LoadBalancer ของ TargetEndpoint หรือนโยบาย Service Callout ที่ตั้งค่า MaxFailures เป็นค่าที่ไม่ใช่ 0 จะทำให้เกิดสิ่งต่อไปนี้

  • คำขอ API ล้มเหลวโดยมีข้อผิดพลาด 503/500 อย่างต่อเนื่อง (หลังจากที่คำขอไม่สำเร็จตามจำนวนครั้งที่ระบุใน MaxFailures) จนกว่าจะมีการติดตั้งใช้งานพร็อกซี API อีกครั้ง
  • การหยุดทำงานนานขึ้นเนื่องจากวินิจฉัยสาเหตุของปัญหานี้ได้ยากและอาจใช้เวลานานขึ้น (หากไม่มีความรู้เกี่ยวกับรูปแบบที่ไม่แนะนำนี้มาก่อน)

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

  1. ใช้ TargetServer มากกว่า 1 รายการในการกำหนดค่า LoadBalancer เพื่อให้มีความพร้อมใช้งานสูงขึ้น
  2. กำหนด Health Monitor เสมอ เมื่อตั้งค่า MaxFailures เป็นค่าที่ไม่ใช่ 0 ระบบจะนำเซิร์ฟเวอร์เป้าหมายออกจากรอบการหมุนเวียนเมื่อจำนวนความล้มเหลวถึงจำนวนที่ระบุใน MaxFailures การมี HealthMonitor จะช่วยให้มั่นใจได้ว่าระบบจะใส่ TargetServer กลับเข้าไปในรอบการหมุนเวียนทันทีที่เซิร์ฟเวอร์เป้าหมายพร้อมใช้งานอีกครั้ง ซึ่งหมายความว่าคุณไม่จำเป็นต้องติดตั้งใช้งานพร็อกซีอีกครั้ง

    Apigee แนะนำให้ละเว้นองค์ประกอบย่อย <Port> ภายใต้<TCPMonitor> เว้นแต่จะ แตกต่างจากพอร์ต TargetServer เพื่อให้แน่ใจว่าระบบจะตรวจสอบประสิทธิภาพการทำงานในหมายเลขพอร์ตเดียวกันกับที่ Edge ใช้เชื่อมต่อกับเซิร์ฟเวอร์เป้าหมาย โดยค่าเริ่มต้น <Port> จะเหมือนกับพอร์ต TargetServer

    ตัวอย่างการกำหนดค่าที่มี HealthMonitor:

    <TargetEndpoint name="default">
      <HTTPTargetConnection>
        <LoadBalancer>
          <Algorithm>RoundRobin</Algorithm>
          <Server name="target1" />
          <Server name="target2" />
          <MaxFailures>5</MaxFailures>
        </LoadBalancer>
        <Path>/test</Path>
        <HealthMonitor>
          <IsEnabled>true</IsEnabled>
          <IntervalInSec>5</IntervalInSec>
          <TCPMonitor>
            <ConnectTimeoutInSec>10</ConnectTimeoutInSec>
          </TCPMonitor>
        </HealthMonitor>
      </HTTPTargetConnection>
    </TargetEndpoint>
  3. หากมีข้อจำกัดที่ทำให้ใช้ TargetServer ได้เพียงรายการเดียวและไม่ได้ใช้ HealthMonitor ให้ละเว้นการระบุ MaxFailures ในการกำหนดค่า LoadBalancer

    ค่าเริ่มต้นของ MaxFailures คือ 0 ซึ่งหมายความว่า Edge จะพยายามเชื่อมต่อกับเป้าหมายสำหรับคำขอแต่ละรายการเสมอและจะไม่นำเซิร์ฟเวอร์เป้าหมายออกจากรอบการหมุนเวียน

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