یکی از مشکلهای رایج تو رباتهای تلگرام اینه که یه آپدیت چند بار پردازش میشه؛ مخصوصاً وقتی:
• سرور delay داره ⏳
• ngrok / proxy قطع و وصل میشه
• خودت retry برای requestهات گذاشتی
اینجاست که مفهوم Idempotency نجاتت میده؛ یعنی اجرای چندبارهٔ یه عملیات، اثر اضافهای نسبت به بار اول نداشته باشه. ✅
در ربات تلگرام، بهترین candidate برای Idempotency همون update_id هر پیام یا callback هست.
ایدهٔ اصلی:
1️⃣ هر
update_id رو فقط یه بار قبول کن.2️⃣ اگر دوباره همون
update_id رسید، بهجای دوباره انجام دادن کار (مثلاً برداشت از کیف پول کاربر)، فقط نتیجهٔ قبلی رو برگردون یا بیصدا ignore کن.یه پیادهسازی ساده با Python + Redis 🐍
import time
import redis
from flask import Flask, request
r = redis.Redis(host="localhost", port=6379, db=0)
app = Flask(__name__)
IDEMPOTENCY_TTL = 60 * 5 # 5 دقیقه
@app.post("/webhook")
def telegram_webhook():
update = request.get_json(force=True)
update_id = update.get("update_id")
if update_id is None:
return "ok" # ورودی نامعتبر، بیصدا رد میکنیم
cache_key = f"tg:update:{update_id}"
# اگر قبلاً پردازش شده، دوباره انجام نده
if r.exists(cache_key):
return "ok" # idempotent پاسخ
# قفل سبک برای این update
with r.lock(f"lock:{cache_key}", timeout=5):
if r.exists(cache_key):
return "ok"
handle_update(update)
# علامتگذاری بهعنوان پردازششده
r.setex(cache_key, IDEMPOTENCY_TTL, int(time.time()))
return "ok"
def handle_update(update: dict) -> None:
message = update.get("message", {})
text = message.get("text", "")
chat_id = message.get("chat", {}).get("id")
if text == "/start":
send_welcome(chat_id)
def send_welcome(chat_id: int) -> None:
# اینجا فراخوانی sendMessage به Bot API رو انجام بده
...
نکات مهم در عمل 🚀
• TTL مناسب بذار؛ معمولاً چند دقیقه برای
update_id ها کافیه.• تو عملیات حساس مثل پرداخت، حتماً Idempotency رو تا لایهٔ دیتابیس ادامه بده (مثلاً با unique index روی
update_id یا invoice_id).• اگر از getUpdates هم استفاده میکنی، باز همین منطق برای safety بیشتر مفیده.
• تو jobهای async یا queueهات (مثل Celery, RQ) هم
update_id یا یه idempotency key اختصاصی حمل کن.پیادهسازی درست Idempotency تو Webhook جلوی کلی باگ عجیبی مثل برداشت دوباره، ثبت تکراری سفارش و ارسال چندبارهٔ پیام رو میگیره و رباتت رو حسابی قابلاعتمادتر میکنه ✨
از همین امروز تو لایهٔ Webhook رباتت این الگو رو اضافه کن و ذهنت رو از ترس retryها خلاص کن. 😄
🔖 #TelegramBot #ربات #تلگرام #Idempotency #Telegram_Bot #Webhook #Python #Redis #Clean_Code #Robustness
👤 Developix
💎 Channel: @DevelopixRobot