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

আপনি Apigee Edge-এর ডকুমেন্টেশন দেখছেন।
Apigee X ডকুমেন্টেশন
.info- তে যান।

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

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

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

  • একটি এপিআই প্রক্সির একই ফ্লো বা বিভিন্ন ফ্লো-এর মধ্যে
  • একটি এপিআই প্রক্সির বিভিন্ন টার্গেট এন্ডপয়েন্টে

এর ফলে, প্রতিবার এটি কার্যকর হওয়ার সাথে সাথে কোটা কাউন্টারের এক পয়েন্ট করে কমে যায় এবং আমরা নির্দিষ্ট সময়সীমার প্রত্যাশিত সময়ের অনেক আগেই কোটা লঙ্ঘনের ত্রুটি পেতে শুরু করি।

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

এপিআই প্রক্সি

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

রিসোর্স পাথ টার্গেট সার্ভার কোটা
/target-us target-US.somedomain.com প্রতি মিনিটে ১০টি অনুরোধ
/target-eu target-EU.somedomain.com প্রতি মিনিটে ১০টি অনুরোধ

কোটা নীতি

যেহেতু উভয় টার্গেট সার্ভারের জন্য ট্র্যাফিক কোটা একই, তাই আমরা নিচে দেখানো অনুযায়ী “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>

আগত ট্র্যাফিক প্যাটার্ন

ধরা যাক, আমরা প্রথম ৩০ সেকেন্ডের মধ্যে এই এপিআই প্রক্সির জন্য নিম্নলিখিত প্যাটার্নে মোট ১০টি এপিআই অনুরোধ পাই:

রিসোর্স পাথ /target-us /target-eu সব
# অনুরোধ ১০

কিছুক্ষণ পরে, ধরা যাক ৩২ সেকেন্ড পর, আমরা /target-us রিসোর্স পাথ সহ ১১তম এপিআই অনুরোধটি পাই।

আমরা আশা করছি যে অনুরোধটি সফলভাবে সম্পন্ন হবে, যদি নির্ধারিত কোটা অনুযায়ী টার্গেট এন্ডপয়েন্ট ' target-us এর জন্য আমাদের কাছে এখনও ৬টি এপিআই অনুরোধ অবশিষ্ট থাকে।

তবে বাস্তবে, আমরা একটি Quota violation error পাই।

কারণ: যেহেতু আমরা উভয় টার্গেট এন্ডপয়েন্টে একই কোটা পলিসি ব্যবহার করছি, তাই উভয় টার্গেট এন্ডপয়েন্টে আসা এপিআই রিকোয়েস্টগুলো ট্র্যাক করার জন্য একটিমাত্র কোটা কাউন্টার ব্যবহার করা হয়। এর ফলে, আমরা প্রতিটি আলাদা টার্গেট এন্ডপয়েন্টের জন্য নয়, বরং সম্মিলিতভাবে প্রতি মিনিটের ১০টি রিকোয়েস্টের কোটা শেষ করে ফেলি।

প্রভাব

এই অস্বাভাবিক প্রবণতার ফলে প্রত্যাশার মধ্যে একটি মৌলিক অমিল দেখা দিতে পারে, যার পরিণতিতে এমন ধারণা তৈরি হয় যে কোটার সীমা নির্ধারিত সময়ের আগেই শেষ হয়ে গেছে।

সর্বোত্তম অনুশীলন

  • একটিমাত্র কোটা পলিসি সংজ্ঞায়িত করার মাধ্যমে একাধিক ও স্বতন্ত্র কাউন্টার বজায় রাখা নিশ্চিত করতে <Class> বা <Identifier> এলিমেন্ট ব্যবহার করুন। চলুন, পূর্ববর্তী বিভাগে ব্যাখ্যা করা “Quota-Minute-Target-Server” কোটা পলিসিটিকে, নিচে দেখানো অনুযায়ী, <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-US” এবং “Target-EU” উভয় টার্গেট এন্ডপয়েন্টে এই কোটা নীতি ব্যবহার করা অব্যাহত রাখব।
    • এখন ধরা যাক, যদি হেডার target_id মান “US” হয়, তাহলে অনুরোধগুলি “Target-US” নামক টার্গেট এন্ডপয়েন্টে রাউট করা হয়।
    • একইভাবে, যদি হেডার target_id মান “EU” হয়, তাহলে অনুরোধগুলি টার্গেট এন্ডপয়েন্ট “Target-EU”-তে রাউট করা হয়।
    • সুতরাং, আমরা উভয় টার্গেট এন্ডপয়েন্টে একই কোটা পলিসি ব্যবহার করলেও, <Identifier> মানের উপর ভিত্তি করে আলাদা কোটা কাউন্টার রক্ষণাবেক্ষণ করা হয়।
    • সুতরাং, <Identifier> এলিমেন্টটি ব্যবহার করে আমরা নিশ্চিত করতে পারি যে প্রতিটি টার্গেট এন্ডপয়েন্ট ১০টি রিকোয়েস্টের অনুমোদিত কোটা পাবে।
  • প্রতিটি ফ্লো/টার্গেট এন্ডপয়েন্ট/এপিআই প্রক্সিতে আলাদা কোটা পলিসি ব্যবহার করুন, যাতে আপনি সর্বদা অনুমোদিত সংখ্যক এপিআই রিকোয়েস্ট পান। চলুন এখন উপরের অংশে ব্যবহৃত একই উদাহরণটি দেখি, কীভাবে আমরা প্রতিটি টার্গেট এন্ডপয়েন্টের জন্য ১০টি রিকোয়েস্টের অনুমোদিত কোটা অর্জন করতে পারি।
    • “Target-US” এবং “Target-EU” টার্গেট এন্ডপয়েন্টগুলোর প্রতিটির জন্য একটি করে পৃথক কোটা নীতি নির্ধারণ করুন।

      টার্গেট এন্ডপয়েন্ট “টার্গেট-ইউএস”-এর জন্য কোটা নীতি:

      <!-- /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>
    • যেহেতু আমরা “Target-US” এবং “Target-EU” টার্গেট এন্ডপয়েন্টগুলিতে আলাদা কোটা পলিসি ব্যবহার করছি, তাই একটি পৃথক কাউন্টার রক্ষণাবেক্ষণ করা হবে। এটি নিশ্চিত করে যে আমরা প্রতিটি টার্গেট এন্ডপয়েন্টের জন্য প্রতি মিনিটে ১০টি এপিআই রিকোয়েস্টের অনুমোদিত কোটা পাই।
  • একাধিক ও স্বতন্ত্র কাউন্টার বজায় রাখা নিশ্চিত করতে <Class> বা <Identifier> এলিমেন্ট ব্যবহার করুন।