הגבלת קצב לפקודות רגישות
chatops.ratelimit מרכז את שכבת ההגנה הקלה נגד ספאם לפקודות רגישות
במערכת ה-ChatOps (למשל /deploy, /restart, /secrets). במקום
ליישם Redis/DB עבור כל פקודה, אנחנו שומרים חותמת זמן אחרונה בזיכרון
ה-process ומוודאים שהמשתמש מחכה כמה שניות בין הרצות.
עקרונות מרכזיים
Cooldown דינמי – ברירת מחדל 5 שניות, ניתנת לשינוי בעזרת
SENSITIVE_COMMAND_COOLDOWN_SEC.Lock אסינכרוני – נעילת
asyncio.Lockמקיפה את המילון_last_call_tsכדי למנוע מרוצי קריאה.תגובה ידידותית – כאשר המשתמש חורג נקבל הודעת
⏳ אנא נסה שוב בעוד X שניותשמדעכנת כמה להמתין.Fail-open – אם קרתה חריגה ברמת הלימיטר, הפקודה תרוץ (עדיף על חסימה שגויה).
שימוש בדקורטור
הדרך הפשוטה להוסיף Rate Limit היא לעטוף את הפקודה ב-@limit_sensitive:
from chatops.ratelimit import limit_sensitive
@limit_sensitive("deploy-release")
async def handle_deploy(update, context):
await context.bot.send_message(
chat_id=update.effective_chat.id,
text="🚀 נשלח טריגר דיפלוי"
)
השם (deploy-release בדוגמה) משמש כטאג פנימי, כך שניתן להגדיר מגבלות נפרדות לכל פקודה גם אם הן חולקות את אותה פונקציה.
קונפיגורציה
משתנה |
תיאור |
|---|---|
|
זמן מינימלי בין שתי קריאות של אותו משתמש לאותה פקודה (ברירת מחדל 5). ערכים קטנים מ-1 מעוגלים ל-1. |
ניתן גם לשנות את ה-cooldown בזמן ריצה:
from chatops.ratelimit import sensitive_limiter
sensitive_limiter.cooldown_sec = 10 # העלאה זמנית בעת אירועי עומס
שילוב בבוט
עטפו רק פקודות שמשנות מצב (Deploy, Cleanup, Rotate). פקודות קריאה בלבד יכולות לרוץ ללא דקורטור.
הפעלת הלימיטר אינה מחליפה Rate Limit ברמת Telegram/Redis – היא שכבה משלימה שמונעת לחיצות כפולות.
כשחוסמים משתמש, ההודעה נשלחת דרך
update.message.reply_text; ודאו שהפקודה נרשמת כ-handler של הודעות ולא Inline Query.
Autodoc
Rate-limit utilities for sensitive ChatOps commands.
Cooldown (seconds) per user+command, defaults to 5 seconds
Configured via ENV SENSITIVE_COMMAND_COOLDOWN_SEC
Decorator: limit_sensitive(command_name)