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 หรือในนโยบายคำขอราคาเสนอบริการ เซิร์ฟเวอร์เป้าหมายคือ มีการอ้างอิงตามชื่อแทนที่จะเป็น URL ใน TargetEndpoint การกำหนดค่า TargetServer จะมีชื่อโฮสต์ของบริการแบ็กเอนด์ หมายเลขพอร์ต และรายละเอียดอื่นๆ

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

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

TargetServer ช่วยให้คุณกำหนดค่าที่แตกต่างกันสำหรับแต่ละสภาพแวดล้อมได้ คุณกำหนดค่านโยบายคำขอราคาเสนอ TargetEndpoint/Service ด้วย TargetServers อย่างน้อย 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 เท่านั้น

ลาย Antipattern

การมี TargetServer เดี่ยวในการกำหนดค่า LoadBalancer ของพารามิเตอร์ ตั้งค่านโยบายปลายทางปลายทางหรือนโยบายข้อความไฮไลต์บริการที่มีการตั้งค่า 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 กลับเข้าสู่การหมุนเวียน

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

ผลกระทบ

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

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

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

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

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

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