@dbos-inc/dbos-sdk 4.16.5-preview → 4.16.6-preview
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/wfqueue.d.ts +16 -4
- package/dist/src/wfqueue.d.ts.map +1 -1
- package/dist/src/wfqueue.js +77 -46
- package/dist/src/wfqueue.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/src/wfqueue.d.ts
CHANGED
|
@@ -26,6 +26,8 @@ export interface QueueParameters {
|
|
|
26
26
|
priorityEnabled?: boolean;
|
|
27
27
|
/** If set, this queue supports partitioning */
|
|
28
28
|
partitionQueue?: boolean;
|
|
29
|
+
/** Base (minimum) polling interval in ms for this queue's dispatch loop (default 1000) */
|
|
30
|
+
minPollingIntervalMs?: number;
|
|
29
31
|
}
|
|
30
32
|
/**
|
|
31
33
|
* Settings structure for a named workflow queue.
|
|
@@ -40,6 +42,7 @@ export declare class WorkflowQueue {
|
|
|
40
42
|
readonly workerConcurrency?: number;
|
|
41
43
|
readonly priorityEnabled: boolean;
|
|
42
44
|
readonly partitionQueue: boolean;
|
|
45
|
+
readonly minPollingIntervalMs?: number;
|
|
43
46
|
constructor(name: string);
|
|
44
47
|
/**
|
|
45
48
|
*
|
|
@@ -51,13 +54,22 @@ export declare class WorkflowQueue {
|
|
|
51
54
|
declare class WFQueueRunner {
|
|
52
55
|
readonly wfQueuesByName: Map<string, WorkflowQueue>;
|
|
53
56
|
private isRunning;
|
|
54
|
-
private
|
|
55
|
-
private
|
|
56
|
-
private
|
|
57
|
-
private
|
|
57
|
+
private stopResolve?;
|
|
58
|
+
private stopPromise?;
|
|
59
|
+
private exec?;
|
|
60
|
+
private listenQueuesArg;
|
|
61
|
+
private readonly activeLoops;
|
|
62
|
+
private static readonly defaultMinPollingIntervalMs;
|
|
63
|
+
private static readonly defaultMaxPollingIntervalMs;
|
|
64
|
+
private readonly backoffFactor;
|
|
65
|
+
private readonly scalebackFactor;
|
|
66
|
+
private readonly jitterMin;
|
|
67
|
+
private readonly jitterMax;
|
|
58
68
|
stop(): void;
|
|
59
69
|
clearRegistrations(): void;
|
|
70
|
+
private launchQueueLoop;
|
|
60
71
|
dispatchLoop(exec: DBOSExecutor, listenQueuesArg: WorkflowQueue[] | null): Promise<void>;
|
|
72
|
+
private runQueue;
|
|
61
73
|
logRegisteredEndpoints(exec: DBOSExecutor): void;
|
|
62
74
|
}
|
|
63
75
|
export declare const wfQueueRunner: WFQueueRunner;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wfqueue.d.ts","sourceRoot":"","sources":["../../src/wfqueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C;;;;;GAKG;AACH,UAAU,cAAc;IACtB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,2CAA2C;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"wfqueue.d.ts","sourceRoot":"","sources":["../../src/wfqueue.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAK/C;;;;;GAKG;AACH,UAAU,cAAc;IACtB,kDAAkD;IAClD,cAAc,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,wFAAwF;IACxF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,yEAAyE;IACzE,SAAS,CAAC,EAAE,cAAc,CAAC;IAC3B,2CAA2C;IAC3C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+CAA+C;IAC/C,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,0FAA0F;IAC1F,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;;;GAKG;AACH,qBAAa,aAAa;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC;IACpC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAS;IAC1C,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAS;IACzC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;gBAE3B,IAAI,EAAE,MAAM;IAExB;;;;OAIG;gBACS,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe;CA8B3D;AAED,cAAM,aAAa;IACjB,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAa;IAEhE,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,WAAW,CAAC,CAAa;IACjC,OAAO,CAAC,WAAW,CAAC,CAAgB;IACpC,OAAO,CAAC,IAAI,CAAC,CAAe;IAC5B,OAAO,CAAC,eAAe,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAgB;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAkB;IACrE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAe;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAE1C,IAAI;IAMJ,kBAAkB;IAIlB,OAAO,CAAC,eAAe;IAMjB,YAAY,CAAC,IAAI,EAAE,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAyBhF,QAAQ;IA0FtB,sBAAsB,CAAC,IAAI,EAAE,YAAY;CAc1C;AAED,eAAO,MAAM,aAAa,eAAsB,CAAC"}
|
package/dist/src/wfqueue.js
CHANGED
|
@@ -17,6 +17,7 @@ class WorkflowQueue {
|
|
|
17
17
|
workerConcurrency;
|
|
18
18
|
priorityEnabled = false;
|
|
19
19
|
partitionQueue = false;
|
|
20
|
+
minPollingIntervalMs;
|
|
20
21
|
constructor(name, arg2, rateLimit) {
|
|
21
22
|
this.name = name;
|
|
22
23
|
if (dbos_1.DBOS.isInitialized()) {
|
|
@@ -29,6 +30,7 @@ class WorkflowQueue {
|
|
|
29
30
|
this.workerConcurrency = arg2.workerConcurrency;
|
|
30
31
|
this.priorityEnabled = arg2.priorityEnabled ?? false;
|
|
31
32
|
this.partitionQueue = arg2.partitionQueue ?? false;
|
|
33
|
+
this.minPollingIntervalMs = arg2.minPollingIntervalMs;
|
|
32
34
|
}
|
|
33
35
|
else {
|
|
34
36
|
// Handle the case where the second argument is a number
|
|
@@ -45,69 +47,90 @@ exports.WorkflowQueue = WorkflowQueue;
|
|
|
45
47
|
class WFQueueRunner {
|
|
46
48
|
wfQueuesByName = new Map();
|
|
47
49
|
isRunning = false;
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
stopResolve;
|
|
51
|
+
stopPromise;
|
|
52
|
+
exec;
|
|
53
|
+
listenQueuesArg = null;
|
|
54
|
+
activeLoops = new Set();
|
|
55
|
+
static defaultMinPollingIntervalMs = 1000;
|
|
56
|
+
static defaultMaxPollingIntervalMs = 120000;
|
|
57
|
+
backoffFactor = 2.0;
|
|
58
|
+
scalebackFactor = 0.9;
|
|
59
|
+
jitterMin = 0.95;
|
|
60
|
+
jitterMax = 1.05;
|
|
52
61
|
stop() {
|
|
53
62
|
if (!this.isRunning)
|
|
54
63
|
return;
|
|
55
64
|
this.isRunning = false;
|
|
56
|
-
|
|
57
|
-
this.interruptResolve();
|
|
58
|
-
}
|
|
65
|
+
this.stopResolve?.();
|
|
59
66
|
}
|
|
60
67
|
clearRegistrations() {
|
|
61
68
|
this.wfQueuesByName.clear();
|
|
62
69
|
}
|
|
70
|
+
launchQueueLoop(queue) {
|
|
71
|
+
const loop = this.runQueue(this.exec, queue);
|
|
72
|
+
this.activeLoops.add(loop);
|
|
73
|
+
void loop.finally(() => this.activeLoops.delete(loop));
|
|
74
|
+
}
|
|
63
75
|
async dispatchLoop(exec, listenQueuesArg) {
|
|
64
76
|
this.isRunning = true;
|
|
77
|
+
this.exec = exec;
|
|
78
|
+
this.listenQueuesArg = listenQueuesArg;
|
|
79
|
+
this.stopPromise = new Promise((resolve) => {
|
|
80
|
+
this.stopResolve = resolve;
|
|
81
|
+
});
|
|
82
|
+
let listenQueues;
|
|
83
|
+
if (listenQueuesArg !== null) {
|
|
84
|
+
listenQueues = [...listenQueuesArg, this.wfQueuesByName.get(utils_1.INTERNAL_QUEUE_NAME)];
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
listenQueues = Array.from(this.wfQueuesByName.values());
|
|
88
|
+
}
|
|
89
|
+
// Start one loop per queue
|
|
90
|
+
for (const q of listenQueues) {
|
|
91
|
+
this.launchQueueLoop(q);
|
|
92
|
+
}
|
|
93
|
+
// Wait until stop() is called, then wait for all loops to drain
|
|
94
|
+
await this.stopPromise;
|
|
95
|
+
await Promise.all(this.activeLoops);
|
|
96
|
+
}
|
|
97
|
+
async runQueue(exec, queue) {
|
|
98
|
+
const minPollingMs = queue.minPollingIntervalMs ?? WFQueueRunner.defaultMinPollingIntervalMs;
|
|
99
|
+
const maxPollingMs = WFQueueRunner.defaultMaxPollingIntervalMs;
|
|
100
|
+
let currentPollingMs = minPollingMs;
|
|
65
101
|
while (this.isRunning) {
|
|
66
|
-
//
|
|
102
|
+
// Sleep with jitter, racing against the stop signal
|
|
103
|
+
const jitter = this.jitterMin + Math.random() * (this.jitterMax - this.jitterMin);
|
|
104
|
+
const sleepMs = currentPollingMs * jitter;
|
|
67
105
|
let timer;
|
|
68
106
|
const timeoutPromise = new Promise((resolve) => {
|
|
69
|
-
timer = setTimeout(
|
|
70
|
-
resolve();
|
|
71
|
-
}, this.pollingIntervalMs);
|
|
107
|
+
timer = setTimeout(resolve, sleepMs);
|
|
72
108
|
});
|
|
73
|
-
await Promise.race([timeoutPromise,
|
|
74
|
-
exec.logger.debug('Workflow queue loop interrupted!');
|
|
75
|
-
}); // Interrupt sleep throws
|
|
109
|
+
await Promise.race([timeoutPromise, this.stopPromise]);
|
|
76
110
|
clearTimeout(timer);
|
|
77
|
-
if (!this.isRunning)
|
|
111
|
+
if (!this.isRunning)
|
|
78
112
|
break;
|
|
79
|
-
|
|
80
|
-
let listenQueues;
|
|
81
|
-
if (listenQueuesArg !== null) {
|
|
82
|
-
// If explicitly listening for queues, use only those queues plus the internal queue
|
|
83
|
-
listenQueues = [...listenQueuesArg, this.wfQueuesByName.get(utils_1.INTERNAL_QUEUE_NAME)];
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
// Else, listen to all declared queues
|
|
87
|
-
listenQueues = Array.from(this.wfQueuesByName.values());
|
|
88
|
-
}
|
|
89
|
-
// Transition delayed workflows that are ready to execute
|
|
113
|
+
let contentionDetected = false;
|
|
90
114
|
try {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
115
|
+
// Transition delayed workflows that are ready to execute
|
|
116
|
+
try {
|
|
117
|
+
await exec.systemDatabase.transitionDelayedWorkflows();
|
|
118
|
+
}
|
|
119
|
+
catch (e) {
|
|
120
|
+
exec.logger.warn(`Error transitioning delayed workflows: ${e.message}`);
|
|
121
|
+
}
|
|
122
|
+
// Dequeue workflows for this queue
|
|
98
123
|
let wfids = [];
|
|
99
124
|
try {
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
const partitionKeys = await exec.systemDatabase.getQueuePartitions(q.name);
|
|
125
|
+
if (queue.partitionQueue) {
|
|
126
|
+
const partitionKeys = await exec.systemDatabase.getQueuePartitions(queue.name);
|
|
103
127
|
for (const partitionKey of partitionKeys) {
|
|
104
|
-
const partitionWfids = await exec.systemDatabase.findAndMarkStartableWorkflows(
|
|
128
|
+
const partitionWfids = await exec.systemDatabase.findAndMarkStartableWorkflows(queue, exec.executorID, utils_1.globalParams.appVersion, partitionKey);
|
|
105
129
|
wfids.push(...partitionWfids);
|
|
106
130
|
}
|
|
107
131
|
}
|
|
108
132
|
else {
|
|
109
|
-
|
|
110
|
-
wfids = await exec.systemDatabase.findAndMarkStartableWorkflows(q, exec.executorID, utils_1.globalParams.appVersion, undefined);
|
|
133
|
+
wfids = await exec.systemDatabase.findAndMarkStartableWorkflows(queue, exec.executorID, utils_1.globalParams.appVersion, undefined);
|
|
111
134
|
}
|
|
112
135
|
}
|
|
113
136
|
catch (e) {
|
|
@@ -115,12 +138,11 @@ class WFQueueRunner {
|
|
|
115
138
|
// Handle serialization errors and lock contention with backoff
|
|
116
139
|
if ('code' in err && (err.code === '40001' || err.code === '55P03')) {
|
|
117
140
|
// 40001: serialization_failure, 55P03: lock_not_available
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
exec.logger.warn(`Contention detected in queue thread for ${q.name}. Increasing polling interval to ${(this.pollingIntervalMs / 1000).toFixed(2)}s.`);
|
|
141
|
+
contentionDetected = true;
|
|
142
|
+
exec.logger.warn(`Contention detected in queue ${queue.name}.`);
|
|
121
143
|
}
|
|
122
144
|
else {
|
|
123
|
-
exec.logger.warn(`Error getting startable workflows: ${err.message}`);
|
|
145
|
+
exec.logger.warn(`Error getting startable workflows for queue ${queue.name}: ${err.message}`);
|
|
124
146
|
}
|
|
125
147
|
wfids = [];
|
|
126
148
|
}
|
|
@@ -129,15 +151,24 @@ class WFQueueRunner {
|
|
|
129
151
|
}
|
|
130
152
|
for (const wfid of wfids) {
|
|
131
153
|
try {
|
|
132
|
-
|
|
154
|
+
await exec.executeWorkflowId(wfid, { isQueueDispatch: true });
|
|
133
155
|
}
|
|
134
156
|
catch (e) {
|
|
135
157
|
exec.logger.warn(`Could not execute workflow with id ${wfid}: ${e.message}`);
|
|
136
158
|
}
|
|
137
159
|
}
|
|
138
160
|
}
|
|
139
|
-
|
|
140
|
-
|
|
161
|
+
catch (e) {
|
|
162
|
+
exec.logger.warn(`Error in queue ${queue.name} dispatch loop: ${e.message}`);
|
|
163
|
+
}
|
|
164
|
+
// Adjust polling interval based on contention
|
|
165
|
+
if (contentionDetected) {
|
|
166
|
+
currentPollingMs = Math.min(maxPollingMs, currentPollingMs * this.backoffFactor);
|
|
167
|
+
exec.logger.warn(`Increasing polling interval for queue ${queue.name} to ${(currentPollingMs / 1000).toFixed(2)}s due to contention.`);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
currentPollingMs = Math.max(minPollingMs, currentPollingMs * this.scalebackFactor);
|
|
171
|
+
}
|
|
141
172
|
}
|
|
142
173
|
}
|
|
143
174
|
logRegisteredEndpoints(exec) {
|
package/dist/src/wfqueue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wfqueue.js","sourceRoot":"","sources":["../../src/wfqueue.ts"],"names":[],"mappings":";;;AACA,iCAA8B;AAC9B,6CAAqF;AACrF,mCAA4D;
|
|
1
|
+
{"version":3,"file":"wfqueue.js","sourceRoot":"","sources":["../../src/wfqueue.ts"],"names":[],"mappings":"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"}
|