Klient klika „Zapłać”, serwer odpala Elixir, a tu nagle – timeout. Brak płynności, frustracja, utrata konwersji. To nie jest drobny błąd, to wyciek dochodu.
Dlaczego Elixir się zawiesza?
Po pierwsze, procesowanie transakcji w Przelewy24 wymaga szybkiej odpowiedzi. Elixir, choć świetny w równoległości, potrafi przyjąć zbyt wiele żądań jednocześnie i wpaść w kolejkę.
Po drugie, brak właściwej obsługi tokenów sesji. Token jest jednorazowy, po kilku milisekundach traci ważność, a Twoja aplikacja wciąż go używa.
Brak synchronizacji z API Przelewy24
Wywołanie https://przelewy24zaklady.com/articles/przelewy24-sesje-elixir-wplaty/ pokazuje, że wiele developerów ignoruje nagłówki „Retry-After”. Efekt? Niechciane odrzuty i ponowne próby, które jedynie nasilaą problem.
Nieoptymalny kod
Proste: wiesz, że „GenServer.call” blokuje proces, ale używasz go w miejscu, gdzie potrzebna jest asynchroniczność. W rezultacie Twój worker czeka, a klient już się poddaje.
Rozwiązania, które działają
Po pierwsze, wprowadź pooli procesów. Nie pozwól, by jeden proces obsługiwał wszystkie żądania. Rozdziel je na mniejsze workery i ustaw limit jednoczesnych połączeń.
Po drugie, implementuj mechanizm odświeżania tokena w tle. Gdy token się zbliża do wygaśnięcia, automatycznie pobierz nowy i podmień w pamięci.
Cache’owanie odpowiedzi
Jeśli wiesz, że pewne zapytania nie muszą być wywoływane przy każdym płatniku, cache’uj je na kilka sekund. Zmniejszysz liczbę wywołań API, a tym samym ryzyko timeoutów.
Ustawienia timeoutów
Domyślny timeout w Elixirze to 5 000 ms. Zwiększ go do 10 000 ms, ale jednocześnie wprowadź logikę “circuit breaker”, by nie blokować całego systemu przy długim przestoju.
Co zrobić teraz
Sprawdź, czy Twoje GenServer-y nie są jedynym wąskim gardłem. Przenieś ciężkie operacje do Task-ów, użyj Supervisorów z strategią :rest_for_one, i obserwuj, jak liczba przerwanych sesji spada w tempie wykładniczym.