# 3. Distributed WorkQueue

Date: 2019-10-02

## Status

Accepted (lazy consensus) & implemented

Superceded by [16. Distributed WorkQueue](0016-distributed-workqueue.md)

## Context

By switching the task manager to a distributed implementation, we need to be able to run a `Task` on any node of the cluster.

## Decision

  For the time being we will keep the sequential execution property of the task manager.
  This is an intermediate milestone toward the final implementation which will drop this property.

 * Use a RabbitMQ queue as a workqueue where only the `Created` events are pushed into.
   This queue will be exclusive and events will be consumed serially. Technically this means the queue will be consumed with a `prefetch = 1`.
   The queue will listen to the worker on the same node and will ack the message only once it is finished (`Completed`, `Failed`, `Cancelled`).

## Consequences

 * It's a temporary and not safe to use in production solution: if the node promoted to exclusive listener of the queue dies, no more tasks will be run
 * The serial execution of tasks does not leverage cluster scalability.
 
## References

* [JIRA ticket](https://issues.apache.org/jira/projects/JAMES/issues/JAMES-2813)

