velocious 1.0.520 → 1.0.522
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/README.md +4 -2
- package/build/background-jobs/store.js +40 -0
- package/build/configuration-types.js +18 -4
- package/build/database/drivers/base.js +13 -0
- package/build/database/drivers/mysql/index.js +1 -0
- package/build/src/background-jobs/store.d.ts +14 -0
- package/build/src/background-jobs/store.d.ts.map +1 -1
- package/build/src/background-jobs/store.js +36 -1
- package/build/src/configuration-types.d.ts +36 -7
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +19 -5
- package/build/src/database/drivers/base.d.ts +12 -0
- package/build/src/database/drivers/base.d.ts.map +1 -1
- package/build/src/database/drivers/base.js +13 -1
- package/build/src/database/drivers/mysql/index.d.ts.map +1 -1
- package/build/src/database/drivers/mysql/index.js +2 -1
- package/build/src/tenants/tenant-aggregator.d.ts +180 -0
- package/build/src/tenants/tenant-aggregator.d.ts.map +1 -0
- package/build/src/tenants/tenant-aggregator.js +285 -0
- package/build/src/tenants/tenant.d.ts +13 -0
- package/build/src/tenants/tenant.d.ts.map +1 -1
- package/build/src/tenants/tenant.js +17 -1
- package/build/tenants/tenant-aggregator.js +351 -0
- package/build/tenants/tenant.js +17 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/background-jobs/store.js +40 -0
- package/src/configuration-types.js +18 -4
- package/src/database/drivers/base.js +13 -0
- package/src/database/drivers/mysql/index.js +1 -0
- package/src/tenants/tenant-aggregator.js +351 -0
- package/src/tenants/tenant.js +17 -0
package/README.md
CHANGED
|
@@ -2146,7 +2146,9 @@ backgroundJobs: {
|
|
|
2146
2146
|
}
|
|
2147
2147
|
```
|
|
2148
2148
|
|
|
2149
|
-
A job with no queue runs on `"default"`; a queue with no cap is unlimited. Caps are enforced through the durable per-key concurrency mechanism (the reserved `queue:<name>` key), hold regardless of how many worker processes run, and are reconciled against the existing backlog on startup when you change them. Scheduled jobs honor a job's `static queue` too.
|
|
2149
|
+
A job with no queue runs on `"default"`; a queue with no cap is unlimited. Caps are enforced through the durable per-key concurrency mechanism (the reserved `queue:<name>` key), hold regardless of how many worker processes run, and are reconciled against the existing backlog on startup when you change them. Scheduled jobs honor a job's `static queue` too.
|
|
2150
|
+
|
|
2151
|
+
Set `priority` (default `0`) to dispatch a queue ahead of lower-priority ones regardless of enqueue order, so a small time-critical queue is never starved by a flood of low-priority work sharing a worker pool. Unlike Sidekiq's strict queue ordering, priority composes with the caps: a higher-priority queue already at its `maxConcurrent` is skipped and dispatch falls through to the next eligible job. See [docs/background-jobs.md](docs/background-jobs.md#queues-per-queue-concurrency-caps).
|
|
2150
2152
|
|
|
2151
2153
|
## Retention
|
|
2152
2154
|
|
|
@@ -2294,6 +2296,6 @@ npx velocious db:tenants:migrate projectTenant --parallel 20
|
|
|
2294
2296
|
|
|
2295
2297
|
`afterMigrateTenant` hooks run inside the active default and tenant database connection scope for the tenant being migrated.
|
|
2296
2298
|
|
|
2297
|
-
At runtime, the apartment-style `Tenant` façade (`velocious/build/src/tenants/tenant.js`) is the single entry point: `Tenant.with(tenant, callback)` / `Tenant.current()` to switch into and read a tenant context, `Tenant.each({identifier, callback, parallel?, filter?})` to run a callback within every provider-listed tenant, and `Tenant.drop({identifier, tenant})` (plus the `db:tenants:drop` CLI command) to drop a tenant's database through the provider's `dropDatabase` hook. `Tenant.with` and `Tenant.each` run their callbacks inside `ensureConnections`, so switching into a tenant establishes its database connections (global + tenant) and passes them to the callback — the tenant is immediately queryable without the caller wiring up connections (already-open connections are reused, so nesting does not double-connect). `Tenant.with` is generic over its callback's return type, so a value returned from inside the tenant context comes back to the caller with its type preserved (no cast needed).
|
|
2299
|
+
At runtime, the apartment-style `Tenant` façade (`velocious/build/src/tenants/tenant.js`) is the single entry point: `Tenant.with(tenant, callback)` / `Tenant.current()` to switch into and read a tenant context, `Tenant.each({identifier, callback, parallel?, filter?})` to run a callback within every provider-listed tenant, and `Tenant.drop({identifier, tenant})` (plus the `db:tenants:drop` CLI command) to drop a tenant's database through the provider's `dropDatabase` hook. `Tenant.with` and `Tenant.each` run their callbacks inside `ensureConnections`, so switching into a tenant establishes its database connections (global + tenant) and passes them to the callback — the tenant is immediately queryable without the caller wiring up connections (already-open connections are reused, so nesting does not double-connect). `Tenant.with` is generic over its callback's return type, so a value returned from inside the tenant context comes back to the caller with its type preserved (no cast needed). `Tenant.aggregateAcross({identifier, aggregates, keyColumns, subquery, tenants?, filter?})` runs one aggregate over the same table across many tenant databases and returns the merged result — grouping tenants by server and using a single cross-database `UNION ALL` where the driver supports two-part `` `database`.`table` `` references (MySQL/MariaDB) or one query per tenant otherwise (PostgreSQL/SQLite/MSSQL).
|
|
2298
2300
|
|
|
2299
2301
|
See [docs/tenant-databases.md](docs/tenant-databases.md) for the full configuration and migration pattern.
|
|
@@ -225,6 +225,12 @@ export default class BackgroundJobsStore {
|
|
|
225
225
|
query = query.where({execution_mode: executionModes})
|
|
226
226
|
}
|
|
227
227
|
|
|
228
|
+
if (scheduledAtOperator === "<=") {
|
|
229
|
+
const priorityOrder = this._queuePriorityOrderSql(db)
|
|
230
|
+
|
|
231
|
+
if (priorityOrder) query = query.order(`${priorityOrder} DESC`)
|
|
232
|
+
}
|
|
233
|
+
|
|
228
234
|
query = query
|
|
229
235
|
.order("scheduled_at_ms ASC")
|
|
230
236
|
.order("created_at_ms ASC")
|
|
@@ -238,6 +244,40 @@ export default class BackgroundJobsStore {
|
|
|
238
244
|
return this._normalizeJobRow(row)
|
|
239
245
|
}
|
|
240
246
|
|
|
247
|
+
/**
|
|
248
|
+
* Builds a raw SQL ORDER BY expression ranking queued jobs by their queue's
|
|
249
|
+
* configured priority (`backgroundJobs.queues[queue].priority`, default `0`),
|
|
250
|
+
* so the dispatcher picks higher-priority queues first regardless of enqueue
|
|
251
|
+
* order. Only applied to the dispatch path (`scheduledAtOperator === "<="`);
|
|
252
|
+
* the future-scheduled lookup must stay strictly time-ordered. Composes with
|
|
253
|
+
* the concurrency EXISTS filter: a higher-priority queue already at its cap is
|
|
254
|
+
* filtered out, so dispatch falls through to the next eligible lower-priority
|
|
255
|
+
* job. Returns null when no queue configures a non-zero priority so the plain
|
|
256
|
+
* FIFO ordering is left untouched (and no needless filesort is introduced).
|
|
257
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
258
|
+
* @returns {string | null} - Raw SQL CASE expression, or null when no queue is prioritized.
|
|
259
|
+
*/
|
|
260
|
+
_queuePriorityOrderSql(db) {
|
|
261
|
+
const queues = this.configuration.getBackgroundJobsConfig().queues || {}
|
|
262
|
+
/** @type {Array<[string, number]>} */
|
|
263
|
+
const prioritized = []
|
|
264
|
+
|
|
265
|
+
for (const [queue, queueConfig] of Object.entries(queues)) {
|
|
266
|
+
const priority = queueConfig?.priority
|
|
267
|
+
|
|
268
|
+
if (Number.isFinite(priority) && Number(priority) !== 0) prioritized.push([queue, Number(priority)])
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (prioritized.length === 0) return null
|
|
272
|
+
|
|
273
|
+
const queueColumn = db.quoteColumn("queue")
|
|
274
|
+
const whens = prioritized
|
|
275
|
+
.map(([queue, priority]) => `WHEN ${db.quote(queue)} THEN ${priority}`)
|
|
276
|
+
.join(" ")
|
|
277
|
+
|
|
278
|
+
return `CASE COALESCE(${queueColumn}, ${db.quote(DEFAULT_QUEUE)}) ${whens} ELSE 0 END`
|
|
279
|
+
}
|
|
280
|
+
|
|
241
281
|
/**
|
|
242
282
|
* Runs get job.
|
|
243
283
|
* @param {string} jobId - Job id.
|
|
@@ -164,15 +164,29 @@
|
|
|
164
164
|
* allowed to keep in flight. Default: `4`. This is a per-worker safety cap;
|
|
165
165
|
* for workload-shaped limits use per-queue caps (`queues`) instead, which are
|
|
166
166
|
* enforced cluster-wide and are immune to duplicate worker processes.
|
|
167
|
-
* @property {Record<string, {maxConcurrent?: number}>} [queues] - Per-queue
|
|
168
|
-
* concurrency caps, Sidekiq-style. A job declares its queue (static
|
|
169
|
-
* the job class, or the `queue` enqueue option; defaults to `"default"`), and
|
|
167
|
+
* @property {Record<string, {maxConcurrent?: number, priority?: number}>} [queues] - Per-queue
|
|
168
|
+
* concurrency caps and dispatch priorities, Sidekiq-style. A job declares its queue (static
|
|
169
|
+
* `queue` on the job class, or the `queue` enqueue option; defaults to `"default"`), and
|
|
170
170
|
* `queues[name].maxConcurrent` bounds how many jobs from that queue may be
|
|
171
171
|
* in flight across the whole cluster (enforced via durable per-key
|
|
172
172
|
* concurrency, so it holds regardless of how many worker processes run).
|
|
173
173
|
* Size each queue to its workload: I/O-bound queues (e.g. build runners
|
|
174
174
|
* waiting on remote Docker servers) can run far above the core count, while
|
|
175
|
-
* CPU-bound queues should stay near it.
|
|
175
|
+
* CPU-bound queues should stay near it. `queues[name].priority` (default `0`)
|
|
176
|
+
* makes the main process dispatch higher-priority queues before lower-priority
|
|
177
|
+
* ones regardless of enqueue order, so a small time-critical queue can never be
|
|
178
|
+
* starved by a flood of low-priority work sharing a worker pool. Unlike
|
|
179
|
+
* Sidekiq's strict queue ordering, priority composes with the per-queue caps:
|
|
180
|
+
* a higher-priority queue that is already at its `maxConcurrent` is skipped and
|
|
181
|
+
* dispatch falls through to the next eligible lower-priority job, so a busy
|
|
182
|
+
* high-priority queue does not block everything else. This fallthrough is a
|
|
183
|
+
* property of the queue-derived cap; a job that supplies its own explicit
|
|
184
|
+
* `concurrencyKey`/`maxConcurrency` bypasses the queue cap entirely (an
|
|
185
|
+
* explicit key always wins — see above) and is bounded only by that key, so it
|
|
186
|
+
* is not held back by the queue's cap and priority simply orders it normally.
|
|
187
|
+
* Priorities may be any number, including negative to sink a queue below the
|
|
188
|
+
* default. Jobs within the same priority keep FIFO (`scheduled_at`, then
|
|
189
|
+
* `created_at`) order. Default: `{}` (no queue caps, all queues priority `0`).
|
|
176
190
|
* @property {BackgroundJobsDispatchStrategy} [dispatchStrategy] - How the main process
|
|
177
191
|
* detects new work. Defaults to `"beacon"` (event-driven). Set to `"polling"`
|
|
178
192
|
* to restore the legacy fixed-interval poll.
|
|
@@ -823,6 +823,19 @@ export default class VelociousDatabaseDriversBase {
|
|
|
823
823
|
*/
|
|
824
824
|
supportsInsertIntoReturning() { return false }
|
|
825
825
|
|
|
826
|
+
/**
|
|
827
|
+
* Whether a single connection can reference tables in another database on the same server via a
|
|
828
|
+
* two-part `database`.`table` identifier. When true, a query spanning several databases on this
|
|
829
|
+
* server can be expressed as one statement (a cross-tenant `UNION ALL`); when false, each database
|
|
830
|
+
* is queried on its own connection and the results merged in the caller. Only MySQL/MariaDB return
|
|
831
|
+
* true: PostgreSQL (one database per connection) and SQLite (one attached file per connection)
|
|
832
|
+
* cannot, and MSSQL is excluded because it reads a two-part name as `schema.table` (cross-database
|
|
833
|
+
* access needs a three-part `database.schema.table`), so it stays on the always-correct fan-out
|
|
834
|
+
* path. Consumed by `Tenant.aggregateAcross`.
|
|
835
|
+
* @returns {boolean} - Whether two-part cross-database references are supported.
|
|
836
|
+
*/
|
|
837
|
+
supportsCrossDatabaseReferences() { return false }
|
|
838
|
+
|
|
826
839
|
/**
|
|
827
840
|
* Runs table exists.
|
|
828
841
|
* @param {string} tableName - Table name.
|
|
@@ -375,6 +375,7 @@ export default class VelociousDatabaseDriversMysql extends Base{
|
|
|
375
375
|
*/
|
|
376
376
|
shouldSetAutoIncrementWhenPrimaryKey() { return true }
|
|
377
377
|
supportsDefaultPrimaryKeyUUID() { return false }
|
|
378
|
+
supportsCrossDatabaseReferences() { return true }
|
|
378
379
|
|
|
379
380
|
/**
|
|
380
381
|
* Runs escape.
|
|
@@ -72,6 +72,20 @@ export default class BackgroundJobsStore {
|
|
|
72
72
|
forked?: boolean | undefined;
|
|
73
73
|
executionMode?: import("./types.js").BackgroundJobExecutionMode | import("./types.js").BackgroundJobExecutionMode[] | undefined;
|
|
74
74
|
}): Promise<import("./types.js").BackgroundJobRow | null>;
|
|
75
|
+
/**
|
|
76
|
+
* Builds a raw SQL ORDER BY expression ranking queued jobs by their queue's
|
|
77
|
+
* configured priority (`backgroundJobs.queues[queue].priority`, default `0`),
|
|
78
|
+
* so the dispatcher picks higher-priority queues first regardless of enqueue
|
|
79
|
+
* order. Only applied to the dispatch path (`scheduledAtOperator === "<="`);
|
|
80
|
+
* the future-scheduled lookup must stay strictly time-ordered. Composes with
|
|
81
|
+
* the concurrency EXISTS filter: a higher-priority queue already at its cap is
|
|
82
|
+
* filtered out, so dispatch falls through to the next eligible lower-priority
|
|
83
|
+
* job. Returns null when no queue configures a non-zero priority so the plain
|
|
84
|
+
* FIFO ordering is left untouched (and no needless filesort is introduced).
|
|
85
|
+
* @param {import("../database/drivers/base.js").default} db - Database connection.
|
|
86
|
+
* @returns {string | null} - Raw SQL CASE expression, or null when no queue is prioritized.
|
|
87
|
+
*/
|
|
88
|
+
_queuePriorityOrderSql(db: import("../database/drivers/base.js").default): string | null;
|
|
75
89
|
/**
|
|
76
90
|
* Runs get job.
|
|
77
91
|
* @param {string} jobId - Job id.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/store.js"],"names":[],"mappings":"AAyCA;IACE;;;;;OAKG;IACH,mDAHG;QAAoD,aAAa,EAAzD,OAAO,qBAAqB,EAAE,OAAO;QACvB,kBAAkB;KAC1C,EAOA;IALC,qDAAkC;IAClC,uCAA4C;IAC5C,eAA8B;IAC9B,oCAAyB;IACzB,qCAAwC;IAG1C;;;OAGG;IACH,yBAFa,MAAM,CAMlB;IAED;;;OAGG;IACH,eAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;;;;;OAOG;IACH,oCALG;QAAqB,OAAO,EAApB,MAAM;QACS,IAAI,EAAnB,KAAK,CAAC,OAAC,CAAC;QACyC,OAAO;KAChE,GAAU,OAAO,CAAC,MAAM,CAAC,CA4D3B;IAED;;;;;;OAMG;IACH,wBAJG;QAAuB,MAAM;QACsF,aAAa;KAChI,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAajE;IAED;;;;;;;OAOG;IACH,oBAFa,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,CAQjE;IAED;;;;;;;;OAQG;IACH,mEANG;QAA4D,EAAE,EAAtD,OAAO,6BAA6B,EAAE,OAAO;QAC5B,mBAAmB,EAApC,IAAI,GAAG,GAAG;QACK,MAAM;QACsF,aAAa;KAChI,GAAU,OAAO,CAAC,OAAO,YAAY,EAAE,gBAAgB,GAAG,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/background-jobs/store.js"],"names":[],"mappings":"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"}
|