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

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

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

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

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

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

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

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

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

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

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

ต่อไปนี้คือตัวอย่างการกำหนดค่า TargetEndpoint โดยใช้ TargetServers

<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 คำขอราคาเสนอ 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 จะถูกนำออกจากการหมุนเวียน เนื่องจากไม่มี TargetServers อื่นที่จะล้มเหลวแล้ว คำขอที่ตามมาทั้งหมดที่ส่งไปยังพร็อกซี API ที่มีการกำหนดค่านี้จะล้มเหลวโดยมีข้อผิดพลาด 503 Service Unavailable รายการ

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

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

มีอิทธิพล

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

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

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

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

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

    ตัวอย่างการกำหนดค่าจาก Health Monitor

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

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