River es una biblioteca de Go para procesar trabajos en segundo plano sobre Postgres, diseñada para evitar los problemas habituales de los sistemas distribuidos al reutilizar la misma base de datos tanto para los datos de la aplicación como para la cola de trabajos. Su principio central es el encolado transaccional: un trabajo queda garantizado si la transacción que lo inserta confirma, se descarta si la transacción hace rollback y no es visible para los workers hasta el commit, lo que elimina clases enteras de condiciones de carrera.
El modelo de programación se basa en pares de structs: uno implementa la interfaz JobArgs, que define el tipo de trabajo mediante una cadena estable (Kind) y sus anotaciones JSON para serialización, y otro implementa Worker, exponiendo una función Work que contiene la lógica. Los workers se registran en el arranque en un bundle Workers, y un Client conecta ese bundle con un pool de Postgres y un driver (riverpgxv5 u otros) para crear colas con un número máximo de workers concurrentes (por defecto, hasta 100 gorutinas en la cola default).
La inserción de trabajos se realiza con Client.InsertTx dentro de una transacción, y existen clientes de solo insert que encolan sin ejecutar. La biblioteca ofrece apagado controlado mediante contexto o la llamada explícita Stop, con un SoftStopTimeout configurable, lo que la hace apta para integrarse con señales SIGINT/SIGTERM.
Entre sus características adicionales destacan la inserción por lotes con COPY FROM, cancelación y snooze de trabajos desde la función de trabajo, múltiples colas para aislamiento, trabajos programados y únicos, suscripciones para métricas, completado transaccional, helpers de test y una interfaz web independiente (River UI). Aunque está escrita en Go, soporta inserciones desde otros lenguajes ejecutadas por workers en Go.
