Run Oban.Web without executing jobs

I’m using the amazing Oban Web+Pro by @sorentwo in a Phoenix app. Previously the jobs were being executed on every node in my cluster, along with the Oban Web dashboard exposed for admins.

But now we’d like to isolate all jobs to only a few dedicated worker nodes, but keep using Oban Web along with the Phoenix app on the other web nodes to monitor job status across all nodes.

I thought it would be as simple as setting the concurrency of my queues to 0 on the web nodes:

config :my_app, Oban
  queues: [
    queue_1: 0,
    queue_2: 0,
    queue_3: 0,

But this just raises the following error:

** (Mix) Could not start application my_app: MyApp.Application.start(:normal, []) returned an error: shutdown: failed to start child: Oban
    ** (EXIT) an exception was raised:
        ** (ArgumentError) queue :queue_1, local_limit must be greater than 0
            (oban 2.13.6) lib/oban/validation.ex:41: Oban.Validation.validate!/2
            (oban 2.13.6) lib/oban/config.ex:77:
            (oban 2.13.6) lib/oban.ex:182: Oban.start_link/1
            (stdlib 4.0.1) supervisor.erl:414: :supervisor.do_start_child_i/3
            (stdlib 4.0.1) supervisor.erl:400: :supervisor.do_start_child/2
            (stdlib 4.0.1) supervisor.erl:384: anonymous fn/3 in :supervisor.start_children/2
            (stdlib 4.0.1) supervisor.erl:1250: :supervisor.children_map/4
            (stdlib 4.0.1) supervisor.erl:350: :supervisor.init_children/2

I’m probably missing a very obvious config option here so looking for help!


Same question also posted to SO: elixir - Disable Oban Job execution on a node with Oban.Web running - Stack Overflow

The solution is to set queues: [] on the web nodes and omit the concurrency limit altogether. Or, you can use the only option of DynamicQueues to restrict where queues run without multiple configs.

Thank you for getting back! I do have one follow up question regarding how the Oban Web dashboard picks up which queues to show/monitor if we only specify an empty list [], and nothing is being executed on that node.

Does it look at the queues enabled on other connected nodes in the same cluster or does it check the current database do something like the following:

|> select(:queue)
|> distinct(true)
|> Repo.all()

Or maybe it displays that data separately per each node?

It looks at information across all nodes, not just the current one. You don’t need to run any queues on the web node (and you don’t even need to run the dashboard in the same cluster, as long as it can connect to the database and pubsub).

1 Like