Jak uczynić webhook płatności lub WhatsApp idempotentnym?
Share

In this article
Przypisz każdemu webhookowi unikalny identyfikator od nadawcy, taki jak ID zamówienia lub ID wiadomości, i wykonaj jego skutki uboczne tylko raz. Powtórna dostawa znajdzie już przetworzony ID i nic nie zrobi. Zamiast wykonywać pracę bezpośrednio, opublikuj ją do kolejki, aby nadawca nie musiał czekać.
Dlaczego webhooki przychodzą więcej niż raz?
Nadawcy ponawiają próby przy timeoutach, problemach sieciowych i odpowiedziach innych niż 2xx, preferując dostarczenie dwukrotne niż brak dostarczenia. Bramy płatności i WhatsApp działają w ten sposób. Obsługa, która reaguje na każdą dostawę, może wystawić podwójne bilety, dwukrotnie potwierdzić rezerwację lub pobrać opłatę dwa razy.
Co powinien zawierać klucz idempotencji?
Użyj identyfikatora, który nadawca gwarantuje jako stabilny podczas ponownych prób: ID zamówienia dla webhooków płatności, ID wiadomości dla WhatsApp. Przechowuj przetworzone klucze i sprawdzaj je przed działaniem. Klucz generowany samodzielnie dla każdej dostawy nie działa, ponieważ każda próba wyglądałaby jak nowe zdarzenie.
Dlaczego publikować do kolejki zamiast wykonywać pracę w handlerze?
Generowanie biletu i wysyłanie maila inline powoduje, że brama czeka na pracę, która jej nie interesuje, co prowadzi do timeoutów i kolejnych prób. Potwierdź szybko, opublikuj zdarzenie potwierdzenia płatności do RabbitMQ i pozwól konsumentowi wykonać pracę. Powtórna dostawa publikuje raz; druga jest operacją bez efektu.
Gdzie to jest używane w produkcji?
W FindYourVibe webhook płatności jest idempotentny względem ID zamówienia i publikuje do RabbitMQ, zanim konsument wystawi bilet. W Trexind każdy handler webhooka WhatsApp jest idempotentny względem ID wiadomości, więc powtórna dostawa aktualizuje stan tylko raz zamiast ponownie wywoływać skutki rezerwacji lub rozliczeń.
Jak przetestować, czy webhook jest idempotentny?
Wyślij ten sam ładunek dwa razy, najlepiej jednocześnie, i sprawdź, czy skutek uboczny wystąpił tylko raz: jeden bilet, jedna rezerwacja, jedna opłata. Następnie odtwórz stary ładunek po pełnym przetworzeniu pierwszego. Jeśli liczba jest większa niż jeden, sprawdzanie klucza jest wyścigiem lub brakuje unikalnego ograniczenia.
Artykuł pierwotnie opublikowany na sakshamjain.codes/blog/idempotent-payment-and-whatsapp-webhooks. Potrzebujesz takiego rozwiązania? Zobacz moje usługi na NexoRush lub napisz do mnie.