در یک سیستم شبکه، یک Rate Limiter برای کنترل نرخ ترافیک ارسال شده توسط یک کلاینت یا یک سرویس استفاده میشود. در دنیای HTTP، یک Rate Limiter، تعداد درخواستهای مشتری مجاز به ارسال در یک دوره مشخص را محدود میکند. اگر تعداد درخواستهای API از آستانه تعیین شده توسط Rate Limiter بیشتر شود، همه request های اضافی مسدود میشوند.
به عنوان مثال :
- کاربر نمیتواند بیش از 2 پست در ثانیه بنویسد.
- شما میتوانید حداکثر 10 حساب در روز از یک آدرس IP ایجاد کنید.
- شما نمیتوانید بیش از 5 بار در هفته از یک دستگاه جوایز دریافت کنید.
- APIهای Google Docs دارای محدودیت پیشفرض زیر هستند
در این مقاله به بررسی سیستم Rate Limiter می پردازیم.
قبل از شروع طراحی، ابتدا به مزایای استفاده از یک API Rate Limiter نگاه میکنیم:
مزایای Rate Limiter
- جلوگیری از حملات DOS
- جلوگیری از حملات brute force
- جلوگیری از overloaded سرور ها
محل قرارگیری Rate Limiter
به طور مستقیم، شما می توانید یک Rate Limiter را در سمت کلاینت یا سمت سرور پیاده سازی کنید.
• پیاده سازی سمت کلاینت : به طور کلی، کلاینت مکان غیر قابل اعتمادی برای اعمال Rate Limiter است زیرا درخواست های مشتری می تواند به راحتی توسط عوامل مخرب جعل شود. علاوه بر این، ممکن است کنترلی بر اجرای مشتری نداشته باشیم.
• پیاده سازی سمت سرور. شکل زیر یک Rate Limiter را نشان می دهد که در سمت سرور قرار داده شده است
علاوه بر اجرای سمت کلاینت و سمت سرور، یک راه جایگزین نیز وجود دارد. به جای قرار دادن یکRate Limiter در سرورهای API، ما یک middleware Rate Limiter ایجاد می کنیم، که همانطور که در شکل زیر نشان داده شده است، درخواست ها را به API های شما throttlesمی کند.
اجازه دهید از یک مثال در شکل زیر استفاده کنیم تا نحوه عملکرد Rate limiter نرخ در این طرح را نشان دهیم. فرض کنید API ما اجازه 2 درخواست در ثانیه را می دهد و یک کلاینت در عرض یک ثانیه 3 درخواست را به سرور ارسال می کند. دو درخواست اول به سرورهای API هدایت می شوند. با این حال، Middleware Rate limiter ، درخواست سوم را throttles میدهد و کد وضعیت HTTP 429 را برمیگرداند. کد وضعیت پاسخ HTTP 429 نشان میدهد که کاربر درخواستهای زیادی ارسال کرده است.
میکروسرویس های ابری به طور گسترده ای محبوب شده اند و Rate Limiter معمولاً در یک مؤلفه به نام API Gateway پیاده سازی می شود. API Gateway یک سرویس کاملا مدیریت شده است که از Rate Limiter، SSL termination ، احراز هویت،IP whitelisting، سرویس دادن به محتوای ثابت و غیره پشتیبانی می کند. در حال حاضر، فقط باید بدانیم که API Gateway یک Middleware است که از Rate Limiter پشتیبانی می کند.
در حین طراحی یک Rate Limiter، یک سوال مهم که باید از خود بپرسیم این است: Rate Limiter باید در کجا باید پیاده سازی شود، در سمت سرور یا در یک gateway ؟ هیچ پاسخ مطلقی وجود ندارد. این به Stack technology فعلی، منابع مهندسی، اولویت ها، اهداف و غیره شرکت شما بستگی دارد.
در اینجا چند دستورالعمل کلی وجود دارد:
- Stack technology فعلی خود را ارزیابی کنید، مانند زبان برنامه نویسی، سرویس Cache، و غیره. مطمئن شوید که زبان برنامه نویسی فعلی شما برای اجرای Rate Limiter در سمت سرور کارآمد است.
- الگوریتم Rate Limiter را که متناسب با نیازهای کسب و کار شما است، شناسایی کنید. وقتی همه چیز را در سمت سرور پیاده سازی می کنید، کنترل کامل الگوریتم را در اختیار دارید. با این حال، اگر از Gateway شخص ثالث استفاده می کنید، ممکن است انتخاب شما محدود باشد.
- اگر قبلاً از معماری میکروسرویس استفاده کرده اید و یکAPI Gateway را برای انجام احراز هویت، IP whitelisting و غیره در طراحی گنجانده اید، می توانید یک Rate Limiter به API Gateway اضافه کنید.
- ایجاد سرویس Rate Limiter خود زمان می برد. اگر منابع مهندسی کافی برای اجرای یک Rate Limiterندارید، یک API Gateway تجاری گزینه بهتری است.
الگوریتم های Rate Limiter
Rate Limiter را می توان با استفاده از الگوریتم های مختلف پیاده سازی کرد و هر کدام مزایا و معایب مشخصی دارند. اگرچه این بخش بر روی الگوریتمها تمرکز نمیکند، درک آنها در سطح بالا به انتخاب الگوریتم یا ترکیبی از الگوریتمها متناسب با موارد استفاده ما کمک میکند. در اینجا لیستی از الگوریتم های محبوب آورده شده است:
- Token bucket
- Leaking bucket
- Fixed window counter
- Sliding window log
- Sliding window counter