blob: a4f17b3668eff6d215c1c85b83b424ce172faa3e [file] [log] [blame] [view]
# 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)