حاسبة token bucket
محدد معدل token bucket هو النموذج المعياري خلف تقييد واجهات API وحصص البوابات والضغط العكسي لدى العميل.
شغّل الأداة مجانًا
تحتفظون بدلو من الرموز حتى سعة ثابتة، وتملأونه بمعدل ثابت مع الزمن، وتنفقون الرموز عند وصول طلب أو دفعة. تقبل حاسبة حد المعدل بأسلوب token bucket السعة ومعدل الملء بالرموز في الثانية وعدد الرموز الحالي والثواني المنقضية منذ آخر تحديث وعدد الرموز التي تحتاجها الدفعة التالية. تملأ الدلو مع سقف صارم عند السعة، وتقرر السماح أو الرفض، وتُبلغ عن الرموز المتبقية بعد القرار، وعند الرفض تحسب مدة الانتظار حتى تكفي الرموز—أو تُبيّن أن الطلب لا يمكن إرضاؤه أبدًا لأنه يتجاوز السعة أو أن الملء صفر. يشغّل نفس الوحدة النقية الحتمية الأداة المجانية في المتصفح ومسار API، فلا تختلف مراجعات التصميم وسكربتات اختبار الحمل ومحاكيات الإنتاج حول الحالات الحدّية مثل دلو ممتلئ أو ملء جزئي أو طلب أكبر من سقف الدفعة.
طريقة الاستخدام
أدخل القيم في النموذج أعلاه. تتحقق الأداة منها قبل الحساب ثم تعرض النتيجة في الصفحة نفسها.
راجع بياناتك
اتبع التسميات والوحدات الموضحة بجانب كل حقل. إذا كانت قيمة مفقودة أو خارج النطاق، توضح الصفحة الحقل الذي يحتاج إلى تصحيح.
أعد الحساب أو نفّذه آليًا
استخدم أداة الويب للفحوص الفردية، واستخدم الواجهة البرمجية عند دمج الإمكانية نفسها في سير عمل آلي.
حالات الاستخدام
احصل على النتيجة الآن
أدخل مجموعة من القيم وشاهد النتيجة من دون إعداد جدول بيانات أو برنامج نصي.
قارن السيناريوهات
غيّر قيمة واحدة في كل مرة وأعد الحساب لمعرفة ما الذي يؤثر في النتيجة.
أتمت العمل المتكرر
استخدم الواجهة البرمجية عندما تحتاج إلى تشغيل الحساب نفسه داخل منتجك أو سير عملك.
الأسئلة الشائعة
كيف تعمل حاسبة حد المعدل بأسلوب token bucket؟
تحسب tokens_available = min(capacity, tokens + elapsed × refill_rate)، وتسمح بالدفعة عندما تكون تلك القيمة على الأقل request_count، وتطرح عند السماح، وإلا تُرجع deficit وwait_seconds = deficit / refill_rate عندما يستطيع الملء تغطية التكلفة لاحقًا.
ما الوحدات المناسبة لـ refill_rate وelapsed؟
استخدموا نفس وحدة الزمن للاثنين: refill_rate بالرموز في الثانية وelapsed بالثواني. تحويل الاثنين إلى ميلي ثانية ينجح فقط مع الاتساق؛ وواجهة API لا تحوّل الوحدات نيابةً عنكم.
ماذا لو كان request_count أكبر من capacity؟
تُرفض الدفعة مع can_satisfy false وwait_seconds صفر. طلب واحد يحتاج أكثر مما يمكن للدلو أن يحمل لن يمر أبدًا حتى مع ملء كامل.
هل يمكن أن يكون tokens أكبر من capacity في الإدخال؟
نعم. تقبل الحاسبة قيمة tokens غير سالبة فوق capacity ولا تحدّها إلا بعد تطبيق ملء elapsed، بما يوافق تنفيذات شائعة تخزّن عدّادًا غير محدود حتى التحديث التالي.
كم تكلفة حاسبة token bucket؟
أداة المتصفح مجانية. طلبات API تستخدم رصيد KIT المدفوع مسبقًا بسعر $0.002 لكل مكالمة ناجحة؛ الإدخال غير الصالح لا يُحاسب.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/dev/token-bucket \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"capacity":10,"refill_rate":2,"tokens":5,"elapsed":1.5,"request_count":3}'const res = await fetch("https://api.kit.forhosting.com/dev/token-bucket", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"capacity": 10,
"refill_rate": 2,
"tokens": 5,
"elapsed": 1.5,
"request_count": 3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/token-bucket",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"capacity": 10,
"refill_rate": 2,
"tokens": 5,
"elapsed": 1.5,
"request_count": 3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/token-bucket", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"capacity":10,"refill_rate":2,"tokens":5,"elapsed":1.5,"request_count":3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"capacity":10,"refill_rate":2,"tokens":5,"elapsed":1.5,"request_count":3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/token-bucket", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"capacity": 10,
"refill_rate": 2,
"tokens": 5,
"elapsed": 1.5,
"request_count": 3
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.token_bucket",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |