Awesome
Goose
<p align="center"> <img src="logo/goose-round@2x.png" title="Goose" width="360" height="360" /> </p>Simple. Pluggable. Reliable. Extensible. Scalable.
A powerful background job processing library for Clojure. Goose is named after LT Nick 'Goose' Bradshaw, the sidekick to Captain Pete 'Maverick' Mitchell in Top Gun.
Announcement 🔈
We are excited to announce that five companies are successfully and reliably using Goose in production environments. With the release of a Jobs Management Console, Goose has reached a level of maturity, offering a feature-rich, stable, and production-ready background job processing solution.
We plan to release Goose 1.0.0 on February 1st, 2025, marking API stability and ensuring backward-compatibility, with no downtime during upgrades.
We welcome feedback from current and new users, especially if you’d like to request features or suggest changes to the API or implementation before the 1.0.0 release. Please review our Architecture Decisions and Wiki for more context, and share your thoughts via GitHub Issues or the Clojurians Slack.
Features
- Reliable - Code/Hardware/Network failure won't cause data loss
- Native support for RabbitMQ & Redis queues
- Pluggable Message Broker & Metrics Backend
- Jobs management Console
- Scheduled Jobs
- Batch Jobs
- Cron Jobs
- Error Handling & Retries
- Extensible using Middlewares
- Performant and scalable (refer performance benchmarks)
- Concurrency & Parallelism friendly
- ... more details in Goose Wiki
Companies using Goose in Production
<a href="https://aspect-analytics.com/"> <img src="logo/aspect-analytics.png" title="Aspect Analytics" width="150" height="150" /> </a> <a href="https://beecastle.com/"> <img src="logo/beecastle.png" title="BeeCastle" width="150" height="150" /> </a>Getting Started
Add Goose as a dependency
;;; Clojure CLI/deps.edn
com.nilenso/goose {:mvn/version "0.6.0"}
;;; Leiningen/Boot
[com.nilenso/goose "0.6.0"]
Client
(ns my-app
(:require
[goose.brokers.rmq.broker :as rmq]
[goose.client :as c]))
(defn my-fn
[arg1 arg2]
(println "my-fn called with" arg1 arg2))
(let [rmq-producer (rmq/new-producer rmq/default-opts)
;; Along with RabbitMQ, Goose supports Redis as well.
client-opts (assoc c/default-opts :broker rmq-producer)]
;; Supply a fully-qualified function symbol for enqueuing.
;; Args to perform-async are variadic.
(c/perform-async client-opts `my-fn "foo" :bar)
(c/perform-in-sec client-opts 900 `my-fn "foo" :bar)
;; When shutting down client...
(rmq/close rmq-producer))
Worker
(ns my-worker
(:require
[goose.brokers.rmq.broker :as rmq]
[goose.worker :as w]))
;;; 'my-app' namespace should be resolvable by worker.
(let [rmq-consumer (rmq/new-consumer rmq/default-opts)
;; Along with RabbitMQ, Goose supports Redis as well.
worker-opts (assoc w/default-opts :broker rmq-consumer)
worker (w/start worker-opts)]
;; When shutting down worker...
(w/stop worker) ; Performs a graceful shutsdown.
(rmq/close rmq-consumer))
Refer to wiki for Redis queue, Jobs management Console, Batch Jobs, Cron Jobs, Error Handling, Monitoring, Production Readiness and more.
Getting Help
Please open an issue or ping us on #goose @Clojurians slack.
License
Contributing
- As a first step, go through all the architecture-decisions
- Discuss with maintainers on the issues page or at #goose @Clojurians slack
- See the contributing guide for setup & guidelines