एंटीपैटर्न: एक टारगेट सर्वर के साथ लोड बैलेंस को ज़ीरो वैल्यू पर सेट करने के लिए, MaxFailures को सेट करें

Apigee Edge दस्तावेज़ देखा जा रहा है.
Apigee X दस्तावेज़ पर जाएं.
जानकारी

टारगेटएंडपॉइंट कॉन्फ़िगरेशन से यह तय होता है कि Apigee Edge किस तरह बैकएंड सेवा या एपीआई से कनेक्ट होगा. यह अनुरोध भेजता है और बैकएंड सेवा को से रिस्पॉन्स मिलता है. बैकएंड सेवा कोई एचटीटीपी/एचटीटीपीएस सर्वर, NodeJS या होस्ट किया गया टारगेट हो सकता है.

targetEndpoint में बैकएंड सेवा को इनमें से किसी एक तरीके से शुरू किया जा सकता है:

  • किसी एचटीटीपी या एचटीटीपीएस सर्वर पर ले जाने वाला यूआरएल
  • स्क्रिप्ट टारगेट को Edge से होस्ट की गई Node.js स्क्रिप्ट के लिए टारगेट करता है
  • होस्ट किए गए टारगेट एनवायरमेंट पर होस्ट किए गए टारगेट को NodeJS पर डिप्लॉय किया गया
  • targetServer कॉन्फ़िगरेशन

इसी तरह, सेवा कॉलआउट की नीति का इस्तेमाल एपीआई प्रॉक्सी फ़्लो से, किसी भी बाहरी सेवा को कॉल करने के लिए किया जा सकता है. इस नीति के ज़रिए, एचटीटीपी/एचटीटीपीएस टारगेट यूआरएल तय किए जा सकते हैं. ऐसा सीधे नीति में या टारगेट सर्वर कॉन्फ़िगरेशन का इस्तेमाल करके भी किया जा सकता है.

targetServer कॉन्फ़िगरेशन

targetServer कॉन्फ़िगरेशन,TargetEndpoint कॉन्फ़िगरेशन या सेवा कॉलआउट नीतियों से कंक्रीट एंडपॉइंट यूआरएल को अलग करता है. targetEndpoint में यूआरएल के बजाय, नाम का इस्तेमाल किया जाता है. targetServer कॉन्फ़िगरेशन में बैकएंड सेवा का होस्टनेम, पोर्ट नंबर, और अन्य जानकारी होगी.

यहां TargetServer कॉन्फ़िगरेशन का एक सैंपल दिया गया है:

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

टारगेटसर्वर की मदद से हर एनवायरमेंट के लिए अलग-अलग कॉन्फ़िगरेशन हो सकते हैं. टारगेटएंडपॉइंट/सेवा कॉलआउट की नीति को Load Balancer का इस्तेमाल करके, नाम वाले एक या एक से ज़्यादा TargetServers के साथ कॉन्फ़िगर किया जा सकता है. लोड बैलेंसिंग के लिए पहले से मौजूद सहायता, एपीआई की उपलब्धता को बढ़ाती है और कॉन्फ़िगर किए गए बैकएंड सर्वर इंस्टेंस के बीच फ़ेलओवर होती है.

यहां targetServers का इस्तेमाल करके, TargetEndpoint कॉन्फ़िगरेशन का एक नमूना दिया गया है:

<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>

ऊपर दिए गए उदाहरण में, अगर "target1" के लिए लगातार पांच अनुरोध पूरे नहीं हो पाते, तो "target1" को रोटेशन से हटा दिया जाएगा और बाद के सभी अनुरोध सिर्फ़ target2 पर भेजे जाएंगे.

एंटीपैटर्न

हमारा सुझाव है कि अगर ऐसे TargetEndpoint या सेवा कॉलआउट नीति के LoadBalancer कॉन्फ़िगरेशन में एक TargetServer है जिसे शून्य नहीं पर सेट किया गया है, तो हमारा सुझाव है कि ऐसा करने से इसका बुरा असर हो सकता है.MaxFailures

नीचे दिए गए सैंपल कॉन्फ़िगरेशन का इस्तेमाल करें जिसमें "target1" नाम का एक TargetServer है जिसमें MaxFailures को 5 (शून्य के अलावा) पर सेट किया गया हो:

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

