Połączenie może zostać zerwane po tym, jak Bird zaakceptuje SMS, ale zanim twoja aplikacja otrzyma odpowiedź. Ponowienie z nowym kluczem może spowodować drugie wysłanie, ponieważ Bird traktuje je jako osobne żądanie.
Jak działa klucz?
Ustaw nagłówek Idempotency-Key dla każdego zamierzonego wysłania SMS i używaj go ponownie przy ponawianiu identycznego żądania. Gdy Bird zachowa oryginalną odpowiedź, pasujące ponowienie zwraca tę odpowiedź bez ponownego wykonywania wysyłki.
Na przykład potwierdzenie zamówienia zachowuje ten sam klucz po przekroczeniu limitu czasu i przy ponowieniu. Potwierdzenie innego zamówienia dostaje inny klucz.
Odtworzone odpowiedzi zawierają Idempotency-Replay: true, co pozwala twoim logom odróżnić odtworzenie od nowo przetworzonego żądania.
Klucze SMS są przypisane do twojego obszaru roboczego. Bird przechowuje zakończone odpowiedzi przez trzy godziny zgodnie ze swoim kontraktem idempotentności. Po tym oknie ten sam klucz może wykonać nowe żądanie, ponieważ jego rekord odtwarzania wygasł. Ponowienie dzień później wymaga więc porównania zapisów dotyczących wyniku pierwotnej operacji przed kolejnym wysłaniem.
Co oznaczają odpowiedzi o błędach?
Kod błędu rozróżnia zmienione żądanie, niedokończone żądanie i niedostępną ochronę.
409zE01005 IdempotencyKeyReuse: ten sam klucz został użyty dla innego żądania. Napraw przypisanie klucza przed ponowieniem, ponieważ ten klucz należy do oryginalnego żądania. Bird porównuje metodę, endpoint, ścieżkę i parametry zapytania oraz surowe body. Nawet zmiana białych znaków w JSON sprawia, że żądanie jest inne.409zE01004 RequestInProgress: równoległe żądanie z tym samym kluczem jeszcze się nie zakończyło. Poczekaj chwilę i spróbuj ponownie z tym samym kluczem i żądaniem, aby oryginalne mogło się zakończyć. Blokada in-flight wygasa w ciągu 30 sekund. Wygaśnięcie nie ustala, czy pierwotna operacja wysyłki została wykonana.503zE01033 IdempotencyUnavailable: ochrona była niedostępna przed wykonaniem, więc ta próba nie została wykonana. Spróbuj ponownie z backoffem, używając tego samego klucza i żądania. Ta odpowiedź nie ustala wyniku wcześniejszej próby.- Inne odpowiedzi
5xxlub przekroczenia limitu czasu: spróbuj ponownie z backoffem, używając tego samego klucza i żądania. Bird nie zachowuje odpowiedzi5xx. Ponowienie odtwarza zachowaną pomyślną odpowiedź albo może wykonać żądanie ponownie, jeśli żadna odpowiedź nie została zachowana.
Nagłówek idempotentności zachowuje tożsamość żądania we wszystkich tych ponowieniach.
Czy klucz gwarantuje brak duplikatów?
Klucz zmniejsza liczbę zduplikowanych wysyłek, ale nie gwarantuje jednorazowego wykonania.
Operacja wysyłki może zostać wykonana, zanim Bird zachowa odpowiedź na tę operację. Jeśli zachowanie odpowiedzi się nie powiedzie lub blokada in-flight wygaśnie, ponowienie może ponownie wykonać wysyłkę. Trzygodzinne okno retencji również ogranicza ochronę zapewnianą przez odtwarzanie odpowiedzi.
Prowadź rejestr zdarzeń i wysyłek w swojej aplikacji, aby móc porównać zapisy dotyczące niepewnego wyniku przed ponownym wysłaniem. Dołącz numer zamówienia lub referencji do wiadomości, żeby odbiorca mógł rozpoznać, którego zdarzenia dotyczy.
A co z wiadomością, którą telefon wyświetla dwa razy?
Klucz idempotentności kontroluje ponowienia API; nie kontroluje tego, jak telefon odbiorcy wyświetla wiadomość. Sam zrzut ekranu nie ustala, skąd pochodzi duplikat.
Porównaj pełny log wysyłek aplikacji z rekordami wiadomości Bird. Wiele zaakceptowanych identyfikatorów wiadomości może potwierdzić wielokrotne wysłanie. Znalezienie tylko jednego identyfikatora w niekompletnym logu nie dowodzi, że duplikat powstał dalej w łańcuchu. Podaj odpowiednie identyfikatory, numer docelowy i znaczniki czasu, prosząc wsparcie o zbadanie sprawy.
Co powinienem zrobić?
- Przypisz jeden klucz do każdego zamierzonego wysłania SMS i używaj identycznego żądania przy ponowieniach.
- Ponawiaj błędy sieciowe, przekroczenia limitu czasu i odpowiedzi
5xxz backoffem, zachowując klucz, aby utrzymać dostępną ochronę zapewnianą przez odtwarzanie odpowiedzi. - Napraw konflikty ze zmienionymi żądaniami i opóźnij ponowienia, gdy oryginalne żądanie wciąż trwa.
- Porównaj zapisy dotyczące niepewnych wysyłek, w tym te wykraczające poza trzygodzinne okno odtwarzania, zanim zdecydujesz, czy kolejne wysłanie jest właściwe.
W skrócie
Jeden klucz identyfikuje jedno zamierzone wysłanie.
Ponowienia używają tego samego klucza i żądania. Zachowana odpowiedź jest odtwarzana w ciągu trzech godzin.
409może wskazać zmienione lub niedokończone żądanie.IdempotencyKeyReuse oznacza, że żądanie się zmieniło. RequestInProgress oznacza, że oryginalne żądanie wciąż trwa i wymaga opóźnionego ponowienia.
Niedostępna ochrona blokuje tę próbę.
Odpowiedź 503 IdempotencyUnavailable oznacza, że ta próba nie została wykonana. Nie ustala wyniku wcześniejszej próby.
Odtwarzanie odpowiedzi zmniejsza ryzyko duplikatów, ale go nie eliminuje.
Wysłanie może zadziałać, zanim jego odpowiedź zostanie zachowana. Wygasły rekord odtwarzania również pozwala na ponowne wykonanie.