অ্যান্টিপ্যাটার্ন: একটি কোটা নীতি পুনরায় ব্যবহার করুন

আপনি Apigee Edge ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশনে যান
তথ্য

Apigee Edge কোটা নীতি ব্যবহার করে একটি নির্দিষ্ট সময়ের জন্য API প্রক্সির জন্য অনুমোদিত অনুরোধের সংখ্যা কনফিগার করার ক্ষমতা প্রদান করে।

অ্যান্টিপ্যাটার্ন

যদি একটি কোটা নীতি পুনঃব্যবহার করা হয়, তাহলে কোটা নীতি যেখানেই ব্যবহার করা হোক না কেন প্রতিবারই কোটা কাউন্টারটি কমিয়ে আনা হবে। অর্থাৎ, যদি একটি কোটা নীতি পুনরায় ব্যবহার করা হয়:

  • একটি API প্রক্সির একই প্রবাহ বা ভিন্ন প্রবাহের মধ্যে
  • একটি API প্রক্সির বিভিন্ন টার্গেট এন্ডপয়েন্টে

তারপর কোটা কাউন্টারটি প্রতিবার কার্যকর করার সময় হ্রাস পাবে এবং আমরা নির্দিষ্ট সময়ের ব্যবধানের জন্য প্রত্যাশিত সময়ের চেয়ে অনেক আগে কোটা লঙ্ঘন ত্রুটি পেতে পারব।

এটি কিভাবে কাজ করে তা ব্যাখ্যা করতে নিচের উদাহরণটি ব্যবহার করা যাক।

API প্রক্সি

ধরা যাক আমাদের কাছে “TestTargetServerQuota” নামে একটি API প্রক্সি রয়েছে, যা রিসোর্স পাথের উপর ভিত্তি করে দুটি ভিন্ন টার্গেট সার্ভারে ট্রাফিককে রুট করে। এবং আমরা প্রতিটি টার্গেট সার্ভারের জন্য প্রতি মিনিটে 10টি অনুরোধে API ট্র্যাফিক সীমাবদ্ধ করতে চাই। এখানে টেবিল যা এই দৃশ্যকল্প চিত্রিত করে:

সম্পদ পথ টার্গেট সার্ভার কোটা
/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 সেকেন্ডের মধ্যে এই API প্রক্সির জন্য মোট 10টি API অনুরোধ পেয়েছি:

সম্পদ পথ /target-us /target-eu সব
# অনুরোধ 4 6 10

একটু পরে, আমরা /target-us হিসাবে রিসোর্স পাথ সহ 11 তম API অনুরোধ পাই, আসুন 32 সেকেন্ড পরে বলি।

আমরা আশা করি যে অনুরোধটি সফলভাবে অতিক্রম করবে অনুমান করে যে আমাদের কাছে এখনও 6টি API অনুরোধ রয়েছে টার্গেট এন্ডপয়েন্ট target-us অনুমোদিত কোটা অনুযায়ী।

যাইহোক, বাস্তবে, আমরা একটি Quota violation error পেতে.

কারণ: যেহেতু আমরা উভয় টার্গেট এন্ডপয়েন্টে একই কোটা নীতি ব্যবহার করছি, তাই উভয় টার্গেট এন্ডপয়েন্টে আঘাতকারী API অনুরোধ ট্র্যাক করতে একটি একক কোটা কাউন্টার ব্যবহার করা হয়। এইভাবে আমরা প্রতি মিনিটে 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 একটি মান "ইউএস" থাকে তাহলে অনুরোধগুলি টার্গেট এন্ডপয়েন্ট "টার্গেট-ইউএস"-এ পাঠানো হয়।
    • একইভাবে যদি হেডার target_id একটি মান "ইউ" থাকে তাহলে অনুরোধগুলি টার্গেট এন্ডপয়েন্ট "টার্গেট-ইইউ"-এ পাঠানো হয়।
    • তাই আমরা উভয় টার্গেট এন্ডপয়েন্টে একই কোটা নীতি ব্যবহার করলেও, <Identifier> মানের উপর ভিত্তি করে আলাদা কোটা কাউন্টার বজায় রাখা হয়।
    • অতএব, <Identifier> উপাদান ব্যবহার করে আমরা নিশ্চিত করতে পারি যে প্রতিটি টার্গেট এন্ডপয়েন্ট 10টি অনুরোধের অনুমোদিত কোটা পেয়েছে।
  • প্রতিটি ফ্লো/টার্গেট এন্ডপয়েন্ট/API প্রক্সিতে আলাদা কোটা নীতি ব্যবহার করুন যাতে আপনি সর্বদা API অনুরোধের অনুমোদিত গণনা পান। আসুন এখন উপরের বিভাগে ব্যবহৃত একই উদাহরণটি দেখি কিভাবে আমরা প্রতিটি টার্গেট এন্ডপয়েন্টের জন্য 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>
      
    • নীচে দেখানো হিসাবে লক্ষ্য শেষ পয়েন্টের সংজ্ঞায় সংশ্লিষ্ট কোটা নীতি ব্যবহার করুন:

      টার্গেট এন্ডপয়েন্ট "টার্গেট-ইউএস":

      <!-- /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টি API অনুরোধের অনুমোদিত কোটা পাচ্ছি।
  • একাধিক, অনন্য কাউন্টার রক্ষণাবেক্ষণ নিশ্চিত করতে <Class> বা <Identifier> উপাদানগুলি ব্যবহার করুন।