Sobre o projeto
River é uma biblioteca de processamento de jobs em segundo plano para Go que usa o Postgres como fila de jobs. Ela foi projetada para que os dados da aplicação e a fila de jobs compartilhem o mesmo banco de dados, permitindo que jobs sejam enfileirados de forma transacional junto com outras alterações no banco de dados. Os jobs têm garantia de serem enfileirados se sua transação for confirmada, removidos se ela for revertida, e não ficam visíveis para execução até a confirmação.
Os jobs são definidos como pares de structs: uma implementação de JobArgs com anotações json e uma string "kind" estável, além de uma implementação de Worker que expõe uma função Work. Os workers são registrados na inicialização para que o River possa mapear os tipos de job para os workers. Um Client é criado com um pool de banco de dados, um driver e uma configuração contendo um conjunto de Workers e definições de filas. Os clients podem ser iniciados e parados, com encerramento gracioso via cancelamento de contexto ou uma chamada explícita a Stop. Clients somente de inserção podem inserir jobs sem executá-los.
Os recursos incluem inserção de jobs em lote usando COPY FROM do Postgres, cancelamento de jobs de dentro de uma função de trabalho, tratamento de erros e panics, múltiplas filas para throughput e isolamento, jobs periódicos e cron, jobs agendados, adiamento de jobs (snoozing), assinaturas da atividade das filas e estatísticas para telemetria, auxiliares de teste, conclusão transacional de jobs, jobs únicos por args/período/fila/estado, uma interface web para inspecionar jobs e filas, e funções de trabalho simplificadas. O River também oferece suporte à inserção de jobs a partir de Python e Ruby para enfileiramento entre linguagens, com workers em Go processando-os.
O projeto é inspirado em bibliotecas de jobs em segundo plano como Oban, Que, Sidekiq, Delayed::Job, GoodJob e Hangfire. Documentação, godoc, uma River UI e uma demonstração ao vivo são referenciados no README.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.