Ein neuer, Laravel-zentrierter Leitfaden zeigt Entwicklern, wie sie verhindern können, dass Telegram-Bots Zeitüberschreitungen erleiden, Aktionen duplizieren oder unter Last abstürzen, indem sie den Webhook absichern, Redis für Idempotenz nutzen und rechenintensive Aufgaben in Queues auslagern.

Warum Telegram-Webhooks mehr als nur eine einfache Route benötigen

Telegram sendet jede Benutzerinteraktion als HTTP-POST an eine vom Entwickler festgelegte URL an den Bot. Die Plattform erwartet innerhalb weniger Sekunden ein 200 OK; dauert es länger, wird die Anfrage erneut gesendet. Durch diese Wiederholungen kann dieselbe update_id mehrfach eintreffen. Wenn der Bot innerhalb der Anfrage in eine Datenbank schreibt oder externe APIs aufruft, kann dies zu doppelten Datensätzen, mehrfachen Nachrichten oder Race Conditions führen. Bei Bots, die Dutzende oder Hunderte von Nachrichten pro Sekunde verarbeiten, wird diese Latenz schnell zu einem Hindernis.

1. Den Endpunkt mit einem Secret-Header absichern

Telegram fügt jedem Webhook-Aufruf einen X-Telegram-Bot-Api-Secret-Token-Header hinzu. Vergleichen Sie diesen Header mit einem auf dem Server gespeicherten Secret – verwenden Sie dazu die PHP-Funktion hash_equals, um Timing-Angriffe zu vermeiden – und lehnen Sie jede Anfrage ab, die nicht von Telegram stammt. In Laravel sollten Sie diese Prüfung in einer Middleware platzieren, damit die Verifizierung erfolgt, bevor der Controller auf die Payload zugreift.

2. Jedes Update mit Redis idempotent machen

Jede eingehende Payload enthält eine eindeutige update_id. Der Leitfaden empfiehlt, diese ID mit dem NX-Flag (set-if-not-exists) in Redis zu schreiben. Der Vorgang ist nur beim ersten Auftreten erfolgreich; bei einem Retry ist der Key bereits vorhanden, und der Webhook kann sofort 200 OK zurückgeben, was Telegram signalisiert, dass das Update verarbeitet wurde. Da Redis im Arbeitsspeicher arbeitet, verursacht die Prüfung praktisch keine Latenz, und der Key bleibt bestehen, um Duplikate zu erkennen.

3. Rechenintensive Aufgaben an Background-Jobs auslagern

Selbst mit einer schnellen Redis-Prüfung sollte die Geschäftslogik des Bots – Datenbank-Schreibvorgänge, Aufrufe von Drittanbieter-APIs, Nachrichtenkomposition – niemals innerhalb der Webhook-Anfrage ausgeführt werden. Versenden Sie einen Laravel-Queue-Job, sobald der Webhook verifiziert und die update_id gespeichert wurde. Senden Sie die HTTP-Antwort sofort ab, damit der Worker den Job in seinem eigenen Tempo verarbeiten kann. So bleibt der Bot innerhalb der Antwortfrist von Telegram, und die Plattform führt keine erneuten Versuche durch.

Optimierungen für den Produktivbetrieb

  • Rate Limits beachten. Telegram gibt 429 Too Many Requests zusammen mit einem Retry-After-Header zurück, wenn ein Bot seine Limits pro Sekunde überschreitet. Queue-Worker sollten diesen Header lesen und pausieren, bevor sie den fehlgeschlagenen Job erneut versuchen.
  • Erst persistieren, dann antworten. Schreiben Sie alle Benutzerdaten zuerst in die Datenbank; erst nach einem erfolgreichen Commit sollte der Bot eine Bestätigungsnachricht senden. Diese Reihenfolge verhindert Szenarien, in denen eine Nachricht den Benutzer erreicht, der entsprechende Datensatz jedoch nie erstellt wird.
  • Callback-Payloads kürzen. Telegram begrenzt callback_data auf 64 Bytes. Speichern Sie größere Blobs in der Datenbank und übergeben Sie nur eine Referenz-ID in der Button-Payload, um innerhalb des Limits zu bleiben.

Fazit: Durch die Authentifizierung der Anfrage, die Deduplizierung mit Redis und das Auslagern von Aufgaben in Queues können Laravel-Entwickler Telegram-Bots bauen, die sofort antworten, die Rate Limits einhalten und bei steigender Nutzernachfrage sauber skalieren.