-
Notifications
You must be signed in to change notification settings - Fork 405
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(job): allow passing a debounce as option (#2666)
- Loading branch information
1 parent
64f58a9
commit 163ccea
Showing
33 changed files
with
443 additions
and
47 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,49 @@ | ||
# Debouncing | ||
|
||
Debouncing in BullMQ is a process where job execution is delayed and deduplicated based on specific identifiers. It ensures that within a specified period, or until a specific job is completed or failed, no new jobs with the same identifier will be added to the queue. Instead, these attempts will trigger a debounced event. | ||
|
||
## Fixed Mode | ||
|
||
In the Fixed Mode, debouncing works by assigning a delay (Time to Live, TTL) to a job upon its creation. If a similar job (identified by a unique debouncer ID) is added during this delay period, it is ignored. This prevents the queue from being overwhelmed with multiple instances of the same task, thus optimizing the processing time and resource utilization. | ||
|
||
```typescript | ||
import { Queue } from 'bullmq'; | ||
|
||
const myQueue = new Queue('Paint'); | ||
|
||
// Add a job that will be debounced for 5 seconds. | ||
await myQueue.add( | ||
'house', | ||
{ color: 'white' }, | ||
{ debounce: { id: 'customValue', ttl: 5000 } }, | ||
); | ||
``` | ||
|
||
In this example, after adding the house painting job with the debouncing parameters (id and ttl), any subsequent job with the same debouncing ID customValue added within 5 seconds will be ignored. This is useful for scenarios where rapid, repetitive requests are made, such as multiple users or processes attempting to trigger the same job. | ||
|
||
Note that you must provide a debounce id that should represent your job. You can hash your entire job data or a subset of attributes for creating this identifier. | ||
|
||
## Extended Mode | ||
|
||
The Extended Mode takes a different approach by extending the debouncing duration until the job's completion or failure. This means as long as the job remains in an incomplete state (neither succeeded nor failed), any subsequent job with the same debouncer ID will be ignored. | ||
|
||
```typescript | ||
// Add a job that will be debounced as this record is not finished (completed or failed). | ||
await myQueue.add( | ||
'house', | ||
{ color: 'white' }, | ||
{ debounce: { id: 'customValue' } }, | ||
); | ||
``` | ||
|
||
While this job is not moved to completed or failed state, next jobs added with same **debounce id** will be ignored and a _debounced_ event will be triggered by our QueueEvent class. | ||
|
||
This mode is particularly useful for jobs that have a long running time or those that must not be duplicated until they are resolved, such as processing a file upload or performing a critical update that should not be repeated if the initial attempt is still in progress. | ||
|
||
{% hint style="warning" %} | ||
Any manual deletion will disable the debouncing. For example, when calling _job.remove_ method. | ||
{% endhint %} | ||
|
||
## Read more: | ||
|
||
- 💡 [Add Job API Reference](https://api.docs.bullmq.io/classes/v5.Queue.html#add) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
--[[ | ||
Function to debounce a job. | ||
]] | ||
|
||
local function debounceJob(prefixKey, debounceOpts, jobId, debounceKey, eventsKey, maxEvents) | ||
local debounceId = debounceOpts and debounceOpts['id'] | ||
if debounceId then | ||
local ttl = debounceOpts['ttl'] | ||
local debounceKeyExists | ||
if ttl then | ||
debounceKeyExists = not rcall('SET', debounceKey, jobId, 'PX', ttl, 'NX') | ||
else | ||
debounceKeyExists = not rcall('SET', debounceKey, jobId, 'NX') | ||
end | ||
if debounceKeyExists then | ||
local currentDebounceJobId = rcall('GET', debounceKey) | ||
rcall("XADD", eventsKey, "MAXLEN", "~", maxEvents, "*", "event", | ||
"debounced", "jobId", currentDebounceJobId) | ||
return currentDebounceJobId | ||
end | ||
end | ||
end | ||
|
Oops, something went wrong.