Від 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