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 một API hoặc dịch vụ phụ trợ. Trình này 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 những cách sau:

  • URL thẳng đế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 TargetServer

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

Cấu hình TargetServer

Cấu hình TargetServer sẽ tách 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ụ. TargetServer được tham chiếu theo 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. Bạn có thể định cấu hình chính sách Chú thích TargetEndpoint/Service bằng một hoặc nhiều TargetServers có tên bằng cách sử dụng Load Balancer. Tính năng hỗ trợ tích hợp sẵn cho việc cân bằng tải giúp nâng cao khả năng sử dụng API và khả năng chuyển đổi dự phòng giữa các thực thể máy chủ phụ trợ đã định cấu hình.

Dưới đây là một cấu hình TargetEndpoint mẫu bằ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ượng yêu cầu không thành công tối đa đối với máy chủ mục tiêu, sau đó máy chủ mục tiêu sẽ được đánh dấu là ngừng hoạt động và bị xoá khỏi chế độ xoay cho tất cả các yêu cầu tiếp theo.

Cấu hình mẫu với 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" thì "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 tới target2.

Phản mẫu

Bạn không nên đặt một TargetServer trong cấu hình LoadBalancer của chính sách Chú thích mục tiêu hoặc Chú thích dịch vụ với MaxFailures thành một giá trị khác 0 vì có thể gây ra tác động bất lợi.

Hãy xem xét cấu hình mẫu sau 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 gửi đến TargetServer "target1" không thành công 5 lần (số được chỉ định trong MaxFailures), thì TargetServer sẽ bị xoá khỏi chế độ xoay vòng. Vì không có Máy chủ mục tiêu nào khác để chuyển đổi, nên tất cả các yêu cầu tiếp theo gửi đến Proxy API có cấu hình này đều sẽ không thực hiện được kèm theo lỗi 503 Service Unavailable.

Ngay cả khi TargetServer "target1" trở về trạng thái bình thường và có thể gửi phản hồi thành công, các yêu cầu đến 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 xoay vòng 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, bạn phải triển khai lại Proxy API cho Edge để đưa Máy chủ mục tiêu trở lại chế độ xoay vòng.

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

Mức độ tác động

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

  • Yêu cầu API không thành công liên tục với Lỗi 503/500 (sau khi yêu cầu không thành công đối 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ì khó xác định và có thể mất nhiều thời gian hơn để chẩn đoán nguyên nhân của vấn đề này (mà không cần biết trước về lỗi này).

Phương pháp hay nhất

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

    Để đảm bảo rằng hoạt động kiểm tra tình trạng được thực hiện trên cùng một số cổng mà Edge sử dụng để kết nối với các 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 phần tử này 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 bằng 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ố quy tắc ràng buộc mà chỉ có một Máy chủ mục tiêu và nếu HealthMonitor không được sử dụng, thì bạn không nên 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ục tiêu trong mỗi yêu cầu và không bao giờ xoá máy chủ mục tiêu khỏi vòng xoay.

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