Об этом проекте

River — это библиотека для обработки фоновых задач на языке Go, использующая Postgres в качестве очереди задач. Она спроектирована так, чтобы данные приложения и очередь задач хранились в одной базе данных, что позволяет ставить задачи в очередь транзакционно вместе с другими изменениями в базе. Гарантируется, что задачи будут поставлены в очередь, если их транзакция зафиксирована, удалены при откате и не видны для выполнения до фиксации. Задачи определяются как пары структур: реализация JobArgs с JSON-аннотациями и стабильной строкой "kind", а также реализация Worker, предоставляющая функцию Work. Workers регистрируются при запуске, чтобы River мог сопоставлять виды задач с работниками. Клиент создается с пулом соединений к базе данных, драйвером и конфигурацией, содержащей набор Workers и настройки очередей. Клиенты могут быть запущены и остановлены, с корректным завершением через отмену контекста или явный вызов Stop. Клиенты, предназначенные только для вставки, могут добавлять задачи без их обработки. Возможности включают пакетную вставку задач с использованием Postgres COPY FROM, отмену задач изнутри функции Work, обработку ошибок и паник, несколько очередей для пропускной способности и изоляции, периодические и cron-задачи, запланированные задачи, отложенные задачи, подписки на активность очередей и статистику для телеметрии, тестовые помощники, транзакционное завершение задач, уникальные задачи по аргументам/периоду/очереди/состоянию, веб-интерфейс для просмотра задач и очередей, а также упрощенные функции Work. River также поддерживает вставку задач из Python и Ruby для кросс-языковой постановки в очередь, при этом обработка выполняется Go-воркерами. Проект вдохновлен библиотеками для фоновых задач, такими как Oban, Que, Sidekiq, Delayed::Job, GoodJob и Hangfire. В README упоминаются документация, godoc, интерфейс River UI и живое демо.