{"id":13509015,"url":"https://github.com/koudelka/honeydew","last_synced_at":"2025-05-15T04:07:05.145Z","repository":{"id":22681704,"uuid":"26025358","full_name":"koudelka/honeydew","owner":"koudelka","description":"Job Queue for Elixir. Clustered or Local. Straight BEAM. Optional Ecto. 💪🍈","archived":false,"fork":false,"pushed_at":"2024-01-10T11:30:57.000Z","size":1449,"stargazers_count":723,"open_issues_count":16,"forks_count":57,"subscribers_count":9,"default_branch":"master","last_synced_at":"2025-04-14T05:56:25.964Z","etag":null,"topics":["background","elixir","job-queue","pool","queue","workers"],"latest_commit_sha":null,"homepage":"","language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/koudelka.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2014-10-31T17:07:30.000Z","updated_at":"2025-04-06T14:58:17.000Z","dependencies_parsed_at":"2024-01-31T07:53:44.650Z","dependency_job_id":null,"html_url":"https://github.com/koudelka/honeydew","commit_stats":null,"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koudelka%2Fhoneydew","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koudelka%2Fhoneydew/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koudelka%2Fhoneydew/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/koudelka%2Fhoneydew/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/koudelka","download_url":"https://codeload.github.com/koudelka/honeydew/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254270646,"owners_count":22042859,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["background","elixir","job-queue","pool","queue","workers"],"created_at":"2024-08-01T02:01:01.781Z","updated_at":"2025-05-15T04:07:00.129Z","avatar_url":"https://github.com/koudelka.png","language":"Elixir","funding_links":[],"categories":["Queue","Elixir"],"sub_categories":[],"readme":"Honeydew 💪🏻🍈\n========\n[![Build Status](https://travis-ci.org/koudelka/honeydew.svg?branch=master)](https://travis-ci.org/koudelka/honeydew)\n[![Hex pm](https://img.shields.io/hexpm/v/honeydew.svg?style=flat)](https://hex.pm/packages/honeydew)\n\nHoneydew ([\"Honey, do!\"](http://en.wiktionary.org/wiki/honey_do_list)) is a pluggable job queue and worker pool for Elixir, focused on at-least-once execution.\n\n```elixir\ndefmodule MyWorker do\n  def do_a_thing do\n    IO.puts \"doing a thing!\"\n  end\nend\n\n:ok = Honeydew.start_queue(:my_queue)\n:ok = Honeydew.start_workers(:my_queue, MyWorker)\n\n:do_a_thing |\u003e Honeydew.async(:my_queue)\n\n# =\u003e \"doing a thing!\"\n```\n\n__Isolation__\n  - Jobs are run in isolated one-time-use processes.\n  - Optionally stores immutable state loaned to each worker (a database connection, for example).\n  - [Initialized Worker](https://github.com/koudelka/honeydew/tree/master/examples/initialized_worker)\n\n__Strong Job Custody__ \n  - Jobs don't leave the queue until either they succeed, are explicitly abandoned or are moved to another queue.\n  - Workers are issued only one job at a time, no batching.\n  - If a worker crashes while processing a job, the job is reset and a \"failure mode\" (e.g. abandon, move, retry) is executed. (The default failure mode [is to abandon the job](https://hexdocs.pm/honeydew/Honeydew.html#start_queue/2).)\n  - [Job Lifecycle](https://github.com/koudelka/honeydew/blob/master/README/job_lifecycle.md)\n\n__Clusterable Components__\n  - Queues, workers and your enqueuing processes can exist anywhere in the BEAM cluster. \n  - [Global Queues](https://github.com/koudelka/honeydew/tree/master/examples/global)\n\n__Plugability__\n  - [Queues](https://github.com/koudelka/honeydew/blob/master/README/queues.md), [workers](https://github.com/koudelka/honeydew/blob/master/README/workers.md), [dispatch strategies](https://github.com/koudelka/honeydew/blob/master/README/dispatchers.md), [failure modes and success modes](https://github.com/koudelka/honeydew/blob/master/README/success_and_failure_modes.md) are all plugable with user modules.\n  - No forced dependency on external queue services.\n\n__Batteries Included__\n  - [Mnesia Queue](https://github.com/koudelka/honeydew/tree/master/examples/mnesia.exs), for in-memory/persistence and simple distribution scenarios. (default)\n  - [Ecto Queue](#ecto), to turn an Ecto schema into its own work queue, using your database.\n  - [Fast In-Memory Queue](https://github.com/koudelka/honeydew/tree/master/examples/local), for fast processing of recreatable jobs without delay requirements.\n  - Can optionally heal the cluster after a disconnect or downed node when using a [Global Queue](https://github.com/koudelka/honeydew/tree/master/examples/global).\n  - [Delayed Jobs](https://github.com/koudelka/honeydew/tree/master/examples/delayed_job.exs)\n  - [Exponential Retry](https://github.com/koudelka/honeydew/tree/master/lib/honeydew/failure_mode/exponential_retry.ex), even works with Ecto queues!\n\n\n__Easy API__\n  - Jobs are enqueued using `async/3` and you can receive replies with `yield/2`, somewhat like [Task](https://hexdocs.pm/elixir/Task.html).\n  - [API Overview](https://github.com/koudelka/honeydew/blob/master/README/api.md)\n  - [Hex Docs](https://hexdocs.pm/honeydew/Honeydew.html)\n\n\n### \u003ca name=\"ecto\"\u003eEcto Queue\u003c/a\u003e\n\nThe Ecto Queue is designed to painlessly turn your Ecto schema into a queue, using your repo as the backing store.\n\n- You don't need to explicitly enqueue jobs, that's handled for you (for example, sending a welcome email when a new User is inserted).\n- Eliminates the possibility of your database and work queue becoming out of sync\n- As the database is the queue, you don't need to run a separate queue node.\n- You get all of the high-availability, consistency and distribution semantics of your chosen database.\n\nCheck out the included [example project](https://github.com/koudelka/honeydew/tree/master/examples/ecto_poll_queue), and its README.\n\n\n## Getting Started\n\nIn your mix.exs file:\n\n```elixir\ndefp deps do\n  [{:honeydew, \"~\u003e 1.5.0\"}]\nend\n```\n\n## Deployment\n\nIf you're using the Mnesia queue (the default), you'll need tell your release system to include the `:mnesia` application, and you'll have to decide how you're going to create your on-disk schema files, which needs to be done while mnesia is *not* running.\n\nIf you use mnesia outside of Honeydew, you'll want to use the `:extra_applications` configuration key in your mix.exs file, as well as manually creating your mnesia schema with `:mnesia.create_schema(nodes)` in an iex session in production:\n\n```elixir\ndef application do\n  [\n    extra_applications: [:mnesia]\n  ]\nend\n```\n\nOtherwise, if Honeydew is the only user of mnesia, you can let Honeydew manage it by simply using the `:included_applications` key instead.\n\n```elixir\ndef application do\n  [\n    included_applications: [:mnesia]\n  ]\nend\n```\n\n### tl;dr\n- Check out the [examples](https://github.com/koudelka/honeydew/tree/master/examples).\n- Enqueue jobs with `Honeydew.async/3`, delay jobs by passing `delay_secs: \u003cinteger\u003e`.\n- Receive responses with `Honeydew.yield/2`.\n- Emit job progress with `progress/1`\n- Queue/Worker status with `Honeydew.status/1`\n- Suspend and resume with `Honeydew.suspend/1` and `Honeydew.resume/1`\n- List jobs with `Honeydew.filter/2`\n- Move jobs with `Honeydew.move/2`\n- Cancel jobs with `Honeydew.cancel/2`\n\n\n### README\nThe rest of the README is broken out into slightly more digestible [sections](https://github.com/koudelka/honeydew/tree/master/README).\n\nAlso, check out the README files included with each of the [examples](https://github.com/koudelka/honeydew/tree/master/examples).\n\n### CHANGELOG\nIt's worth keeping abreast with the [CHANGELOG](https://github.com/koudelka/honeydew/blob/master/CHANGELOG.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoudelka%2Fhoneydew","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkoudelka%2Fhoneydew","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkoudelka%2Fhoneydew/lists"}