एंटीपैटर्न: कोटा नीति का फिर से इस्तेमाल करना

आपको Apigee Edge दस्तावेज़ दिख रहा है.
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है इस पेज पर जाएं Apigee X दस्तावेज़.
जानकारी

Apigee Edge की मदद से, एपीआई प्रॉक्सी के लिए अनुरोधों की संख्या को कॉन्फ़िगर किया जा सकता है कोटा की नीति का इस्तेमाल करके, किसी खास समयावधि के लिए तय किया जा सकता है.

एंटीपैटर्न

अगर किसी कोटा नीति का फिर से इस्तेमाल किया जाता है, तो हर बार कोटा काउंटर कम होने पर कोटे की नीति लागू होती है, चाहे उसका इस्तेमाल कहीं भी किया जा रहा हो. इसका मतलब है कि अगर कोटा नीति फिर से इस्तेमाल किया गया:

  • एपीआई प्रॉक्सी के एक ही फ़्लो या अलग-अलग फ़्लो में
  • किसी एपीआई प्रॉक्सी के अलग-अलग टारगेट एंडपॉइंट में

फिर इसे हर बार निष्पादित करने पर कोटा काउंटर कम हो जाता है और हमें कोटा के उल्लंघन की गड़बड़ियां, किसी तय समयावधि के लिए तय समय से काफ़ी पहले की हैं.

आइए, यहां दिए गए उदाहरण से समझें कि यह कैसे काम करता है.

एपीआई प्रॉक्सी

मान लें कि हमारे पास “TestTargetServerPath” नाम का एक एपीआई प्रॉक्सी है, जो ट्रैफ़िक को दो यूआरएल पर रूट करता है जिसमें संसाधन पाथ के आधार पर अलग-अलग टारगेट सर्वर शामिल हैं. साथ ही, हम एपीआई ट्रैफ़िक को सीमित करना चाहते हैं इनमें से प्रत्येक टारगेट सर्वर के लिए हर मिनट 10 अनुरोध पर निर्भर करता है. यहां दी गई टेबल में यह जानकारी दी गई है स्थिति:

संसाधन पाथ टारगेट सर्वर अनुरोध भेजने की तय सीमा (कोटा)
/target-us target-US.somedomain.com 10 अनुरोध प्रति मिनट
/target-eu target-EU.somedomain.com 10 अनुरोध प्रति मिनट

कोटा नीति

दोनों टारगेट सर्वर का ट्रैफ़िक कोटा एक ही होता है. इसलिए, हम एक ही कोटा से जुड़ी नीति तय करते हैं जिसका नाम “कोटा-मिनट-टारगेट-सर्वर” दिया गया है, जैसा कि यहां दिखाया गया है:

<!-- /antipatterns/examples/1-8.xml -->
<Quota name="Quota-Minute-Target-Server">
  <Interval>1</Interval>
  <TimeUnit>minute</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="10"/>
</Quota>

टारगेट एंडपॉइंट

टारगेट एंडपॉइंट के प्रीफ़्लो में, कोटा की नीति “कोटा-मिनट-टारगेट-सर्वर” का इस्तेमाल करते हैं “टारगेट-अमेरिका”:

<!-- /antipatterns/examples/1-9.xml -->
<TargetEndpoint name="Target-US">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

साथ ही, दूसरे टारगेट के प्रीफ़्लो में कोटा की उसी नीति “कोटा-मिनट-टारगेट-सर्वर” का फिर से इस्तेमाल करें एंडपॉइंट पर भी “टारगेट-ईयू”:

<!-- /antipatterns/examples/1-10.xml -->
<TargetEndpoint name="Target-EU">
  <PreFlow name="PreFlow">
    <Request>
      <Step>
        <Name>Quota-Minute-Target-Server</Name>
      </Step>
    </Request>
  <Response/>
  </PreFlow>
  <HTTPTargetConnection>
    <URL>http://target-us.somedomain.com</URL>
  </HTTPTargetConnection>
</TargetEndpoint>

आने वाले ट्रैफ़िक का पैटर्न

मान लें कि हमें इस एपीआई प्रॉक्सी के लिए पहले 30 सेकंड में कुल 10 एपीआई अनुरोध मिलते हैं निम्न पैटर्न:

संसाधन पाथ /target-us /target-eu सभी
# अनुरोध 4 6 10

थोड़ी देर बाद, हमें संसाधन पाथ के साथ 11वां एपीआई अनुरोध मिला, जैसे कि /target-us, अब 32 सेकंड बाद मानो.

हम यह मानकर अनुरोध को पूरा करने की उम्मीद करते हैं कि हमारे पास अब भी 6 API अनुरोध हैं कोटा के हिसाब से, टारगेट एंडपॉइंट target-us.

हालांकि, हकीकत में हमें Quota violation error मिलता है.

वजह: हम दोनों टारगेट एंडपॉइंट में एक ही कोटा नीति का इस्तेमाल कर रहे हैं. इसलिए, सिंगल कोटा काउंटर का इस्तेमाल दोनों टारगेट एंडपॉइंट पर हिट करने वाले एपीआई अनुरोधों को ट्रैक करने के लिए किया जाता है. इसलिए, हम इससे हर मिनट के लिए तय किए गए 10 अनुरोधों का कोटा खत्म होने लगता है, न कि किसी एक टारगेट के लिए एंडपॉइंट का इस्तेमाल करें.

