For some background on Design Patterns see Christopher Alexander's Pattern Language book, or the famous "Gang of Four" Design Patterns book.
Pattern-Name
Work-Queue
Intent
In a work-flow where tasks are handed over from one or more users to one or more other users, it is often the case that the person receiving the task cannot begin work on it right away, as they are busy with something else.
Sometimes we want to provide a means of hand-over that allows person A (the producer) to say "i'm done", so that they do not accumulate any more apparent time-spent on this task, but also we don't want person B (the consumer, or next recipient of the task) to immediately begin accumulating time-spent if they aren't actually working on the task yet.
Often the two sides of the queue are not balanced - there may be many more producers adding to the queue than consumers taking from it, or vice-versa.
Also known as
"Wait-State", "In-Tray", "To-Do's", "Async Hand-over", ... ?
Motivation
For the purposes of reporting, we want to isolate:
- The time the producer spends working on the task.
- The time at which the producer handed-off the task (put it in the queue).
- The time spent waiting for the task to be picked up and resumed by a consumer.
- The time at which the consumer took the task from the queue.
- The time spent by the consumer actually working on the next stage of the task.
A typical reporting scenario might be to monitor performance of various groups or individuals against SLA's - for example there might be SLA's on the maximum amount of time a task may sit idle in the queue, and/or on the amount of time each task step should take to complete, or an SLA on the complete task.
Implementation
At its simplest this pattern involves just 3 states, one after the other, such that the producer completes his/her part of the task and submits to the work-queue, from which the consumer takes the task when ready.
Fig1. Simple Work-Queue |
Fig2. Work-Queue with many paths in and out |
A nice possibility arises from having separated the phases of work with a work-queue: We can force a state-change if a task has waited too long in the queue (for example, to bump its priority somehow). This goes beyond the simple pattern described here, and probably needs another name to indicate that it is a Work-Queue with additional constraints - perhaps "Escalating Work-Queue"?
Fig3. Work-Queue with maximum wait-time threshold |
- Simply to mark a handover point, as an aid to configuration and visualisation of the steps in a work-flow.
- Isolating time-spent working from time-spent waiting for reporting purposes.
- Monitoring performance against Service-Level Agreements.
- Prevent some tasks idling in the queue for too long by bumping their priority when a certain wait-threshold is exceeded.
No comments:
Post a Comment