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

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

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

ऐंटीपैटर्न

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

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

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

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

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

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

संसाधन का पाथ टारगेट सर्वर कोटा
/target-us target-US.somedomain.com हर मिनट 10 अनुरोध
/target-eu target-EU.somedomain.com हर मिनट 10 अनुरोध

कोटा नीति

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

<!-- /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” के प्रीफ़्लो में, “Quota-Minute-Target-Server” कोटा नीति का इस्तेमाल करें:

<!-- /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” टारगेट एंडपॉइंट के प्रीफ़्लो में, “Quota-Minute-Target-Server” कोटे की नीति का फिर से इस्तेमाल करें:

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

      “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>
    • टारगेट एंडपॉइंट की परिभाषा में, कोटे से जुड़ी नीति का इस्तेमाल करें. इसके लिए, यहां दिया गया तरीका अपनाएं:

      टारगेट एंडपॉइंट “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>

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

      <!-- /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> एलिमेंट का इस्तेमाल करके, यह पक्का करें कि कई यूनीक काउंटर बनाए गए हों.