असर

इस तरह के एंटीपैटर्न की वजह से लोगों की उम्मीदों में अंतर आ सकता है. इससे लोगों के बीच एक धारणा बन सकती है कोटा की सीमा समय से पहले खत्म हो गई.

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

  • एकाधिक, सुनिश्चित करने के लिए <Class> या <Identifier> तत्वों का उपयोग करें यूनीक काउंटर का रखरखाव करने के लिए, कोटा की एक नीति तय की जाती है. आइए, कोटे की नीति को फिर से तय करते हैं “कोटा-मिनट-टारगेट-सर्वर”, जिसके बारे में हमने पिछले सेक्शन में हेडर का इस्तेमाल करके बताया है <Identifier> के तौर पर target_id:
    <!-- /antipatterns/examples/1-11.xml -->
    <Quota name="Quota-Minute-Target-Server">
      <Interval>1</Interval>
      <TimeUnit>minute</TimeUnit>
      <Allow count="10"/>
      <Identifier ref="request.header.target_id"/>
      <Distributed>true</Distributed>
    </Quota>
    
    • हम कोटा की इस नीति का इस्तेमाल, टारगेट एंडपॉइंट “टारगेट-यूएस” और पहले की तरह “टारगेट-ईयू”.
    • अब मान लीजिए कि अगर हेडर target_id की वैल्यू “US” है, तो अनुरोधों को टारगेट एंडपॉइंट “टारगेट-यूएस”.
    • इसी तरह अगर हेडर target_id की वैल्यू “EU” है, तो अनुरोधों को टारगेट पर रूट किया जाता है एंडपॉइंट पर क्लिक करें, “Target-EU”.
    • इसलिए, भले ही हम दोनों टारगेट एंडपॉइंट में एक ही कोटा से जुड़ी नीति का इस्तेमाल करें, फिर भी कोटा काउंटर अलग-अलग को <Identifier> वैल्यू के आधार पर मैनेज किया जाता है.
    • इसलिए, <Identifier> एलिमेंट का इस्तेमाल करके हम यह पक्का कर सकते हैं कि हर टारगेट एंडपॉइंट ज़्यादा से ज़्यादा 10 अनुरोध मिल सकते हैं.
  • हर एक फ़्लो/टारगेट एंडपॉइंट/एपीआई प्रॉक्सी में अलग-अलग कोटा नीति का इस्तेमाल करें, ताकि आप यह पक्का कर सकें कि हमेशा एपीआई अनुरोधों की अनुमति वाली संख्या पाएं. आइए, अब हम वही उदाहरण देखते हैं जिसका इस्तेमाल देखें कि हम प्रत्येक लक्ष्य के लिए 10 अनुरोधों का स्वीकृत कोटा कैसे हासिल कर सकते हैं एंडपॉइंट के बारे में भी बताएंगे.
    • कोटा के लिए एक अलग नीति तय करें. हर टारगेट एंडपॉइंट “टारगेट-यूएस” के लिए एक-एक करें और “टारगेट-ईयू”

      टारगेट एंडपॉइंट “टारगेट-यूएस” के लिए कोटा नीति:

      <!-- /antipatterns/examples/1-12.xml -->
      <Quota name="Quota-Minute-Target-Server-US">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
      

      टारगेट एंडपॉइंट “टारगेट-ईयू” के लिए कोटा नीति:

      <!-- /antipatterns/examples/1-13.xml -->
      <Quota name="Quota-Minute-Target-Server-EU">
        <Interval>1</Interval>
        <TimeUnit>minute</TimeUnit>
        <Distributed>true</Distributed>
        <Allow count="10"/>
      </Quota>
      
    • नीचे बताए गए तरीके से टारगेट एंडपॉइंट की परिभाषा में, उनसे जुड़ी कोटा नीति का इस्तेमाल करें:

      टारगेट एंडपॉइंट “Target-US”:

      <!-- /antipatterns/examples/1-14.xml -->
      <TargetEndpoint name="Target-US">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-US</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-us.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
      

      टारगेट एंडपॉइंट “टारगेट-ईयू”:

      <!-- /antipatterns/examples/1-15.xml -->
      <TargetEndpoint name="Target-EU">
        <PreFlow name="PreFlow">
          <Request>
            <Step>
              <Name>Quota-Minute-Target-Server-EU</Name>
            </Step>
          </Request>
          <Response/>
        </PreFlow>
        <HTTPTargetConnection>
          <URL>http://target-eu.somedomain.com</URL>
        </HTTPTargetConnection>
      </TargetEndpoint>
      
    • हम टारगेट एंडपॉइंट “टारगेट-यूएस” और “टारगेट-ईयू” के तौर पर, एक अलग काउंटर बनाया जाएगा. इससे यह पक्का होता है कि हमें हर टारगेट एंडपॉइंट के लिए, हर मिनट 10 एपीआई अनुरोध का कोटा.
  • पक्का करने के लिए, <Class> या <Identifier> एलिमेंट का इस्तेमाल करें कई, यूनीक काउंटर मैनेज किए जाते हैं.