Chống lỗi: Cân bằng tải với một máy chủ đích duy nhất với MaxFailures được đặt thành giá trị khác 0

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Cấu hình TargetEndpoint xác định cách Apigee Edge kết nối với dịch vụ hoặc API phụ trợ. Trình thu thập thông tin gửi yêu cầu và nhận phản hồi đến/từ dịch vụ phụ trợ. Dịch vụ phụ trợ có thể là máy chủ HTTP/HTTPS, NodeJS hoặc mục tiêu được lưu trữ.

Dịch vụ phụ trợ trong TargetEndpoint có thể được gọi theo một trong các cách sau:

  • Chuyển hướng URL đến máy chủ HTTP hoặc HTTPS
  • ScriptTarget đến tập lệnh Node.js được lưu trữ ở Edge
  • HostedTarget đến NodeJS được triển khai trên Môi trường mục tiêu được lưu trữ
  • Cấu hình máy chủ mục tiêu

Tương tự, chính sách Chú thích dịch vụ có thể được dùng để thực hiện cuộc gọi đến bất kỳ dịch vụ bên ngoài nào từ luồng Proxy API. Chính sách này hỗ trợ xác định URL đích HTTP/HTTPS ngay trong chính sách hoặc thông qua cấu hình TargetServer.

Cấu hình máy chủ mục tiêu

Cấu hình TargetServer tách riêng các URL điểm cuối cụ thể khỏi Cấu hình TargetEndpoint hoặc trong chính sách Chú thích dịch vụ. Máy chủ đích là được tham chiếu bằng tên thay vì URL trong TargetEndpoint. Cấu hình TargetServer sẽ có tên máy chủ của dịch vụ phụ trợ, số cổng và các thông tin chi tiết khác.

Dưới đây là cấu hình TargetServer mẫu:

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

TargetServer cho phép bạn có các cấu hình khác nhau cho từng môi trường. Chính sách Chú thích TargetEndpoint/Dịch vụ có thể được thiết lập với một hoặc nhiều Máy chủ đích được đặt tên bằng cách sử dụng Trình cân bằng tải. Tính năng hỗ trợ tích hợp sẵn cho tính năng cân bằng tải giúp tăng cường khả năng sử dụng API và tính năng chuyển đổi dự phòng giữa các thực thể máy chủ phụ trợ đã được định cấu hình.

Dưới đây là cấu hình TargetEndpoint mẫu sử dụng TargetServers:

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

MaxFailures

Cấu hình MaxFailures chỉ định số lần yêu cầu không thành công tối đa tới máy chủ đích, sau đó máy chủ đích sẽ được đánh dấu là ngừng hoạt động và bị xoá xoay vòng cho tất cả các yêu cầu tiếp theo.

Một cấu hình mẫu có MaxFailures được chỉ định:

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

Trong ví dụ trên, nếu 5 yêu cầu liên tiếp không thành công cho "target1" rồi đến "target1" sẽ bị xoá khỏi chế độ xoay vòng và tất cả các yêu cầu tiếp theo sẽ chỉ được gửi đến target2.

Phản mẫu

Có một TargetServer trong cấu hình LoadBalancer của Chính sách TargetEndpoint hoặc Chú thích dịch vụ với MaxFailures được đặt thành Bạn không nên sử dụng giá trị khác 0 vì giá trị đó có thể ảnh hưởng xấu.

Hãy xem xét cấu hình mẫu sau đây có một TargetServer duy nhất có tên là "target1" với MaxFailures được đặt thành 5 (giá trị khác 0):

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

Nếu các yêu cầu đến TargetServer "target1" không thành công năm lần (số được chỉ định trong MaxFailures), TargetServer bị xoá khỏi chế độ xoay. Vì không có TargetServers nào khác để không vượt qua, tất cả các yêu cầu tiếp theo đến Proxy API có cấu hình này sẽ không thực hiện được 503 Service Unavailable lỗi.

Ngay cả khi TargetServer "target1" trở lại trạng thái bình thường và có khả năng gửi phản hồi thành công, các yêu cầu tới Proxy API sẽ tiếp tục trả về lỗi 503. Điều này là do Edge không tự động đặt TargetServer quay lại xoay ngay cả sau khi mục tiêu đã được thiết lập và chạy lại. Để giải quyết vấn đề này, Proxy API phải được triển khai lại cho Edge để đưa TargetServer quay trở lại xoay vòng.

Nếu chính sách Chú thích dịch vụ sử dụng cùng một cấu hình, thì API các yêu cầu sẽ nhận được Lỗi 500 sau khi gửi yêu cầu đến TargetServer "target1" thất bại 5 lần.

Tác động

Sử dụng một TargetServer trong cấu hình LoadBalancer của Chính sách TargetEndpoint hoặc Chú thích dịch vụ có MaxFailures được đặt thành giá trị khác 0 sẽ gây ra:

  • Yêu cầu API không thực hiện được với Lỗi liên tục 503/500 (sau khi yêu cầu không thành công với số lần MaxFailures) cho đến khi Proxy API được triển khai lại.
  • Thời gian ngừng hoạt động lâu hơn vì phức tạp và có thể mất nhiều thời gian hơn để chẩn đoán nguyên nhân của vấn đề (mà không cần biết trước về phản mẫu này).

Phương pháp hay nhất

  1. Có nhiều Máy chủ đích trong cấu hình LoadBalancer để có khả năng hoạt động cao hơn.
  2. Luôn xác định Trình theo dõi sức khoẻ khi MaxFailures được đặt thành một giá trị khác 0. Máy chủ đích sẽ bị xoá khỏi chế độ xoay khi số lượng lỗi đạt đến con số đã chỉ định trong MaxFailures. Việc có HealthMonitor đảm bảo rằng TargetServer được đưa trở lại xoay vòng như ngay khi máy chủ mục tiêu hoạt động trở lại, nghĩa là có không cần triển khai lại proxy.

    Để đảm bảo rằng quy trình kiểm tra tình trạng được thực hiện trên cùng số cổng Edge sử dụng để kết nối với máy chủ mục tiêu, Apigee khuyên bạn nên bỏ qua phần tử con <Port> trong <TCPMonitor> trừ phi nó khác với cổng TargetServer. Theo mặc định, <Port> giống với cổng TargetServer.

    Cấu hình mẫu với 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. Nếu có một số hạn chế như việc chỉ có một Máy chủ mục tiêu và nếu HealthMonitor không được sử dụng thì đừng chỉ định MaxFailures trong cấu hình LoadBalancer.

    Giá trị mặc định của MaxFailures là 0. Điều này có nghĩa là Edge luôn cố gắng kết nối với máy chủ mục tiêu cho mỗi yêu cầu và không bao giờ xoá máy chủ mục tiêu khỏi chế độ xoay vòng.

Tài liệu đọc thêm