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.