Від Hangfire до RabbitMQ: Позбуваємося опитування бази даних
Hangfire чудово підходить для невеликих команд. Ви просто додаєте NuGet-пакет і вказуєте вашу базу даних. Ви отримуєте запускник завдань та панель керування (dashboard) безкоштовно. Для одного сервісу це рішення важко перевершити.
Я використовував Hangfire у SavePosty для обробки електронних листів, вебхуків та отримання контенту. Кожне завдання працювало однаково. Усі вони опитували мою базу даних Postgres кожні кілька секунд, щоб перевірити наявність нової роботи.
Зрештою я переніс усе на RabbitMQ. Ось чому я це зробив і що втратив.
Чому я перейшов:
- Навантаження від опитування зростає з часом, а не з обсягом роботи. Кожне завдання Hangfire звертається до вашої бази даних за таймером. Навіть якщо роботи немає, база даних залишається зайнятою. Ці витрати зростають разом із кількістю завдань та частотою опитування.
- Занадто багато моделей. Одна частина мого додатка вже використовувала RabbitMQ. Решта використовувала Hangfire. Це означало наявність двох різних способів керування фоновою роботою. Перехід на RabbitMQ уніфікував усе.
- Затримка (Latency). Брокер передає роботу в момент її надходження. Hangfire чекає на наступне опитування.
Компроміси:
Hangfire легко налаштувати. Він використовує ваші існуючі SQL-таблиці. У нього є чудова вбудована панель керування.
RabbitMQ потребує керування брокером. Він використовує RAM та мережу замість процесора бази даних. Ви отримуєте краще масштабування, але більше операційних витрат.
Як я безпечно здійснив міграцію:
Я залишив бізнес-логіку без змін. Я створив «тонких» споживачів (consumers), які діють як вхідні двері. Споживач отримує повідомлення і передає його існуючому класу завдання.
Я зосередився на двох речах:
- Паритет повторних спроб (retry parity). Я підлаштував налаштування повторних спроб Hangfire у споживачі RabbitMQ, щоб не втрачати повідомлення.
- Безпека схеми. Я залишив старі колонки nullable, щоб не зламати базу даних під час розгортання.
Що я втратив:
Найбільшим недоліком є видимість. Hangfire дозволяє натиснути на невдале завдання і побачити, що саме сталося. RabbitMQ показує, скільки повідомлень знаходиться в черзі Dead Letter Queue, але він не дає такого ж легкого перегляду для кожного окремого завдання. Тепер я покладаюся на структуровані логи замість панелі керування.
Моя порада:
Залишайтеся на Hangfire, якщо:
- Ви запускаєте один сервіс.
- У вас невелика команда.
- Вам потрібна проста панель керування для налагодження.
Переходьте на RabbitMQ, якщо:
- У вас кілька сервісів.
- Навантаження на вашу базу даних через опитування є високим.
- Ви хочете використовувати патерни pub/sub.
Рішення залежить від вашої системи, а не від одного завдання.
Джерело: https://dev.to/gabrielleroux/from-hangfire-to-rabbitmq-killing-database-polling-in-a-net-app-4og4
Додаткова спільнота для навчання: https://t.me/GyaanSetuAi
