شما در حال مشاهده مستندات Apigee Edge هستید.
به مستندات Apigee X مراجعه کنید . اطلاعات
چه
از سیاست سهمیهبندی برای پیکربندی تعداد پیامهای درخواستی که یک پروکسی API در یک دوره زمانی، مانند دقیقه، ساعت، روز، هفته یا ماه، اجازه میدهد، استفاده کنید. میتوانید سهمیه را برای همه برنامههایی که به پروکسی API دسترسی دارند، یکسان تنظیم کنید، یا میتوانید سهمیه را بر اساس موارد زیر تنظیم کنید:
- محصولی که حاوی پروکسی API است
- برنامهای که API را درخواست میکند
- توسعه دهنده برنامه
- بسیاری از معیارهای دیگر
از سهمیه برای محافظت در برابر افزایش ناگهانی ترافیک استفاده نکنید. برای این کار، از سیاست Spike Arrest استفاده کنید. به سیاست Spike Arrest مراجعه کنید.
ویدیوها
این ویدیوها مدیریت سهمیه را با سیاست سهمیهبندی معرفی میکنند:
مقدمه (لبه جدید)
مقدمه (لبه کلاسیک)
سهمیه پویا
توزیعشده و همزمان
وزن پیام
تقویم
پنجره غلتان
فلکسی
سهمیه مشروط
متغیرهای جریان
مدیریت خطا
نمونهها
این نمونههای کد سیاست، نحوه شروع و پایان دورههای سهمیهبندی را با موارد زیر نشان میدهند:
سهمیه پویای بیشتر
<Quota name="CheckQuota"> <Interval ref="verifyapikey.verify-api-key.apiproduct.developer.quota.interval">1</Interval> <TimeUnit ref="verifyapikey.verify-api-key.apiproduct.developer.quota.timeunit">hour</TimeUnit> <Allow count="200" countRef="verifyapikey.verify-api-key.apiproduct.developer.quota.limit"/> </Quota>
سهمیههای پویا شما را قادر میسازد تا یک سیاست سهمیهبندی واحد را پیکربندی کنید که تنظیمات سهمیهبندی متفاوتی را بر اساس اطلاعات ارسالی به سیاست سهمیهبندی اعمال کند. اصطلاح دیگر برای تنظیمات سهمیهبندی در این زمینه "طرح سرویس" است. سهمیهبندی پویا "طرح سرویس" برنامهها را بررسی میکند و سپس آن تنظیمات را اعمال میکند.
نکته : اگر برای یک عنصر هم مقدار و هم ارجاع مشخص کنید، ارجاع اولویت پیدا میکند. اگر ارجاع در زمان اجرا مشخص نشود، از مقدار استفاده میشود.
برای مثال، وقتی یک محصول API ایجاد میکنید، میتوانید به صورت اختیاری محدودیت سهمیه مجاز، واحد زمانی و فاصله زمانی را تنظیم کنید. با این حال، تنظیم این مقادیر روی محصول API، استفاده از آنها را در یک پروکسی API اجباری نمیکند. همچنین باید یک سیاست سهمیهبندی به پروکسی API که این مقادیر را میخواند، اضافه کنید. برای اطلاعات بیشتر به بخش ایجاد محصولات API مراجعه کنید.
در مثال بالا، پروکسی API حاوی سیاست سهمیهبندی از یک سیاست VerifyAPIKey به نام verify-api-key برای اعتبارسنجی کلید API ارسال شده در یک درخواست استفاده میکند. سپس سیاست سهمیهبندی به متغیرهای جریان از سیاست VerifyAPIKey دسترسی پیدا میکند تا مقادیر سهمیهبندی تنظیم شده روی محصول API را بخواند. برای اطلاعات بیشتر در مورد متغیرهای جریان VerifyAPIKey، به سیاست Verify API Key مراجعه کنید.
گزینه دیگر این است که ویژگیهای سفارشی را برای توسعهدهندگان یا برنامههای خاص تنظیم کنید و سپس آن مقادیر را در سیاست سهمیهبندی بخوانید. به عنوان مثال، میخواهید مقادیر سهمیهبندی متفاوتی را برای هر توسعهدهنده تنظیم کنید. در این حالت، ویژگیهای سفارشی را برای توسعهدهنده تنظیم میکنید که شامل محدودیت، واحد زمانی و بازه زمانی است. سپس این مقادیر را در سیاست سهمیهبندی، همانطور که در زیر نشان داده شده است، ارجاع میدهید:
<Quota name="DeveloperQuota"> <Identifier ref="verifyapikey.verify-api-key.client_id"/> <Interval ref="verifyapikey.verify-api-key.developer.timeInterval"/> <TimeUnit ref="verifyapikey.verify-api-key.developer.timeUnit"/> <Allow countRef="verifyapikey.verify-api-key.developer.limit"/> </Quota>
این مثال همچنین از متغیرهای جریان VerifyAPIKey برای ارجاع به ویژگیهای سفارشی تنظیمشده روی توسعهدهنده استفاده میکند.
شما میتوانید از هر متغیری برای تنظیم پارامترهای سیاست سهمیهبندی استفاده کنید. این متغیرها میتوانند از موارد زیر باشند:
- متغیرهای جریان
- ویژگیهای محصول API، برنامه یا توسعهدهنده
- نقشه ارزش کلیدی (KVM)
- یک هدر، پارامتر پرس و جو، پارامتر فرم و غیره
برای هر پروکسی API، میتوانید یک سیاست سهمیهبندی اضافه کنید که یا به متغیری مشابه با تمام سیاستهای سهمیهبندی دیگر در تمام پروکسیهای دیگر اشاره کند، یا سیاست سهمیهبندی میتواند به متغیرهای منحصر به فرد برای آن سیاست و پروکسی اشاره کند.
زمان شروع
<Quota name="QuotaPolicy" type="calendar"> <StartTime>2017-02-18 10:30:00</StartTime> <Interval>5</Interval> <TimeUnit>hour</TimeUnit> <Allow count="99"/> </Quota>
برای یک Quota با type تنظیم شده روی calendar ، باید یک مقدار <StartTime> صریح تعریف کنید. مقدار زمان، زمان GMT است، نه زمان محلی. اگر برای یک policy از نوع calendar مقدار <StartTime> ارائه ندهید، Edge خطا میدهد.
شمارنده سهمیه برای هر برنامه بر اساس مقادیر <StartTime> ، <Interval> و <TimeUnit> بهروزرسانی میشود. برای این مثال، سهمیه در ساعت ۱۰:۳۰ صبح به وقت گرینویچ در ۱۸ فوریه ۲۰۱۷ شروع به شمارش میکند و هر ۵ ساعت بهروزرسانی میشود. بنابراین، بهروزرسانی بعدی در ساعت ۳:۳۰ بعد از ظهر به وقت گرینویچ در ۱۸ فوریه ۲۰۱۷ خواهد بود.
شمارنده دسترسی
<Quota name="QuotaPolicy"> <Interval>5</Interval> <TimeUnit>hour</TimeUnit> <Allow count="99"/> </Quota>
یک پروکسی API به متغیرهای جریان تعیینشده توسط سیاست سهمیه دسترسی دارد. شما میتوانید به این متغیرهای جریان در پروکسی API دسترسی داشته باشید تا پردازش شرطی انجام دهید، سیاست را هنگام نزدیک شدن به حد سهمیه نظارت کنید، شمارنده سهمیه فعلی را به یک برنامه برگردانید یا به دلایل دیگر.
از آنجا که دسترسی به متغیرهای جریان برای این سیاست بر اساس ویژگی name سیاستها است، برای سیاست فوق با نام QuotaPolicy به متغیرهای جریان آن به شکل زیر دسترسی پیدا میکنید:
-
ratelimit.QuotaPolicy.allowed.count: تعداد مجاز. -
ratelimit.QuotaPolicy.used.count: مقدار شمارنده فعلی. -
ratelimit.QuotaPolicy.expiry.time: زمان UTC زمانی که شمارنده ریست میشود.
متغیرهای جریان بسیار دیگری نیز وجود دارند که میتوانید به آنها دسترسی داشته باشید، همانطور که در زیر توضیح داده شده است.
برای مثال، میتوانید از سیاست AssignMessage زیر برای بازگرداندن مقادیر متغیرهای Quota flow به عنوان هدرهای پاسخ استفاده کنید:
<AssignMessage async="false" continueOnError="false" enabled="true" name="ReturnQuotaVars"> <AssignTo createNew="false" type="response"/> <Set> <Headers> <Header name="QuotaLimit">{ratelimit.QuotaPolicy.allowed.count}</Header> <Header name="QuotaUsed">{ratelimit.QuotaPolicy.used.count}</Header> <Header name="QuotaResetUTC">{ratelimit.QuotaPolicy.expiry.time}</Header> </Headers> </Set> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> </AssignMessage>
درخواست اول
<Quota name="MyQuota"> <Interval>1</Interval> <TimeUnit>hour</TimeUnit> <Allow count="10000"/> </Quota>
از این نمونه کد برای اعمال سهمیه ۱۰،۰۰۰ تماس در هر ساعت استفاده کنید. این خطمشی، شمارنده سهمیه را در ابتدای هر ساعت مجدداً تنظیم میکند. اگر شمارنده قبل از پایان ساعت به سهمیه ۱۰،۰۰۰ تماس برسد، تماسهای فراتر از ۱۰،۰۰۰ رد میشوند.
برای مثال، اگر شمارنده از 2017-07-08 07:00:00 شروع شود، در ساعت 2017-07-08 08:00:00 (1 ساعت از زمان شروع) به 0 بازنشانی میشود. اگر اولین پیام در 2017-07-08 07:35:28 دریافت شود و تعداد پیامها قبل از 2017-07-08 08:00:00 به 10000 برسد، تماسهای فراتر از آن تعداد تا زمانی که شمارش در ابتدای ساعت بازنشانی شود، رد میشوند.
زمان بازنشانی شمارنده بر اساس ترکیب <Interval> و <TimeUnit> است. برای مثال، اگر <Interval> برای <TimeUnit> ساعت روی ۱۲ تنظیم کنید، شمارنده هر دوازده ساعت بازنشانی میشود. میتوانید <TimeUnit> روی دقیقه، ساعت، روز، هفته یا ماه تنظیم کنید.
شما میتوانید این سیاست را در چندین جای پروکسی API خود ارجاع دهید. برای مثال، میتوانید آن را روی Proxy PreFlow قرار دهید تا در هر درخواست اجرا شود. یا میتوانید آن را روی چندین جریان در پروکسی API قرار دهید. اگر از این سیاست در چندین جای پروکسی استفاده کنید، یک شمارنده واحد را حفظ میکند که توسط همه نمونههای این سیاست بهروزرسانی میشود.
به عنوان یک روش جایگزین، میتوانید چندین سیاست سهمیهبندی را در پروکسی API خود تعریف کنید. هر سیاست سهمیهبندی، بر اساس ویژگی name سیاست، شمارنده مخصوص به خود را حفظ میکند.
شناسه را تنظیم کنید
<Quota name="QuotaPolicy" type="calendar"> <Identifier ref="request.header.clientId"/> <StartTime>2017-02-18 10:00:00</StartTime> <Interval>5</Interval> <TimeUnit>hour</TimeUnit> <Allow count="99"/> </Quota>
به طور پیشفرض، یک سیاست سهمیهبندی، صرف نظر از مبدا درخواست، یک شمارنده واحد برای پروکسی API تعریف میکند. به طور جایگزین، میتوانید از ویژگی <Identifier> به همراه یک سیاست سهمیهبندی برای حفظ شمارندههای جداگانه بر اساس مقدار ویژگی <Identifier> استفاده کنید.
برای مثال، از تگ <Identifier> برای تعریف شمارندههای جداگانه برای هر شناسه کلاینت استفاده کنید. در صورت درخواست به پروکسی شما، برنامه کلاینت یک هدر حاوی clientID ارسال میکند، همانطور که در مثال بالا نشان داده شده است.
شما میتوانید هر متغیر جریانی را به ویژگی <Identifier> مشخص کنید. برای مثال، میتوانید مشخص کنید که یک پارامتر پرسوجو به نام id حاوی شناسه منحصر به فرد باشد:
<Identifier ref="request.queryparam.id"/>
اگر از سیاست VerifyAPIKey برای اعتبارسنجی کلید API یا از سیاستهای OAuthV2 با توکنهای OAuth استفاده میکنید، میتوانید از اطلاعات موجود در کلید یا توکن API برای تعریف شمارندههای جداگانه برای همان سیاست Quota استفاده کنید. برای مثال، تگ <Identifier> زیر از متغیر جریان client_id از یک سیاست VerifyAPIKey به نام verify-api-key استفاده میکند:
<Identifier ref="verifyapikey.verify-api-key.client_id"></Identifier>
اکنون هر مقدار منحصر به فرد client_id شمارنده مخصوص به خود را در سیاست سهمیهبندی تعریف میکند.
کلاس
<Quota name="QuotaPolicy">
<Interval>1</Interval>
<TimeUnit>day</TimeUnit>
<Allow>
<Class ref="request.header.developer_segment">
<Allow class="platinum" count="10000"/>
<Allow class="silver" count="1000" />
</Class>
</Allow>
</Quota>شما میتوانید محدودیتهای سهمیه را به صورت پویا با استفاده از شمارش سهمیه مبتنی بر کلاس تنظیم کنید. در این مثال، محدودیت سهمیه با مقدار هدر developer_segment که با هر درخواست ارسال میشود، تعیین میشود. این متغیر میتواند مقدار platinum یا silver داشته باشد. اگر هدر مقدار نامعتبری داشته باشد، این خطمشی خطای نقض سهمیه را برمیگرداند.
درباره سیاست سهمیهبندی
سهمیه، سهمیهای از پیامهای درخواست است که یک پروکسی API میتواند در یک بازه زمانی، مانند دقیقه، ساعت، روز، هفته یا ماه، مدیریت کند. این سیاست، شمارندههایی را نگهداری میکند که تعداد درخواستهای دریافتی توسط پروکسی API را محاسبه میکنند. این قابلیت، ارائهدهندگان API را قادر میسازد تا محدودیتهایی را بر تعداد فراخوانیهای API انجام شده توسط برنامهها در یک بازه زمانی اعمال کنند. با استفاده از سیاستهای سهمیه، میتوانید، به عنوان مثال، برنامهها را به ۱ درخواست در دقیقه یا به ۱۰۰۰۰ درخواست در ماه محدود کنید.
برای مثال، اگر سهمیه به صورت ۱۰،۰۰۰ پیام در ماه تعریف شود، محدود کردن سرعت پس از ۱۰،۰۰۰مین پیام شروع میشود. فرقی نمیکند که ۱۰،۰۰۰ پیام در روز اول یا آخرین روز آن دوره شمارش شده باشند؛ هیچ ناحیه درخواست اضافی مجاز نیست تا زمانی که شمارنده سهمیه به طور خودکار در پایان بازه زمانی مشخص شده بازنشانی شود، یا تا زمانی که سهمیه به طور صریح با استفاده از سیاست بازنشانی سهمیه بازنشانی شود.
نوعی از سهمیهبندی به نام SpikeArrest از افزایش ناگهانی (یا انفجار) ترافیک که میتواند ناشی از افزایش ناگهانی استفاده، کلاینتهای دارای باگ یا حملات مخرب باشد، جلوگیری میکند. برای اطلاعات بیشتر در مورد SpikeArrest، به سیاست Spike Arrest مراجعه کنید.
سهمیهها به پروکسیهای API منفرد اعمال میشوند و بین پروکسیهای API توزیع نمیشوند. برای مثال، اگر در یک محصول API سه پروکسی API داشته باشید، یک سهمیه واحد بین هر سه به اشتراک گذاشته نمیشود، حتی اگر هر سه از پیکربندی سیاست سهمیهبندی یکسانی استفاده کنند.
انواع سیاست سهمیهبندی
سیاست سهمیهبندی از چندین نوع سیاست مختلف پشتیبانی میکند: پیشفرض، calendar ، flexi و rollingwindow . هر نوع، زمان شروع و پایان شمارندهی سهمیهبندی را مشخص میکند، همانطور که در جدول زیر نشان داده شده است:
| واحد زمان | تنظیم مجدد پیشفرض (یا تهی) | تنظیم مجدد تقویم | تنظیم مجدد فلکسی |
|---|---|---|---|
| دقیقه | شروع دقیقه بعدی | یک دقیقه پس از <StartTime> | یک دقیقه پس از اولین درخواست |
| ساعت | حداکثر تا یک ساعت آینده | یک ساعت پس از <StartTime> | یک ساعت پس از اولین درخواست |
| روز | نیمه شب به وقت گرینویچ روز جاری | ۲۴ ساعت پس از <StartTime> | ۲۴ ساعت پس از اولین درخواست |
| هفته | نیمه شب به وقت گرینویچ، یکشنبه در پایان هفته | یک هفته پس از <StartTime> | یک هفته پس از اولین درخواست |
| ماه | نیمه شب به وقت گرینویچ آخرین روز ماه | یک ماه (۲۸ روز) پس از <StartTime> | یک ماه (۲۸ روز) پس از اولین درخواست |
برای type="calendar" ، باید مقدار <StartTime> را مشخص کنید.
جدول مقدار مربوط به نوع rollingwindow را فهرست نمیکند. سهمیهبندی پنجرهی غلتان با تنظیم اندازهی یک «پنجره» سهمیه، مانند یک پنجرهی یک ساعته یا یک روزه، کار میکند. وقتی درخواست جدیدی میرسد، این سیاست تعیین میکند که آیا سهمیه در «پنجره» زمانی گذشته فراتر رفته است یا خیر.
برای مثال، شما یک بازه زمانی دو ساعته تعریف میکنید که ۱۰۰۰ درخواست را مجاز میداند. یک درخواست جدید ساعت ۴:۴۵ بعد از ظهر میرسد. این سیاست تعداد سهمیه را برای بازه زمانی دو ساعت گذشته محاسبه میکند، به این معنی که تعداد درخواستها از ساعت ۲:۴۵ بعد از ظهر به بعد. اگر محدودیت سهمیه در آن بازه زمانی دو ساعته تجاوز نکرده باشد، درخواست مجاز است.
یک دقیقه بعد، ساعت ۴:۴۶ بعد از ظهر، درخواست دیگری میرسد. اکنون این خطمشی تعداد سهمیه را از ساعت ۲:۴۶ بعد از ظهر محاسبه میکند تا مشخص شود که آیا از حد مجاز فراتر رفته است یا خیر.
برای نوع rollingwindow ، شمارنده هرگز بازنشانی نمیشود، بلکه در هر درخواست دوباره محاسبه میشود.
درک شمارندههای سهمیه
به طور پیشفرض، یک سیاست سهمیهبندی، صرف نظر از اینکه چند بار در یک پروکسی API به آن ارجاع میدهید، یک شمارنده واحد را نگهداری میکند. نام شمارنده سهمیهبندی بر اساس ویژگی name سیاست تعیین میشود.
برای مثال، شما یک سیاست سهمیهبندی با نام MyQuotaPolicy با محدودیت ۵ درخواست ایجاد میکنید و آن را روی چندین جریان (جریان A، B و C) در پروکسی API قرار میدهید. اگرچه در چندین جریان استفاده میشود، اما یک شمارنده واحد را حفظ میکند که توسط همه نمونههای این سیاست بهروزرسانی میشود:
- جریان A اجرا میشود -> MyQuotaPolicy اجرا میشود و شمارنده آن برابر با ۱ است.
- جریان B اجرا میشود -> MyQuotaPolicy اجرا میشود و شمارنده آن برابر با ۲ است.
- جریان A اجرا میشود -> MyQuotaPolicy اجرا میشود و شمارنده آن برابر با ۳ است.
- جریان C اجرا میشود -> MyQuotaPolicy اجرا میشود و شمارنده آن برابر با ۴ میشود.
- جریان A اجرا میشود -> MyQuotaPolicy اجرا میشود و شمارنده آن برابر با ۵ است.
درخواست بعدی به هر یک از سه جریان رد میشود زیرا شمارنده سهمیه به حد مجاز خود رسیده است.
استفاده از یک سیاست سهمیهبندی یکسان در بیش از یک مکان در جریان پروکسی API، که میتواند ناخواسته باعث شود سهمیهبندی سریعتر از آنچه انتظار دارید تمام شود، یک ضدالگو است که در کتاب ضدالگوهای Apigee Edge شرح داده شده است.
به عنوان یک روش جایگزین، میتوانید چندین سیاست سهمیهبندی را در پروکسی API خود تعریف کنید و در هر جریان از یک سیاست متفاوت استفاده کنید. هر سیاست سهمیهبندی، بر اساس ویژگی name سیاست، شمارنده مخصوص به خود را حفظ میکند.
یا، از عناصر <Class> یا <Identifier> در سیاست Quota برای تعریف چندین شمارنده منحصر به فرد در یک سیاست واحد استفاده کنید. با استفاده از این عناصر، یک سیاست واحد میتواند شمارندههای مختلفی را بر اساس برنامهای که درخواست را انجام میدهد، توسعهدهنده برنامهای که درخواست را انجام میدهد، شناسه کلاینت یا شناسه کلاینت دیگر و موارد دیگر، حفظ کند. برای اطلاعات بیشتر در مورد استفاده از عناصر <Class> یا <Identifier> به مثالهای بالا مراجعه کنید.
نمادگذاری زمان
تمام زمانهای سهمیهبندی بر اساس منطقه زمانی هماهنگ جهانی (UTC) تنظیم شدهاند.
نمادگذاری زمان سهمیهبندی از نمادگذاری تاریخ استاندارد بینالمللی تعریفشده در استاندارد بینالمللی ISO 8601 پیروی میکند.
تاریخها به صورت سال، ماه و روز و با فرمت زیر تعریف میشوند: YYYY-MM-DD . برای مثال، 2015-02-04 نشان دهنده ۴ فوریه ۲۰۱۵ است.
زمان روز به صورت ساعت، دقیقه و ثانیه با فرمت زیر تعریف میشود: hours:minutes:seconds . برای مثال، 23:59:59 نشاندهندهی زمانی است که یک ثانیه قبل از نیمهشب است.
توجه داشته باشید که دو نمادگذاری، 00:00:00 و 24:00:00 ، برای تمایز دو نیمهشب مرتبط با یک تاریخ در دسترس هستند. بنابراین، تاریخ و زمان 2015-02-04 24:00:00 با تاریخ و زمان 2015-02-05 00:00:00 یکسان است. نمادگذاری دوم معمولاً ترجیح داده میشود.
دریافت تنظیمات سهمیه از پیکربندی محصول API
شما میتوانید محدودیتهای سهمیه را در پیکربندیهای محصول API تنظیم کنید. این محدودیتها به طور خودکار سهمیه را اعمال نمیکنند. در عوض، میتوانید تنظیمات سهمیه محصول را در یک سیاست سهمیهبندی ارجاع دهید. در اینجا برخی از مزایای تعیین سهمیه روی محصول برای ارجاع به سیاستهای سهمیهبندی آورده شده است:
- سیاستهای سهمیهبندی میتوانند از یک تنظیم یکسان در تمام پروکسیهای API در محصول API استفاده کنند.
- شما میتوانید در زمان اجرا، تنظیمات سهمیهبندی را روی یک محصول API تغییر دهید، و سیاستهای سهمیهبندی که به طور خودکار به مقدار اشاره میکنند، مقادیر سهمیهبندی بهروزرسانیشدهای دارند.
برای اطلاعات بیشتر در مورد استفاده از تنظیمات سهمیه از یک محصول API، به مثال "سهمیه پویا" در بالا مراجعه کنید .
برای اطلاعات بیشتر در مورد پیکربندی محصولات API با محدودیتهای سهمیه، به بخش ایجاد محصولات API مراجعه کنید.
مرجع عنصر
در ادامه عناصر و ویژگیهایی که میتوانید در این خطمشی پیکربندی کنید، آمده است. توجه داشته باشید که برخی از ترکیبات عناصر متقابلاً منحصر به فرد هستند یا مورد نیاز نیستند. برای کاربرد خاص، به نمونهها مراجعه کنید. متغیرهای verifyapikey.VerifyAPIKey.apiproduct.* زیر به طور پیشفرض در دسترس هستند، زمانی که از یک خطمشی Verify API Key به نام "VerifyAPIKey" برای بررسی کلید API برنامه در درخواست استفاده میشود. مقادیر متغیر از تنظیمات سهمیه در محصول API که کلید با آن مرتبط است، همانطور که در "دریافت تنظیمات سهمیه از پیکربندی محصول API" توضیح داده شده است، گرفته میشوند.
<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar"> <DisplayName>Quota 3</DisplayName> <Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/> <Allow> <Class ref="request.queryparam.time_variable"> <Allow class="peak_time" count="5000"/> <Allow class="off_peak_time" count="1000"/> </Class> </Allow> <Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval> <TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit> <StartTime>2017-7-16 12:00:00</StartTime> <Distributed>false</Distributed> <Synchronous>false</ Synchronous> <AsynchronousConfiguration> <SyncIntervalInSeconds>20</ SyncIntervalInSeconds> <SyncMessageCount>5</ SyncMessageCount> </AsynchronousConfiguration> <Identifier/> <MessageWeight/> </Quota>
ویژگیهای <Quota>
<Quota async="false" continueOnError="false" enabled="true" name="Quota-3" type="calendar">
ویژگیهای زیر مختص این سیاست هستند.
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| نوع | برای تعیین زمان و نحوه بررسی میزان استفاده از سهمیه توسط شمارنده سهمیه استفاده میشود. برای اطلاعات بیشتر به انواع سیاستهای سهمیه مراجعه کنید. اگر مقداری مقادیر معتبر عبارتند از:
| تقویم | اختیاری |
جدول زیر ویژگی هایی را توصیف می کند که برای همه عناصر اصلی خط مشی مشترک هستند:
| صفت | توضیحات | پیش فرض | حضور |
|---|---|---|---|
name | نام داخلی سیاست. مقدار مشخصه در صورت تمایل، از عنصر | N/A | مورد نیاز |
continueOnError | برای بازگرداندن خطا در صورت شکست خط مشی، روی روی | نادرست | اختیاری |
enabled | برای اجرای خط مشی روی برای خاموش کردن خط مشی، روی | درست است | اختیاری |
async | این ویژگی منسوخ شده است. | نادرست | منسوخ شده است |
عنصر <DisplayName>
علاوه بر ویژگی name برای برچسبگذاری خطمشی در ویرایشگر پروکسی رابط کاربری مدیریت با نامی متفاوت و به زبان طبیعی، از آن استفاده کنید.
<DisplayName>Policy Display Name</DisplayName>
| پیش فرض | N/A اگر این عنصر را حذف کنید، از مقدار ویژگی |
|---|---|
| حضور | اختیاری |
| تایپ کنید | رشته |
عنصر <مجاز>
محدودیت تعداد برای سهمیه را مشخص میکند. اگر شمارندهی سیاست به این مقدار محدود برسد، فراخوانیهای بعدی تا زمان تنظیم مجدد شمارنده رد میشوند.
در زیر سه روش برای تنظیم عنصر <Allow> نشان داده شده است:
<Allow count="2000"/>
<Allow countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
<Allow count="2000" countRef="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.limit"/>
اگر هم count و هم countRef را مشخص کنید، countRef اولویت پیدا میکند. اگر countRef در زمان اجرا حل نشود، از مقدار count استفاده میشود.
| پیشفرض: | ناموجود |
| حضور: | اختیاری |
| نوع: | عدد صحیح |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| بشمار | برای تعیین تعداد پیام برای سهمیه استفاده کنید. برای مثال، مقدار ویژگی | ۲۰۰۰ | اختیاری |
| تعداد مرجع | برای مشخص کردن یک متغیر جریان حاوی تعداد پیام برای سهمیه استفاده کنید. | هیچ کدام | اختیاری |
عنصر <Allow>/<Class>
عنصر <Class> به شما امکان میدهد مقدار عنصر <Allow> را بر اساس مقدار یک متغیر جریان، مشروط کنید. برای هر تگ فرزند <Allow> متفاوت از <Class> ، این سیاست یک شمارنده متفاوت را حفظ میکند.
برای استفاده از عنصر <Class> ، یک متغیر جریان را با استفاده از ویژگی ref به برچسب <Class> مشخص کنید. سپس Edge از مقدار متغیر جریان برای انتخاب یکی از برچسبهای فرزند <Allow> برای تعیین تعداد مجاز خطمشی استفاده میکند. Edge مقدار متغیر جریان را با ویژگی class برچسب <Allow> مطابقت میدهد، همانطور که در زیر نشان داده شده است:
<Allow> <Class ref="request.queryparam.time_variable"> <Allow class="peak_time" count="5000"/> <Allow class="off_peak_time" count="1000"/> </Class> </Allow>
در این مثال، شمارنده سهمیه فعلی توسط مقدار پارامتر query مربوط به time_variable که با هر درخواست ارسال میشود، تعیین میشود. آن متغیر میتواند مقدار peak_time یا off_peak_time داشته باشد. اگر پارامتر query حاوی مقدار نامعتبری باشد، این خطمشی خطای نقض سهمیه را برمیگرداند.
| پیشفرض: | ناموجود |
| حضور: | اختیاری |
| نوع: | ناموجود |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| مرجع | برای مشخص کردن یک متغیر جریان حاوی کلاس quota برای یک quota استفاده کنید. | هیچ کدام | مورد نیاز |
عنصر <Allow>/<Class>/<Allow>
عنصر <Allow> محدودیت شمارنده سهمیه تعریف شده توسط عنصر <Class> را مشخص میکند. برای هر برچسب فرزند <Allow> متفاوت از <Class> ، این سیاست یک شمارنده متفاوت را حفظ میکند.
برای مثال:
<Allow> <Class ref="request.queryparam.time_variable"> <Allow class="peak_time" count="5000"/> <Allow class="off_peak_time" count="1000"/> </Class> </Allow>
در این مثال، سیاست سهمیهبندی دو شمارنده سهمیهبندی به نامهای peak_time و off_peak_time را نگهداری میکند.
| پیشفرض: | ناموجود |
| حضور: | اختیاری |
| نوع: | ناموجود |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| کلاس | نام شمارنده سهمیه را تعریف میکند. | هیچ کدام | مورد نیاز |
| بشمار | محدودیت سهمیه برای شمارنده را مشخص میکند. | هیچ کدام | مورد نیاز |
عنصر <فاصله>
برای مشخص کردن یک عدد صحیح (مثلاً ۱، ۲، ۵، ۶۰ و غیره) که با TimeUnit که مشخص میکنید (دقیقه، ساعت، روز، هفته یا ماه) جفت میشود تا یک دوره زمانی را تعیین کند که در طی آن Edge سهمیه استفاده را محاسبه میکند، استفاده کنید.
برای مثال، یک Interval 24 با TimeUnit hour به این معنی است که سهمیه در طول ۲۴ ساعت محاسبه خواهد شد.
<Interval ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.interval">1</Interval>
| پیشفرض: | هیچ کدام |
| حضور: | مورد نیاز |
| نوع: | عدد صحیح |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| مرجع | برای مشخص کردن یک متغیر جریان حاوی بازه برای سهمیه استفاده میشود. | هیچ کدام | اختیاری |
عنصر <TimeUnit>
برای مشخص کردن واحد زمانی مربوط به سهمیه استفاده کنید.
برای مثال، یک Interval 24 با TimeUnit hour به این معنی است که سهمیه در طول ۲۴ ساعت محاسبه خواهد شد.
<TimeUnit ref="verifyapikey.VerifyAPIKey.apiproduct.developer.quota.timeunit">month</TimeUnit>
| پیشفرض: | هیچ کدام |
| حضور: | مورد نیاز |
| نوع: | رشته. از بین |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| مرجع | برای مشخص کردن یک متغیر جریان حاوی واحد زمانی برای سهمیه استفاده میشود. ref بر یک مقدار بازه صریح اولویت دارد. اگر ref در زمان اجرا حل نشود، از مقدار آن استفاده میشود. | هیچ کدام | اختیاری |
عنصر <زمان شروع>
وقتی type روی calendar, تاریخ و زمانی را مشخص میکند که شمارنده سهمیه شروع به شمارش میکند، صرف نظر از اینکه آیا درخواستی از هر برنامهای دریافت شده است یا خیر.
برای مثال:
<StartTime>2017-7-16 12:00:00</StartTime>
| پیشفرض: | هیچ کدام |
| حضور: | وقتی type روی calendar تنظیم شده باشد، الزامی است. |
| نوع: | رشتهای با فرمت تاریخ و زمان ISO 8601 . |
عنصر <توزیعشده>
نصب Edge میتواند از یک یا چند پردازنده پیام برای پردازش درخواستها استفاده کند. این عنصر را روی true تنظیم کنید تا مشخص شود که این سیاست باید یک شمارنده مرکزی را حفظ کند و به طور مداوم آن را در تمام پردازندههای پیام همگامسازی کند. پردازندههای پیام میتوانند در مناطق و/یا مناطق مختلف در دسترس باشند.
اگر از مقدار پیشفرض false استفاده کنید، ممکن است از سهمیه خود تجاوز کنید زیرا تعداد برای هر پردازنده پیام به اشتراک گذاشته نمیشود:
<Distributed>true</Distributed>
برای تضمین همگامسازی و بهروزرسانی شمارندهها در هر درخواست، <Distributed> و <Synchronous> را روی true تنظیم کنید:
<Distributed>true</Distributed> <Synchronous>true</Synchronous>
| پیشفرض: | نادرست |
| حضور: | اختیاری |
| نوع: | بولی |
عنصر <همزمان>
برای بهروزرسانی همزمان شمارنده سهمیه توزیعشده، روی true تنظیم کنید. این بدان معناست که بهروزرسانی شمارنده همزمان با بررسی سهمیه در درخواستی به API انجام میشود. اگر ضروری است که هیچ فراخوانی API روی سهمیه مجاز نباشد، روی true تنظیم کنید.
برای بهروزرسانی غیرهمزمان شمارنده سهمیه، آن را روی false تنظیم کنید. این بدان معناست که بسته به زمان بهروزرسانی غیرهمزمان شمارنده سهمیه در مخزن مرکزی، ممکن است برخی از فراخوانیهای API که از سهمیه تجاوز میکنند، انجام شوند. با این حال، با تأثیرات بالقوه عملکرد مرتبط با بهروزرسانیهای همزمان مواجه نخواهید شد.
فاصله زمانی پیشفرض بهروزرسانی ناهمزمان ۱۰ ثانیه است. از عنصر AsynchronousConfiguration برای پیکربندی این رفتار ناهمزمان استفاده کنید.
<Synchronous>false</Synchronous>
| پیشفرض: | نادرست |
| حضور: | اختیاری |
| نوع: | بولی |
عنصر <AsynchronousConfiguration>
فاصله همگامسازی بین شمارندههای سهمیه توزیعشده را زمانی که عنصر پیکربندی سیاست <Synchronous> یا وجود ندارد یا وجود دارد و روی false تنظیم شده است، پیکربندی میکند.
شما میتوانید با استفاده از عناصر فرزند SyncIntervalInSeconds یا SyncMessageCount ، همگامسازی را پس از یک دوره زمانی یا پس از شمارش پیام انجام دهید. این عناصر متقابلاً منحصر به فرد هستند. برای مثال،
<AsynchronousConfiguration> <SyncIntervalInSeconds>20</SyncIntervalInSeconds> </AsynchronousConfiguration>
یا
<AsynchronousConfiguration> <SyncMessageCount>5</SyncMessageCount> </AsynchronousConfiguration>
| پیشفرض: | SyncIntervalInSeconds = 10 ثانیه |
| حضور: | اختیاری؛ وقتی <Synchronous> روی true تنظیم شده باشد، نادیده گرفته میشود. |
| نوع: | مرکب |
عنصر <AsynchronousConfiguration>/<SyncIntervalInSeconds>
از این برای لغو رفتار پیشفرض که در آن بهروزرسانیهای ناهمزمان پس از یک فاصله زمانی 10 ثانیهای انجام میشوند، استفاده کنید.
<AsynchronousConfiguration> <SyncIntervalInSeconds>20</SyncIntervalInSeconds> </AsynchronousConfiguration>
فاصله همگامسازی باید ≥ 10 ثانیه باشد، همانطور که در مبحث محدودیتها توضیح داده شده است.
| پیشفرض: | ۱۰ |
| حضور: | اختیاری |
| نوع: | عدد صحیح |
عنصر <AsynchronousConfiguration>/<SyncMessageCount>
تعداد درخواستها در تمام پردازندههای پیام Apigee بین بهروزرسانیهای سهمیه را مشخص میکند.
<AsynchronousConfiguration> <SyncMessageCount>5</SyncMessageCount> </AsynchronousConfiguration>
این مثال مشخص میکند که تعداد سهمیه هر 5 درخواست در هر پردازنده پیام Apigee Edge بهروزرسانی میشود.
| پیشفرض: | ناموجود |
| حضور: | اختیاری |
| نوع: | عدد صحیح |
عنصر <شناسه>
از عنصر <Identifier> برای پیکربندی سیاست ایجاد شمارندههای منحصر به فرد بر اساس یک متغیر جریان استفاده کنید.
اگر از این عنصر استفاده نکنید، این سیاست از یک شمارنده واحد استفاده میکند که بر اساس سهمیه اعمال میشود.
این عنصر همچنین در پست زیر از انجمن Apigee با عنوان «شناسه سهمیه در سیاستهای مختلف» مورد بحث قرار گرفته است.
<Identifier ref="verifyapikey.verify-api-key.client_id"/>
| پیشفرض: | ناموجود |
| حضور: | اختیاری |
| نوع: | رشته |
ویژگیها
| ویژگی | توضیحات | پیشفرض | حضور |
|---|---|---|---|
| مرجع | یک متغیر جریان را مشخص میکند که شمارنده مورد استفاده برای درخواست را مشخص میکند. این شناسه میتواند یک هدر HTTP، پارامتر پرسوجو، پارامتر فرم یا محتوای پیام باشد که برای هر برنامه، کاربر برنامه، توسعهدهنده برنامه، محصول API یا سایر ویژگیها منحصر به فرد است. در برخی شرایط، تنظیمات سهمیه باید در جایی که هیچ | ناموجود | اختیاری |
عنصر <وزن پیام>
برای تعیین وزن اختصاص داده شده به هر پیام استفاده کنید. از وزن پیام برای افزایش تأثیر پیامهای درخواستی که، برای مثال، منابع محاسباتی بیشتری نسبت به سایرین مصرف میکنند، استفاده کنید.
برای مثال، میخواهید پیامهای POST را دو برابر «سنگین» یا گرانتر از پیامهای GET بشمارید. بنابراین، MessageWeight را برای POST روی ۲ و برای GET روی ۱ تنظیم میکنید. حتی میتوانید MessageWeight را روی ۰ تنظیم کنید تا درخواست روی شمارنده تأثیر نگذارد. در این مثال، اگر سهمیه ۱۰ پیام در دقیقه باشد و MessageWeight برای درخواستهای POST برابر 2 باشد، سهمیه اجازه ۵ درخواست POST را در هر فاصله ۱۰ دقیقهای میدهد. هر درخواست اضافی، POST یا GET، قبل از تنظیم مجدد شمارنده رد میشود.
مقداری که نشاندهندهی MessageWeight است باید توسط یک متغیر جریان مشخص شود و میتواند از هدرهای HTTP، پارامترهای پرسوجو، یک درخواست XML یا JSON یا هر متغیر جریان دیگری استخراج شود. برای مثال، شما آن را در یک هدر به نام weight تنظیم میکنید:
<MessageWeight ref="message_weight"/>
| پیشفرض: | ناموجود |
| حضور: | اختیاری |
| نوع: | عدد صحیح |
متغیرهای جریان
متغیرهای جریان از پیش تعریف شده زیر هنگام اجرای سیاست سهمیه بندی به طور خودکار پر می شوند. برای اطلاعات بیشتر در مورد متغیرهای جریان، به مرجع متغیرها مراجعه کنید.
| متغیرها | نوع | مجوزها | توضیحات |
|---|---|---|---|
| ratelimit.{policy_name}.allowed.count | بلند | فقط خواندنی | تعداد سهمیه مجاز را برمیگرداند |
| ratelimit.{policy_name}.used.count | بلند | فقط خواندنی | سهمیه فعلی استفاده شده در یک بازه سهمیه را برمیگرداند. |
| تعداد در دسترس.{ratelimit.{policy_name}} | بلند | فقط خواندنی | تعداد سهمیه موجود در بازه سهمیه را برمیگرداند. |
| ratelimit.{policy_name}.exceed.count | بلند | فقط خواندنی | پس از عبور از سهمیه، عدد ۱ را برمیگرداند. |
| ratelimit.{policy_name}.total.exceed.count | بلند | فقط خواندنی | پس از عبور از سهمیه، عدد ۱ را برمیگرداند. |
| محدودیت نرخ {policy_name}.expiry.time | بلند | فقط خواندنی | زمان UTC را بر حسب میلیثانیه برمیگرداند که تعیین میکند سهمیه چه زمانی منقضی میشود و بازه سهمیه جدید شروع میشود. وقتی نوع سیاست سهمیهبندی |
| شناسهی {policy_name} با محدودیت نرخ | رشته | فقط خواندنی | مرجع شناسه (کلاینت) متصل به سیاست را برمیگرداند. |
| کلاس ratelimit.{policy_name} | رشته | فقط خواندنی | کلاس مرتبط با شناسه کلاینت را برمیگرداند. |
| {policy_name}.class.allowed.count میزان محدودیت تعداد | بلند | فقط خواندنی | تعداد سهمیه مجاز تعریف شده در کلاس را برمیگرداند. |
| ratelimit.{policy_name}.class.used.count | بلند | فقط خواندنی | سهمیه استفاده شده در یک کلاس را برمیگرداند. |
| تعداد.کلاس.موجود.حد_نرخ{policy_name} | بلند | فقط خواندنی | تعداد سهمیههای موجود در کلاس را برمیگرداند. |
| ratelimit.{policy_name}.class.exceed.count | بلند | فقط خواندنی | تعداد درخواستهایی را که از حد مجاز کلاس در بازه سهمیه فعلی تجاوز میکنند، برمیگرداند. |
| ratelimit.{policy_name}.class.total.exceed.count | بلند | فقط خواندنی | تعداد کل درخواستهایی را که از حد مجاز کلاس در تمام بازههای سهمیه تجاوز میکنند، برمیگرداند، بنابراین مجموع class.exceed.count برای تمام بازههای سهمیه است. |
| محدودیت نرخ.{policy_name}.شکست خورد | بولی | فقط خواندنی | نشان میدهد که آیا سیاست شکست خورده است یا خیر (درست یا نادرست). |
مرجع خطا
This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
| Fault code | HTTP status | Cause | Fix |
|---|---|---|---|
policies.ratelimit.FailedToResolveQuotaIntervalReference |
500 | Occurs if the <Interval> element is not defined within the Quota policy. This element
is mandatory and used to specify the interval of time applicable to the quota. The time interval
can be minutes, hours, days, weeks, or months as defined with the <TimeUnit> element. |
build |
policies.ratelimit.FailedToResolveQuotaIntervalTimeUnitReference |
500 | Occurs if the <TimeUnit> element is not defined within the Quota policy. This element
is mandatory and used to specify the unit of time applicable to the quota. The time interval
can be in minutes, hours, days, weeks, or months. |
build |
policies.ratelimit.InvalidMessageWeight |
500 | Occurs if the value of the <MessageWeight> element specified through a flow variable
is invalid (a non-integer value). |
build |
policies.ratelimit.QuotaViolation |
500 | The quota limit was exceeded. | N/A |
Deployment errors
| Error name | Cause | Fix |
|---|---|---|
InvalidQuotaInterval |
If the quota interval specified in the <Interval> element is not
an integer, then the deployment of the API proxy fails. For example, if the quota interval
specified is 0.1 in the <Interval> element, then the deployment of the
API proxy fails.
|
build |
InvalidQuotaTimeUnit |
If the time unit specified in the <TimeUnit> element is unsupported,
then the deployment of the API proxy fails. The supported time units are minute,
hour, day, week, and month.
|
build |
InvalidQuotaType |
If the type of the quota specified by the type attribute in the <Quota>
element is invalid, then the deployment of the API proxy fails. The
supported quota types are default, calendar, flexi, and rollingwindow.
|
build |
InvalidStartTime |
If the format of the time specified in the <StartTime> element is
invalid, then the deployment of the API proxy fails. The valid format is yyyy-MM-dd HH:mm:ss,
which is the ISO 8601 date and time format. For
example, if the time specified in the <StartTime> element is
7-16-2017 12:00:00 then the deployment of the API proxy fails.
|
build |
StartTimeNotSupported |
If the <StartTime> element is specified whose quota type is not
calendar type, then the deployment of the API proxy fails. The <StartTime> element is
supported only for the calendar quota type. For example, if the type attribute is set
to flexi or rolling window in the <Quota> element, then the
deployment of the API proxy fails.
|
build |
InvalidTimeUnitForDistributedQuota |
If the <Distributed> element is set to true and the <TimeUnit> element is set to
second then the deployment of the API proxy fails. The timeunit second is invalid for
a distributed quota. |
build |
InvalidSynchronizeIntervalForAsyncConfiguration |
If the value specified for the <SyncIntervalInSeconds> element within the
<AsynchronousConfiguration> element in a Quota policy is less than zero, then the
deployment of the API proxy fails. |
build |
InvalidAsynchronizeConfigurationForSynchronousQuota |
If the value of the <AsynchronousConfiguration> element is set to true in a Quota policy, which also
has asynchronous configuration defined using the <AsynchronousConfiguration> element, then
the deployment of the API proxy fails. |
build |
Fault variables
These variables are set when this policy triggers an error. For more information, see What you need to know about policy errors.
| Variables | Where | Example |
|---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "QuotaViolation" |
ratelimit.policy_name.failed |
policy_name is the user-specified name of the policy that threw the fault. | ratelimit.QT-QuotaPolicy.failed = true |
Example error response
{ "fault":{ "detail":{ "errorcode":"policies.ratelimit.QuotaViolation" }, "faultstring":"Rate limit quota violation. Quota limit exceeded. Identifier : _default" } }
Example fault rule
<FaultRules>
<FaultRule name="Quota Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "QuotaViolation") </Condition>
</Step>
<Condition>ratelimit.Quota-1.failed=true</Condition>
</FaultRule>
</FaultRules>طرحوارهها
مباحث مرتبط
مقایسه سیاستهای سهمیهبندی، توقف ناگهانی و محدودیت نرخ همزمان