Od Hangfire do RabbitMQ: Koniec z odpytywaniem bazy danych
Hangfire jest świetny dla małych zespołów. Dodajesz pakiet NuGet i wskazujesz swoją bazę danych. Otrzymujesz runner zadań i dashboard za darmo. W przypadku pojedynczego serwisu trudno o lepsze rozwiązanie.
Używałem Hangfire w SavePosty do obsługi e-maili, webhooków i pobierania treści. Każde zadanie działało w ten sam sposób. Wszystkie odpytywały moją bazę Postgres co kilka sekund, aby sprawdzić, czy pojawiły się nowe zadania.
Ostatecznie przenieśliśmy wszystko do RabbitMQ. Oto dlaczego to zrobiłem i co przez to straciłem.
Dlaczego się przeniosłem:
- Obciążenie wynikające z odpytywania skaluje się wraz z czasem, a nie z ilością pracy. Każde zadanie Hangfire uderza w bazę danych zgodnie z harmonogramem. Nawet jeśli nie ma pracy, baza pozostaje zajęta. Ten koszt rośnie wraz z liczbą zadań i częstotliwością odpytywania.
- Zbyt wiele modeli. Jedna część mojej aplikacji już korzystała z RabbitMQ. Reszta używała Hangfire. Oznaczało to dwa różne sposoby zarządzania pracą w tle. Przejście na RabbitMQ ujednoliciło wszystko.
- Opóźnienia (Latency). Broker przesyła zadanie w momencie jego nadejścia. Hangfire czeka na kolejne odpytanie.
Kompromisy:
Hangfire jest łatwy w konfiguracji. Wykorzystuje istniejące tabele SQL. Posiada świetny, wbudowany dashboard.
RabbitMQ wymaga zarządzania brokerem. Wykorzystuje RAM i sieć zamiast procesora bazy danych. Otrzymujesz lepszą skalowalność, ale większy narzut operacyjny.
Jak przeprowadziłem bezpieczną migrację:
Zachowałem logikę biznesową w niezmienionej formie. Zbudowałem lekkie konsumentów (consumers), którzy pełnią rolę „wejścia”. Konsument odbiera wiadomość i przekazuje ją do istniejącej klasy zadania.
Skupiłem się na dwóch rzeczach:
- Zgodność mechanizmu ponowień (Retry parity). Dopasowałem ustawienia ponowień Hangfire w konsumencie RabbitMQ, aby nie zgubić wiadomości.
- Bezpieczeństwo schematu. Pozostawiłem stare kolumny jako dopuszczające wartości NULL (nullable), aby nie uszkodzić bazy danych podczas wdrożenia.
Co straciłem:
Największą wadą jest widoczność. Hangfire pozwala kliknąć w nieudane zadanie i zobaczyć dokładnie, co się stało. RabbitMQ pokazuje, ile wiadomości znajduje się w Dead Letter Queue, ale nie zapewnia tak łatwego podglądu dla każdego zadania z osobna. Teraz polegam na ustrukturyzowanych logach zamiast na dashboardzie.
Moja rada:
Zostań przy Hangfire, jeśli:
- Uruchamiasz pojedynczy serwis.
- Masz mały zespół.
- Potrzebujesz prostego dashboardu do debugowania.
Przejdź na RabbitMQ, jeśli:
- Masz wiele serwisów.
- Obciążenie bazy danych wynikające z odpytywania jest wysokie.
- Chcesz korzystać z wzorców pub/sub.
Decyzja zależy od Twojego systemu, a nie od pojedynczego zadania.
Source: https://dev.to/gabrielleroux/from-hangfire-to-rabbitmq-killing-database-polling-in-a-net-app-4og4
Optional learning community: https://t.me/GyaanSetuAi
