Jeśli Twój bot napotyka błędy związane z limitami, nie martw się — jest to powszechny problem, który można rozwiązać w odpowiedni sposób. Ten artykuł pomoże Ci zrozumieć system ograniczeń Discorda i przedstawi praktyczne rozwiązania.
Spis treści
Rodzaje ograniczeń na Discordzie
Globalne limity zapytań (Global Rate Limits)
Limity zapytań dla poszczególnych tras (Per-Route Rate Limits)
Limity zapytań specyficzne dla zasobów (Resource-Specific Rate Limits)
Limity dla nieprawidłowych zapytań (Invalid Request Limits)
Jak zidentyfikować problem z limitem zapytań
Najlepsze praktyki dotyczące obsługi limitów zapytań
Globalne limity zapytań (Global Rate Limits)
Uwagi dotyczące bramy (Gateway) i shardingu
Rodzaje ograniczeń na Discordzie
Discord stosuje różne typy limitów, aby chronić swoje API. Identyfikacja napotkanego limitu, jest kluczowa dla znalezienia odpowiedniego rozwiązania:
Globalne limity zapytań (Global Rate Limits)
Limit: 50 zapytań na sekundę dla większości endpointów
Zakres: Dotyczy całej Twojej aplikacji
Identyfikacja: Poszukaj X-RateLimit-Scope: global w nagłówkach odpowiedzi
Limity zapytań dla poszczególnych tras (Per-Route Rate Limits)
Limit: Zależy od endpointu
Zakres: Specyficzny dla poszczególnych tras API
Identyfikacja: Poszukaj X-RateLimit-Scope: user
Limity zapytań specyficzne dla zasobów (Resource-Specific Rate Limits)
Uwaga: Limity zapytań specyficzne dla zasobów mogą być osiągane przez różne źródła (inni użytkownicy, boty, webhooki itp.) i ten błąd nie musi oznaczać, że tylko Twoja aplikacja jest odpowiedzialna za przekroczenie limitu.
Limit: Niezależne limity dla konkretnych gildii, kanałów lub webhooków
Zakres: Dotyczy działań na konkretnych zasobach.
Identyfikacja: Poszukaj X-RateLimit-Scope: shared w nagłówkach
Limity dla nieprawidłowych zapytań (Invalid Request Limits)
Limit: 10 000 nieprawidłowych zapytań na 10 minut
Typowa przyczyna: Nieobsłużone błędy (401, 403 lub 429) powodujące skoki liczby zapytań. Pamiętaj, że błędy 429 zwrócone z nagłówkiem X-RateLimit-Scope: shared nie są wliczane do limitu nieprawidłowych zapytań.
Wynik: Tymczasowy ban Cloudflare
Jak zidentyfikować problem z limitem zapytań
Niezawodnym sposobem na określenie, jaki limit osiągasz, jest zbadanie nagłówków odpowiedzi HTTP, gdy otrzymasz kod statusu 429. Kluczowe nagłówki do sprawdzenia:
X-RateLimit-Limit: Górna granica limitu dla tego endpointu
X-RateLimit-Remaining: Liczba zapytań pozostałych w bieżącym oknie
X-RateLimit-Reset: Kiedy okno limitu zapytań się resetuje (znacznik czasu Unix)
X-RateLimit-Reset-After: Sekundy do czasu zresetowania limitu
X-RateLimit-Scope: Wskazuje typ limitu (globalny, użytkownika lub współdzielony)
retry_after: Liczba milisekund do odczekania przed wysłaniem kolejnego żądania
Najlepsze praktyki dotyczące obsługi limitów zapytań
Wprowadź odpowiednie strategie opóźnień
Zwróć szczególną uwagę na wartość retry_after w odpowiedziach z ograniczeniem liczby zapytań. Mówi ona dokładnie, jak długo musisz poczekać przed ponowną próbą.
Rozważ użycie interakcji tam, gdzie jest to możliwe
Polecenia aplikacji i komponenty wiadomości są doskonałą alternatywą dla poleceń z prefiksem, które mogą zapobiegać nadmiernym żądaniom API i wiadomościom na kanałach.
Dodatkowa wskazówka: Ustaw odpowiedzi na interakcje oraz wiadomości uzupełniające jako ulotne, ponieważ nie wliczają się one do limitów zapytań. Ulotne wiadomości są widoczne tylko dla adresata i znikają po pewnym czasie.
Skutecznie przechowuj dane w pamięci podręcznej
Zredukuj wywołania API, pamiętając o cachowaniu często używanych danych, takich jak:
- Informacje o gildii
- Szczegóły kanału
- Profile użytkownika
- Informacje o roli
Ogranicz tempo żądań (Throttling)
Ograniczenie żądań to proaktywne podejście polegające na kontrolowaniu tempa wysyłania zapytań, aby uniknąć przekroczenia limitu.
Na przykład, jeśli Twój bot musi wysłać wiadomości powitalne do 200 nowych członków, zamiast wysyłać wszystkie 200 wiadomości od razu, umieść je w kolejce, która uwalnia 4 żądania co 100 milisekund. Dzięki temu utrzymasz stałe tempo 40 żądań na sekundę, pozostając znacznie poniżej limitu 50 żądań, zapewniając jednocześnie, że wszystkie wiadomości zostaną wysyłane w około 5 sekund.
Globalne limity zapytań (Global Rate Limits)
Jeśli napotkałeś taki limit, Twoja aplikacja może mieć ukryty problem, który należy rozwiązać.
Rozważ poniższe optymalizacje kodu, aby pozostać w ramach limitów:
- Wdrożenie odpowiedniego buforowania
- Migracja do funkcji opartych na interakcji
Jeśli te propozycje nie rozwiążą problemu z globalnym limitem, skontaktuj się z nami na kanale #api-help na serwerze Discord Developers lub przez formularz Wsparcia dla deweloperów.
Uwagi dotyczące bramy (Gateway) i shardingu
Jeśli Twój bot obsługuje zdarzenia w czasie rzeczywistym za pośrednictwem bramy Discorda (połączenie websocket), sharding stanie się niezbędny wraz z jego rozwojem.
Czym jest Sharding?
Sharding dzieli Twojego bota na wiele instancji, z których każda obsługuje podzbiór gildii. Rozkłada to obciążenie na wiele połączeń websocket, co pomaga pozostać w granicach limitów.
Polecamy rozpoczęcie planowania wdrożenia shardingu, gdy zbliżasz się do 2 000 gildii, ponieważ sharding musi być włączony przy 2 500+ gildiach. Aby zachować optymalną wydajność, utrzymuj około 1 shard na 1 000 gildii.
Pamiętaj, że limity istnieją po to, abyśmy mogli zapewnić stabilność wszystkim użytkownikom Discorda. Postępując zgodnie z powyższymi wskazówkami, zbudujesz bota, który efektywnie się skaluje i przestrzega wszystkich ograniczeń.