अगर targetServer "target1" को किए गए अनुरोध पांच बार (MaxFailures में बताई गई संख्या) फ़ेल हो जाते हैं, तो TargetServer को रोटेशन से हटा दिया जाता है. ऐसा कोई अन्य टारगेट सर्वर नहीं है जिसे पूरा करना ज़रूरी हो. इसलिए, इस कॉन्फ़िगरेशन वाले एपीआई प्रॉक्सी को मिलने वाले बाद के सभी अनुरोध, 503 Service Unavailable गड़बड़ी के साथ फ़ेल हो जाएंगे.

अगर targetServer "target1" अपनी सामान्य स्थिति पर वापस आ जाता है और वह सही तरीके से रिस्पॉन्स भेज पाता है, तो भी एपीआई प्रॉक्सी को किए जाने वाले अनुरोध 503 गड़बड़ियां दिखाते रहेंगे. इसकी वजह यह है कि टारगेट चालू होने और फिर से चालू होने पर भी Edge, अपने-आप टारगेटसर्वर को वापस रोटेशन में नहीं रखता. इस समस्या को ठीक करने के लिए, Edge के लिए एपीआई प्रॉक्सी को फिर से डिप्लॉय किया जाना चाहिए, ताकिTargetServer को फिर से रोटेशन वाली सेटिंग में बदला जा सके.

अगर सर्विस कॉलआउट नीति में इसी कॉन्फ़िगरेशन का इस्तेमाल किया जाता है, तो TargetServer "target1" को किए गए अनुरोध पांच बार काम नहीं करने पर, एपीआई अनुरोधों को 500 गड़बड़ी का मैसेज मिलेगा.

असर

टारगेट एंडपॉइंट या सेवा कॉलआउट नीति के LoadBalancer कॉन्फ़िगरेशन में एक ऐसे TargetServer का इस्तेमाल करना जिसमें MaxFailures को 'शून्य' वैल्यू पर सेट किया गया हो:

  • जब तक एपीआई प्रॉक्सी को फिर से डिप्लॉय नहीं किया जाता, तब तक 503/500 गड़बड़ियों के साथ एपीआई अनुरोध लगातार काम नहीं करते (MaxFailares के लिए बार-बार अनुरोध फ़ेल होने के बाद).
  • लंबे समय तक आउटेज होना मुश्किल होता है, क्योंकि इस समस्या की वजह का पता लगाने में ज़्यादा समय लग सकता है. हालांकि, इस एंटीपैटर्न के बारे में पहले से जानकारी नहीं दी गई है.

सबसे सही तरीका

  1. ज़्यादा उपलब्धता के लिए, LoadBalancer कॉन्फ़िगरेशन में एक से ज़्यादा TargetServer है.
  2. जब MaxFailures शून्य के अलावा किसी वैल्यू पर सेट हो, तो हेल्थ मॉनिटर को हमेशा तय करें. जब गड़बड़ियों की संख्या MaxFailures में बताई गई संख्या तक पहुंच जाती है, तब टारगेट सर्वर को रोटेशन से हटा दिया जाएगा. HealthMonitor होने का मतलब है कि टारगेट सर्वर के फिर से उपलब्ध होते ही, TargetServer घटने-बढ़ने की सेटिंग को फिर से चालू कर दिया जाए. इसका मतलब है कि प्रॉक्सी को फिर से डिप्लॉय करने की ज़रूरत नहीं है.

    जब तक Edge, टारगेट सर्वर से कनेक्ट करने के लिए इस्तेमाल किए जाने वाले पोर्ट नंबर पर ही जांच करता है उसी पोर्ट नंबर पर, Apigee का सुझाव है कि तब तक <TCPMonitor> के अंदर <Port> चाइल्ड एलिमेंट को हटा दें, जब तक वह 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 इस्तेमाल नहीं किया जा रहा है, तो LoadBalancer कॉन्फ़िगरेशन में MaxFailures को तय न करें.

    MaxFailares की डिफ़ॉल्ट वैल्यू 0 है. इसका मतलब है कि Edge हमेशा हर अनुरोध के लिए टारगेट से कनेक्ट करने की कोशिश करता है और टारगेट सर्वर को रोटेशन से कभी नहीं हटाता है.

इसके बारे में और पढ़ें