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

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

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

एंटीपैटर्न

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

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

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

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

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

मान लें कि हमारे पास “TestTargetServerAmount” नाम का एक एपीआई प्रॉक्सी है, जो रिसॉर्स पाथ के आधार पर ट्रैफ़िक को दो अलग-अलग टारगेट सर्वर पर रूट करता है. साथ ही, हम इन सभी टारगेट सर्वर के लिए, एपीआई ट्रैफ़िक को हर मिनट के 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>

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

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

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

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

<!-- /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 सेकंड के बाद.

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

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

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

असर

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

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

  • <Class> या <Identifier> एलिमेंट का इस्तेमाल करें, ताकि यह पक्का किया जा सके कि एक कोटा नीति तय करके, एक से ज़्यादा और यूनीक काउंटर बनाए रखे गए हैं. आइए, कोटा नीति “कोटा-मिनट-टारगेट-सर्वर” को फिर से परिभाषित करते हैं. इसके बारे में हमने पिछले सेक्शन में बताया था. इसके बारे में, target_id हेडर का इस्तेमाल करके, <Identifier> के तौर पर किया गया है. इसका उदाहरण नीचे दिया गया है:
    <!-- /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-US” और “Target-EU”, दोनों में पहले की तरह ही कोटा नीति का इस्तेमाल करते रहेंगे.
    • अब मान लें कि अगर हेडर target_id की वैल्यू “US” है, तो अनुरोधों को टारगेट एंडपॉइंट “Target-US” में भेजा जाता है.
    • इसी तरह, अगर हेडर target_id की वैल्यू “ईयू” है, तो अनुरोधों को टारगेट एंडपॉइंट “टारगेट-ईयू” पर भेजा जाता है.
    • इसलिए, अगर हम दोनों टारगेट एंडपॉइंट में एक ही कोटा नीति का इस्तेमाल करते हैं, तो भी <Identifier> वैल्यू के आधार पर अलग-अलग कोटा काउंटर मैनेज किए जाते हैं.
    • इसलिए, <Identifier> एलिमेंट का इस्तेमाल करके हम यह पक्का कर सकते हैं कि हर टारगेट एंडपॉइंट को 10 अनुरोधों का तय कोटा मिले.
  • हर फ़्लो/टारगेट एंडपॉइंट/एपीआई प्रॉक्सी में अलग-अलग कोटा नीति का इस्तेमाल करें, ताकि आपको हमेशा एपीआई अनुरोधों की संख्या मिलती रहे. आइए, अब ऊपर दिए गए सेक्शन में इस्तेमाल किए गए उदाहरण को देखते हैं. हम यह देखते हैं कि हम हर टारगेट एंडपॉइंट के लिए, अनुमति वाले 10 अनुरोधों का कोटा कैसे हासिल कर सकते हैं.
    • कोटा के लिए एक अलग नीति तय करें. यह नीति, टारगेट एंडपॉइंट “टारगेट-यूएस” और “टारगेट-ईयू” के लिए एक-एक होनी चाहिए

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

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

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

      <!-- /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>
      
    • टारगेट एंडपॉइंट की परिभाषा में, संबंधित कोटा नीति का इस्तेमाल करें, जैसा कि यहां दिखाया गया है:

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

      <!-- /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>
      
    • हम टारगेट एंडपॉइंट “Target-US” और “Target-EU” में अलग-अलग कोटा नीति का इस्तेमाल कर रहे हैं. इसलिए, इसके लिए अलग से काउंटर सेट किया जाएगा. इससे यह पक्का हो जाता है कि हमें हर टारगेट एंडपॉइंट के लिए, हर मिनट 10 एपीआई अनुरोधों की अनुमति मिली हुई है.
  • <Class> या <Identifier> एलिमेंट का इस्तेमाल करके, यह पक्का करें कि एक से ज़्यादा और यूनीक काउंटर सही तरीके से काम कर रहे हैं.