@yss123/cage-kernel 0.2.0 → 0.3.0
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 +70 -10
- package/dist/authorization.d.ts +34 -0
- package/dist/authorization.js +89 -0
- package/dist/authorization.js.map +1 -0
- package/dist/brands.d.ts +10 -0
- package/dist/brands.js +11 -1
- package/dist/brands.js.map +1 -1
- package/dist/db/connect.d.ts +14 -0
- package/dist/db/connect.js +18 -2
- package/dist/db/connect.js.map +1 -1
- package/dist/db/ddl.d.ts +32 -0
- package/dist/db/ddl.js +36 -0
- package/dist/db/ddl.js.map +1 -1
- package/dist/db/event-version-schema.d.ts +9 -0
- package/dist/db/event-version-schema.js +10 -0
- package/dist/db/event-version-schema.js.map +1 -0
- package/dist/db/index.d.ts +4 -0
- package/dist/db/index.js +4 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrate.d.ts +10 -0
- package/dist/db/migrate.js +9 -1
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/rows.d.ts +2 -0
- package/dist/db/rows.js +3 -0
- package/dist/db/rows.js.map +1 -1
- package/dist/db/runtime-schema.d.ts +9 -0
- package/dist/db/runtime-schema.js +41 -0
- package/dist/db/runtime-schema.js.map +1 -0
- package/dist/db/session.d.ts +6 -0
- package/dist/db/session.js +6 -0
- package/dist/db/session.js.map +1 -1
- package/dist/errors.d.ts +12 -0
- package/dist/errors.js +12 -0
- package/dist/errors.js.map +1 -1
- package/dist/files/links.d.ts +10 -0
- package/dist/files/links.js +50 -0
- package/dist/files/links.js.map +1 -0
- package/dist/files/schema.d.ts +9 -0
- package/dist/files/schema.js +51 -0
- package/dist/files/schema.js.map +1 -0
- package/dist/index.d.ts +11 -2
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +86 -0
- package/dist/kernel.js +65 -40
- package/dist/kernel.js.map +1 -1
- package/dist/mask.d.ts +6 -0
- package/dist/mask.js +6 -0
- package/dist/mask.js.map +1 -1
- package/dist/org.d.ts +7 -0
- package/dist/org.js +5 -0
- package/dist/org.js.map +1 -1
- package/dist/pipeline/draft.d.ts +16 -0
- package/dist/pipeline/draft.js +39 -0
- package/dist/pipeline/draft.js.map +1 -0
- package/dist/pipeline/idempotency.d.ts +6 -0
- package/dist/pipeline/idempotency.js +6 -0
- package/dist/pipeline/idempotency.js.map +1 -1
- package/dist/pipeline/invoker.d.ts +9 -0
- package/dist/pipeline/invoker.js +22 -0
- package/dist/pipeline/invoker.js.map +1 -0
- package/dist/pipeline/load.d.ts +13 -0
- package/dist/pipeline/load.js +13 -0
- package/dist/pipeline/load.js.map +1 -1
- package/dist/primitives/aggregate.d.ts +95 -2
- package/dist/primitives/aggregate.js +13 -1
- package/dist/primitives/aggregate.js.map +1 -1
- package/dist/primitives/business-process.d.ts +128 -0
- package/dist/primitives/business-process.js +62 -0
- package/dist/primitives/business-process.js.map +1 -0
- package/dist/primitives/collection.d.ts +65 -0
- package/dist/primitives/collection.js +79 -0
- package/dist/primitives/collection.js.map +1 -0
- package/dist/primitives/command.d.ts +110 -11
- package/dist/primitives/command.js +16 -0
- package/dist/primitives/command.js.map +1 -1
- package/dist/primitives/constraints.d.ts +30 -1
- package/dist/primitives/constraints.js +14 -0
- package/dist/primitives/constraints.js.map +1 -1
- package/dist/primitives/event.d.ts +36 -0
- package/dist/primitives/event.js +10 -1
- package/dist/primitives/event.js.map +1 -1
- package/dist/primitives/fields.d.ts +136 -16
- package/dist/primitives/fields.js +104 -13
- package/dist/primitives/fields.js.map +1 -1
- package/dist/primitives/flow.d.ts +173 -8
- package/dist/primitives/flow.js +29 -2
- package/dist/primitives/flow.js.map +1 -1
- package/dist/primitives/states.d.ts +34 -2
- package/dist/primitives/states.js +15 -0
- package/dist/primitives/states.js.map +1 -1
- package/dist/read.d.ts +31 -1
- package/dist/read.js +137 -39
- package/dist/read.js.map +1 -1
- package/dist/registry.d.ts +51 -1
- package/dist/registry.js +79 -5
- package/dist/registry.js.map +1 -1
- package/dist/relations.d.ts +7 -0
- package/dist/relations.js +7 -0
- package/dist/relations.js.map +1 -1
- package/dist/runtime.d.ts +35 -0
- package/dist/runtime.js +9 -0
- package/dist/runtime.js.map +1 -0
- package/dist/scope/index.d.ts +5 -0
- package/dist/scope/index.js +5 -0
- package/dist/scope/index.js.map +1 -1
- package/dist/telemetry.d.ts +8 -0
- package/dist/telemetry.js +28 -3
- package/dist/telemetry.js.map +1 -1
- package/dist/transfer/csv.d.ts +11 -0
- package/dist/transfer/csv.js +11 -0
- package/dist/transfer/csv.js.map +1 -1
- package/dist/transfer/index.d.ts +18 -0
- package/dist/transfer/index.js +34 -8
- package/dist/transfer/index.js.map +1 -1
- package/dist/transfer/schema.d.ts +5 -0
- package/dist/transfer/schema.js +5 -0
- package/dist/transfer/schema.js.map +1 -1
- package/dist/types.d.ts +38 -2
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -1
- package/dist/util/names.d.ts +6 -0
- package/dist/util/names.js +6 -0
- package/dist/util/names.js.map +1 -1
- package/dist/worker/consumers.d.ts +7 -0
- package/dist/worker/consumers.js +21 -9
- package/dist/worker/consumers.js.map +1 -1
- package/dist/worker/health.d.ts +38 -0
- package/dist/worker/health.js +20 -0
- package/dist/worker/health.js.map +1 -0
- package/dist/worker/index.d.ts +34 -1
- package/dist/worker/index.js +175 -38
- package/dist/worker/index.js.map +1 -1
- package/dist/worker/outbox.d.ts +25 -2
- package/dist/worker/outbox.js +40 -2
- package/dist/worker/outbox.js.map +1 -1
- package/dist/worker/scheduler.d.ts +10 -1
- package/dist/worker/scheduler.js +34 -4
- package/dist/worker/scheduler.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/worker/health.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAGrD,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAwB,CAAC;AA0B5H,uDAAuD;AACvD,MAAM,UAAU,iBAAiB,CAAC,CAAS,EAAE,SAA0B;IACrE,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACnI,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtH,OAAO;QACL,OAAO,EAAE,eAAe,EAAE,CAAC,EAAE,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrH,SAAS,EAAE,OAAO;QAClB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9K,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;KAChD,CAAC;AACJ,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,OAAO,EAAgC,CAAC;AAC9D,kEAAkE;AAClE,MAAM,UAAU,sBAAsB,CAAC,CAAS,EAAE,QAA8B,IAAU,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;AACvH,+CAA+C;AAC/C,MAAM,UAAU,cAAc,CAAC,CAAS,IAA2B,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC"}
|
package/dist/worker/index.d.ts
CHANGED
|
@@ -3,17 +3,24 @@ import { type Kernel } from '../kernel.js';
|
|
|
3
3
|
import { type Logger } from '../telemetry.js';
|
|
4
4
|
import { type ApprovalEngine } from './consumers.js';
|
|
5
5
|
import { type EventConsumer } from './outbox.js';
|
|
6
|
+
import { type WorkerManifest, type WorkerSnapshot } from './health.js';
|
|
6
7
|
export * from './outbox.js';
|
|
7
8
|
export * from './consumers.js';
|
|
8
9
|
export * from './scheduler.js';
|
|
10
|
+
export * from './health.js';
|
|
11
|
+
/** 生命周期装配选项;注入 kernel 时 worker 不拥有其关闭权,所有带 Ms 后缀的时限均为毫秒。 */
|
|
9
12
|
export interface WorkerOptions {
|
|
13
|
+
/** 未注入 kernel 时用于创建内核的领域导出;必须与 API 使用同一业务版本。 */
|
|
10
14
|
domain?: object | object[];
|
|
15
|
+
/** 可选现有内核,提供时由宿主负责关闭;worker 仍拥有自己创建的监听及锁连接。 */
|
|
11
16
|
kernel?: Kernel;
|
|
17
|
+
/** 数据库账号连接;未注入内核时缺省从环境读取,专用监听连接也需要 app URL。 */
|
|
12
18
|
urls?: DatabaseUrls;
|
|
13
19
|
/** 同时处理的事件数 */
|
|
14
20
|
concurrency?: number;
|
|
15
21
|
/** 没收到 NOTIFY 时的轮询间隔 */
|
|
16
22
|
pollIntervalMs?: number;
|
|
23
|
+
/** 单个 outbox 事件的最大投递尝试次数,缺省使用 MAX_ATTEMPTS;失败终结后需人工诊断。 */
|
|
17
24
|
maxAttempts?: number;
|
|
18
25
|
/** 外部审批引擎(按流程名);不传时使用代码内封闭路由 */
|
|
19
26
|
approvalEngines?: Record<string, ApprovalEngine>;
|
|
@@ -21,16 +28,42 @@ export interface WorkerOptions {
|
|
|
21
28
|
consumers?: EventConsumer[];
|
|
22
29
|
/** 是否运行定时任务,默认 true */
|
|
23
30
|
jobs?: boolean;
|
|
31
|
+
/** 停止后等待所有在途任务的时限;超时不会提前释放仍在执行的任务锁。 */
|
|
32
|
+
shutdownTimeoutMs?: number;
|
|
33
|
+
/** 调度扫描间隔,默认 5 秒;错过周期跳过,不积压补跑。 */
|
|
34
|
+
schedulerIntervalMs?: number;
|
|
35
|
+
/** 后台循环日志出口;省略使用默认日志器,不应在日志中输出完整连接、载荷或凭据。 */
|
|
24
36
|
logger?: Logger;
|
|
25
37
|
}
|
|
38
|
+
/** stop 可重复调用并复用同一停机 Promise;snapshot 是观测证据,不可用于绕过数据库互斥。 */
|
|
26
39
|
export interface WorkerHandle {
|
|
40
|
+
/** 供消费者复用的执行内核;是否由 stop 关闭取决于是否由 worker 创建。 */
|
|
27
41
|
kernel: Kernel;
|
|
42
|
+
/** 当前装配的全部消费者,包含框架、扩展及宿主补充项。 */
|
|
28
43
|
consumers: EventConsumer[];
|
|
29
|
-
/**
|
|
44
|
+
/** 注册指纹与消费者清单,用于判断实际装载版本;不证明某事件已经消费成功。 */
|
|
45
|
+
manifest: WorkerManifest;
|
|
46
|
+
/** 读取此进程最新内存状态、在途任务及心跳证据;人工驱动实例返回 manual/stopped 摘要。 */
|
|
47
|
+
snapshot(): WorkerSnapshot;
|
|
48
|
+
/** 手动处理当前可领取事件及扩展工作,默认最多 50 轮;返回处理数量,不代表未来重试或死信已清空。 */
|
|
30
49
|
drain(maxRounds?: number): Promise<number>;
|
|
50
|
+
/** 停止新工作并等待在途任务;超时会拒绝等待,但不会提前释放仍执行中的任务锁。 */
|
|
31
51
|
stop(): Promise<void>;
|
|
32
52
|
}
|
|
53
|
+
/** 合并内置、扩展和额外消费者,显式审批引擎覆盖同名代码路由;缺失引擎或名称冲突在启动前失败。 */
|
|
33
54
|
export declare function buildConsumers(k: Kernel, opts?: Pick<WorkerOptions, 'approvalEngines' | 'consumers'>): EventConsumer[];
|
|
55
|
+
/** 构建并验证消费者后描述装载清单;这不启动轮询、建立心跳或证明 worker 正在运行。 */
|
|
56
|
+
export declare function workerManifest(k: Kernel, opts?: Pick<WorkerOptions, 'approvalEngines' | 'consumers'>): WorkerManifest;
|
|
34
57
|
/** 不启动循环,只创建可手动驱动的 worker(测试用) */
|
|
58
|
+
/**
|
|
59
|
+
* 手动驱动当前可领取任务,drain 默认最多 50 轮;无到期事件且扩展无进展即返回处理数量。
|
|
60
|
+
* 未来重试、死信及被前序阻塞的事件仍可能存在,因此 drain 返回并不证明完整业务链已经成功。
|
|
61
|
+
*/
|
|
35
62
|
export declare function createWorker(k: Kernel, opts?: WorkerOptions): Omit<WorkerHandle, 'stop'>;
|
|
63
|
+
/**
|
|
64
|
+
* 装配服务和消费者后,建立独立 LISTEN/调度锁连接,写首个心跳,再启动投递、定时任务和维护循环。
|
|
65
|
+
* 所有后台 Promise 统一登记,停机先停止新工作、取消可取消 IO,再等待在途工作后释放连接与锁。
|
|
66
|
+
* 停机超时只向调用方报错,不提前关闭仍持有任务锁的连接;后台清理继续等待真实任务结束。
|
|
67
|
+
* LISTEN 失效可由轮询继续发现 outbox;调度连接异常会停止新调度,健康状态如实反映该区别。
|
|
68
|
+
*/
|
|
36
69
|
export declare function startWorker(opts?: WorkerOptions): Promise<WorkerHandle>;
|
package/dist/worker/index.js
CHANGED
|
@@ -1,31 +1,52 @@
|
|
|
1
1
|
// worker 进程:投递 outbox、执行反应、启动审批、跑定时任务、调用第三方。与 api 同一份代码和镜像,只是启动命令不同。
|
|
2
2
|
import { sql } from 'kysely';
|
|
3
|
+
import { randomUUID } from 'node:crypto';
|
|
4
|
+
import { runtimeServices } from '../runtime.js';
|
|
3
5
|
import { dedicatedClient, urlsFromEnv } from '../db/connect.js';
|
|
4
6
|
import { createKernel } from '../kernel.js';
|
|
5
7
|
import { consoleLogger } from '../telemetry.js';
|
|
6
8
|
import { approvalConsumers, extensionConsumers, reactionConsumers, routeEngines, } from './consumers.js';
|
|
7
|
-
import { claimBatch, deliver, MAX_ATTEMPTS, sweepStale } from './outbox.js';
|
|
9
|
+
import { claimBatch, deliver, MAX_ATTEMPTS, registerConsumerManifest, sweepStale } from './outbox.js';
|
|
8
10
|
import { nextRun, tick } from './scheduler.js';
|
|
9
11
|
import { expireTransfers, transferConsumer } from '../transfer/index.js';
|
|
12
|
+
import { describeConsumers, registerWorkerSnapshot } from './health.js';
|
|
10
13
|
export * from './outbox.js';
|
|
11
14
|
export * from './consumers.js';
|
|
12
15
|
export * from './scheduler.js';
|
|
16
|
+
export * from './health.js';
|
|
17
|
+
/** 合并内置、扩展和额外消费者,显式审批引擎覆盖同名代码路由;缺失引擎或名称冲突在启动前失败。 */
|
|
13
18
|
export function buildConsumers(k, opts = {}) {
|
|
14
19
|
const engines = { ...routeEngines(k), ...(opts.approvalEngines ?? {}) };
|
|
15
|
-
|
|
20
|
+
const consumers = [transferConsumer(k), ...reactionConsumers(k), ...approvalConsumers(k, engines), ...extensionConsumers(k), ...(opts.consumers ?? [])];
|
|
21
|
+
registerConsumerManifest(k, consumers);
|
|
22
|
+
return consumers;
|
|
23
|
+
}
|
|
24
|
+
/** 构建并验证消费者后描述装载清单;这不启动轮询、建立心跳或证明 worker 正在运行。 */
|
|
25
|
+
export function workerManifest(k, opts = {}) {
|
|
26
|
+
return describeConsumers(k, buildConsumers(k, opts));
|
|
16
27
|
}
|
|
17
28
|
/** 不启动循环,只创建可手动驱动的 worker(测试用) */
|
|
29
|
+
/**
|
|
30
|
+
* 手动驱动当前可领取任务,drain 默认最多 50 轮;无到期事件且扩展无进展即返回处理数量。
|
|
31
|
+
* 未来重试、死信及被前序阻塞的事件仍可能存在,因此 drain 返回并不证明完整业务链已经成功。
|
|
32
|
+
*/
|
|
18
33
|
export function createWorker(k, opts = {}) {
|
|
34
|
+
const services = runtimeServices(k);
|
|
19
35
|
const consumers = buildConsumers(k, opts);
|
|
36
|
+
const manifest = describeConsumers(k, consumers);
|
|
20
37
|
const max = opts.maxAttempts ?? MAX_ATTEMPTS;
|
|
21
38
|
return {
|
|
22
39
|
kernel: k,
|
|
23
40
|
consumers,
|
|
41
|
+
manifest,
|
|
42
|
+
snapshot: () => ({ id: 'manual', pid: process.pid, status: 'stopped', listenerHealthy: false, schedulerHealthy: false, heartbeatAt: null, inFlight: [], lastError: null, manifest }),
|
|
24
43
|
async drain(maxRounds = 50) {
|
|
25
44
|
let n = 0;
|
|
26
45
|
for (let i = 0; i < maxRounds; i++) {
|
|
27
46
|
const rows = await claimBatch(k, opts.concurrency ?? 8);
|
|
28
|
-
|
|
47
|
+
const extra = (await Promise.all(services.map(service => service.tick()))).reduce((a, b) => a + b, 0);
|
|
48
|
+
n += extra;
|
|
49
|
+
if (rows.length === 0 && extra === 0)
|
|
29
50
|
break;
|
|
30
51
|
await Promise.all(rows.map((r) => deliver(k, r, consumers, max)));
|
|
31
52
|
n += rows.length;
|
|
@@ -34,34 +55,116 @@ export function createWorker(k, opts = {}) {
|
|
|
34
55
|
},
|
|
35
56
|
};
|
|
36
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* 装配服务和消费者后,建立独立 LISTEN/调度锁连接,写首个心跳,再启动投递、定时任务和维护循环。
|
|
60
|
+
* 所有后台 Promise 统一登记,停机先停止新工作、取消可取消 IO,再等待在途工作后释放连接与锁。
|
|
61
|
+
* 停机超时只向调用方报错,不提前关闭仍持有任务锁的连接;后台清理继续等待真实任务结束。
|
|
62
|
+
* LISTEN 失效可由轮询继续发现 outbox;调度连接异常会停止新调度,健康状态如实反映该区别。
|
|
63
|
+
*/
|
|
37
64
|
export async function startWorker(opts = {}) {
|
|
38
65
|
const log = opts.logger ?? consoleLogger;
|
|
39
66
|
const urls = opts.urls ?? (opts.kernel ? undefined : urlsFromEnv());
|
|
40
67
|
const k = opts.kernel ?? createKernel({ domain: opts.domain ?? {}, urls, logger: log });
|
|
41
|
-
|
|
68
|
+
let w;
|
|
69
|
+
try {
|
|
70
|
+
w = createWorker(k, opts);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if (!opts.kernel)
|
|
74
|
+
await k.close();
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
42
77
|
const concurrency = opts.concurrency ?? 8;
|
|
43
78
|
const poll = opts.pollIntervalMs ?? 500;
|
|
44
79
|
let stopped = false;
|
|
45
80
|
let wake = null;
|
|
46
81
|
const timers = [];
|
|
47
|
-
|
|
82
|
+
const controller = new AbortController();
|
|
83
|
+
const services = runtimeServices(k);
|
|
84
|
+
const active = new Map();
|
|
85
|
+
const deliveries = new Set();
|
|
86
|
+
const state = {
|
|
87
|
+
id: randomUUID(), pid: process.pid, status: 'starting', listenerHealthy: false, schedulerHealthy: opts.jobs !== false,
|
|
88
|
+
heartbeatAt: null, inFlight: [], lastError: null, manifest: w.manifest,
|
|
89
|
+
};
|
|
90
|
+
const snapshot = () => ({ ...state, inFlight: [...active.keys(), ...[...deliveries].map((id) => `outbox:${id}`)] });
|
|
91
|
+
registerWorkerSnapshot(k, snapshot);
|
|
92
|
+
const failed = (name, e) => {
|
|
93
|
+
state.lastError = `${name}: ${e?.message ?? String(e)}`;
|
|
94
|
+
log.error({ task: name, err: state.lastError }, 'worker 后台任务失败');
|
|
95
|
+
};
|
|
96
|
+
// 所有定时器回调都进入同一跟踪器,停机才能真正等待已启动的任务。
|
|
97
|
+
const launch = (name, run) => {
|
|
98
|
+
if (stopped)
|
|
99
|
+
return;
|
|
100
|
+
if (active.has(name)) {
|
|
101
|
+
log.info({ task: name, reason: 'already-running' }, '跳过重叠的后台任务周期');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const task = Promise.resolve().then(run).then(() => { }, (e) => failed(name, e)).finally(() => active.delete(name));
|
|
105
|
+
active.set(name, task);
|
|
106
|
+
};
|
|
107
|
+
const heartbeat = async () => {
|
|
108
|
+
const now = new Date();
|
|
109
|
+
await k.app.insertInto('sys.worker_runtime').values({ id: state.id, pid: process.pid, registry_fingerprint: w.manifest.registryFingerprint,
|
|
110
|
+
manifest: JSON.stringify(w.manifest), status: state.status, details: JSON.stringify(snapshot()), heartbeat_at: now })
|
|
111
|
+
.onConflict((oc) => oc.column('id').doUpdateSet({ status: state.status, details: JSON.stringify(snapshot()), heartbeat_at: now })).execute();
|
|
112
|
+
state.heartbeatAt = now.toISOString();
|
|
113
|
+
};
|
|
48
114
|
const appUrl = urls?.app ?? urlsFromEnv().app;
|
|
49
|
-
|
|
50
|
-
|
|
115
|
+
let listener = null;
|
|
116
|
+
let lockConn = null;
|
|
117
|
+
try {
|
|
118
|
+
for (const service of services)
|
|
119
|
+
await service.ready();
|
|
120
|
+
listener = await dedicatedClient(appUrl, 'cage-worker-listen');
|
|
121
|
+
await listener.query('LISTEN cage_outbox');
|
|
122
|
+
state.listenerHealthy = true;
|
|
123
|
+
if (opts.jobs !== false && k.registry.jobs.length > 0) {
|
|
124
|
+
lockConn = await dedicatedClient(appUrl, 'cage-scheduler');
|
|
125
|
+
lockConn.on('error', (e) => { state.schedulerHealthy = false; failed('scheduler-connection', e); });
|
|
126
|
+
lockConn.on('end', () => { state.schedulerHealthy = false; });
|
|
127
|
+
}
|
|
128
|
+
state.status = 'running';
|
|
129
|
+
await heartbeat();
|
|
130
|
+
}
|
|
131
|
+
catch (e) {
|
|
132
|
+
state.status = 'error';
|
|
133
|
+
await Promise.allSettled(services.map(service => service.close()));
|
|
134
|
+
await listener?.end().catch(() => { });
|
|
135
|
+
await lockConn?.end().catch(() => { });
|
|
136
|
+
if (!opts.kernel)
|
|
137
|
+
await k.close();
|
|
138
|
+
throw e;
|
|
139
|
+
}
|
|
51
140
|
listener.on('notification', () => wake?.());
|
|
52
|
-
listener.on('error', (e) =>
|
|
141
|
+
listener.on('error', (e) => { state.listenerHealthy = false; failed('outbox-listener', e); });
|
|
142
|
+
listener.on('end', () => { state.listenerHealthy = false; });
|
|
53
143
|
const loop = (async () => {
|
|
54
144
|
while (!stopped) {
|
|
55
145
|
try {
|
|
56
146
|
const rows = await claimBatch(k, concurrency);
|
|
57
147
|
if (rows.length > 0) {
|
|
58
|
-
await Promise.
|
|
148
|
+
const results = await Promise.allSettled(rows.map(async (row) => {
|
|
149
|
+
deliveries.add(row.id);
|
|
150
|
+
try {
|
|
151
|
+
await deliver(k, row, w.consumers, opts.maxAttempts ?? MAX_ATTEMPTS, { signal: controller.signal });
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
deliveries.delete(row.id);
|
|
155
|
+
}
|
|
156
|
+
}));
|
|
157
|
+
for (const result of results)
|
|
158
|
+
if (result.status === 'rejected')
|
|
159
|
+
failed('outbox-delivery', result.reason);
|
|
59
160
|
continue;
|
|
60
161
|
}
|
|
61
162
|
}
|
|
62
163
|
catch (e) {
|
|
63
|
-
|
|
164
|
+
failed('outbox-claim', e);
|
|
64
165
|
}
|
|
166
|
+
if (stopped)
|
|
167
|
+
break;
|
|
65
168
|
await new Promise((resolve) => {
|
|
66
169
|
const t = setTimeout(resolve, poll);
|
|
67
170
|
wake = () => {
|
|
@@ -72,50 +175,84 @@ export async function startWorker(opts = {}) {
|
|
|
72
175
|
wake = null;
|
|
73
176
|
}
|
|
74
177
|
})();
|
|
75
|
-
|
|
76
|
-
|
|
178
|
+
for (const [index, service] of services.entries()) {
|
|
179
|
+
const run = () => launch(`runtime:${index}`, () => service.tick(controller.signal));
|
|
180
|
+
run();
|
|
181
|
+
timers.push(setInterval(run, poll));
|
|
182
|
+
}
|
|
183
|
+
timers.push(setInterval(() => launch('sweep', () => sweepStale(k)), 60_000));
|
|
77
184
|
const housekeeping = async () => {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
await expireTransfers(k);
|
|
83
|
-
}
|
|
84
|
-
catch (e) {
|
|
85
|
-
log.warn({ err: String(e) }, '日常维护失败');
|
|
86
|
-
}
|
|
185
|
+
await sql `select sys.ensure_audit_partitions(3)`.execute(k.app);
|
|
186
|
+
await k.app.deleteFrom('sys.idempotency').where('expires_at', '<', new Date()).execute();
|
|
187
|
+
await k.app.deleteFrom('sys.session').where('expires_at', '<', new Date()).execute();
|
|
188
|
+
await expireTransfers(k);
|
|
87
189
|
};
|
|
88
|
-
|
|
89
|
-
timers.push(setInterval(() =>
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
190
|
+
launch('housekeeping', housekeeping);
|
|
191
|
+
timers.push(setInterval(() => launch('housekeeping', housekeeping), 3600_000));
|
|
192
|
+
timers.push(setInterval(() => launch('heartbeat', async () => {
|
|
193
|
+
// 活跃投递续期,清扫器只恢复真正失去执行者的消息。
|
|
194
|
+
if (deliveries.size)
|
|
195
|
+
await k.app.updateTable('sys.outbox').set({ locked_at: sql `now()` }).where('id', 'in', [...deliveries]).where('status', '=', 'processing').execute();
|
|
196
|
+
await heartbeat();
|
|
197
|
+
}), 15_000));
|
|
198
|
+
if (lockConn) {
|
|
94
199
|
const due = new Map(k.registry.jobs.map((j) => [j.name, nextRun(j.cron, new Date())]));
|
|
95
200
|
timers.push(setInterval(() => {
|
|
201
|
+
if (!state.schedulerHealthy || stopped)
|
|
202
|
+
return;
|
|
96
203
|
const now = new Date();
|
|
97
204
|
for (const j of k.registry.jobs) {
|
|
98
205
|
const at = due.get(j.name);
|
|
99
206
|
if (now < at)
|
|
100
207
|
continue;
|
|
101
208
|
due.set(j.name, nextRun(j.cron, now));
|
|
102
|
-
|
|
209
|
+
launch(`job:${j.name}`, () => tick(k, j, lockConn, at));
|
|
103
210
|
}
|
|
104
|
-
}, 5_000));
|
|
211
|
+
}, opts.schedulerIntervalMs ?? 5_000));
|
|
105
212
|
}
|
|
106
|
-
log.info({
|
|
213
|
+
log.info({ ...w.manifest, workerId: state.id }, 'worker 已启动');
|
|
214
|
+
let stopping = null;
|
|
107
215
|
return {
|
|
108
216
|
...w,
|
|
109
|
-
|
|
217
|
+
snapshot,
|
|
218
|
+
stop() {
|
|
219
|
+
if (state.status === 'stopped')
|
|
220
|
+
return Promise.resolve();
|
|
221
|
+
if (stopping)
|
|
222
|
+
return stopping;
|
|
110
223
|
stopped = true;
|
|
224
|
+
state.status = 'stopping';
|
|
225
|
+
for (const timer of timers)
|
|
226
|
+
clearInterval(timer);
|
|
111
227
|
wake?.();
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
await
|
|
228
|
+
controller.abort(new Error('worker 正在停止'));
|
|
229
|
+
const cleanup = (async () => {
|
|
230
|
+
await loop;
|
|
231
|
+
await Promise.allSettled([...active.values()]);
|
|
232
|
+
await Promise.all(services.map(service => service.close()));
|
|
233
|
+
// 仍在执行的 scheduler Promise 完成后才允许关闭 session,释放跨实例锁。
|
|
234
|
+
await listener.end();
|
|
235
|
+
await lockConn?.end();
|
|
236
|
+
state.status = 'stopped';
|
|
237
|
+
state.listenerHealthy = false;
|
|
238
|
+
state.schedulerHealthy = false;
|
|
239
|
+
try {
|
|
240
|
+
await heartbeat();
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
if (!opts.kernel)
|
|
244
|
+
await k.close();
|
|
245
|
+
}
|
|
246
|
+
})();
|
|
247
|
+
stopping = new Promise((resolve, reject) => {
|
|
248
|
+
const timeout = setTimeout(() => {
|
|
249
|
+
state.lastError = `[CAGE-WORKER-003] 停机等待超时,在途任务:${snapshot().inFlight.join(', ')}`;
|
|
250
|
+
log.error({ err: state.lastError }, 'worker 停机超时;任务结束前保留锁和连接');
|
|
251
|
+
reject(new Error(state.lastError));
|
|
252
|
+
}, opts.shutdownTimeoutMs ?? 30_000);
|
|
253
|
+
cleanup.then(resolve, reject).finally(() => clearTimeout(timeout)).catch(() => { });
|
|
254
|
+
});
|
|
255
|
+
return stopping;
|
|
119
256
|
},
|
|
120
257
|
};
|
|
121
258
|
}
|
package/dist/worker/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"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"}
|
package/dist/worker/outbox.d.ts
CHANGED
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { type Transaction } from 'kysely';
|
|
2
2
|
import type { Kernel } from '../kernel.js';
|
|
3
|
+
/** 持久事件的投递视图;attempts 是已失败次数,aggregate_version 对历史事件可缺省。 */
|
|
3
4
|
export interface OutboxRow {
|
|
4
5
|
id: number;
|
|
5
6
|
tenant_id: string;
|
|
6
7
|
event: string;
|
|
7
8
|
aggregate: string;
|
|
8
9
|
aggregate_id: string;
|
|
10
|
+
aggregate_version?: number | null;
|
|
9
11
|
payload: Record<string, any>;
|
|
10
12
|
actor: {
|
|
11
13
|
kind?: string;
|
|
@@ -23,16 +25,37 @@ export interface EventConsumer {
|
|
|
23
25
|
/** 唯一名,用于 (事件 id, 消费者) 去重 */
|
|
24
26
|
name: string;
|
|
25
27
|
event: string;
|
|
26
|
-
|
|
28
|
+
/** 外部 IO 在没有数据库事务占用连接时执行;恢复凭证由实现持久化。 */
|
|
29
|
+
prepare?(row: OutboxRow, kernel: Kernel, options: {
|
|
30
|
+
signal?: AbortSignal;
|
|
31
|
+
}): Promise<unknown>;
|
|
32
|
+
handle(row: OutboxRow, tx: Transaction<any>, kernel: Kernel, prepared?: unknown): Promise<void>;
|
|
27
33
|
}
|
|
34
|
+
/** 运行期清单是启动验证的结果;投递时不能因为调用方漏传了关键消费者而静默完成。 */
|
|
35
|
+
export declare function registerConsumerManifest(k: Kernel, consumers: EventConsumer[]): void;
|
|
28
36
|
export declare const MAX_ATTEMPTS = 10;
|
|
29
37
|
/** 指数退避:1 秒、2 秒、4 秒……最多 1 小时 */
|
|
30
38
|
export declare function backoffMs(attempts: number): number;
|
|
39
|
+
/**
|
|
40
|
+
* 短事务领取到期事件并标 processing,SKIP LOCKED 使其他 worker 可继续领取不同对象。
|
|
41
|
+
* 同 aggregate_id 的较早非 done 事件会阻塞后续事件,死信也不会被跳过,保持业务先后关系。
|
|
42
|
+
* 返回时领取事务已提交;实际消费者在后续独立事务执行,崩溃任务由清扫器恢复。
|
|
43
|
+
*/
|
|
31
44
|
export declare function claimBatch(k: Kernel, limit: number): Promise<OutboxRow[]>;
|
|
32
|
-
|
|
45
|
+
/**
|
|
46
|
+
* 先核对启动清单,再按消费者逐一恢复 trace、检查去重、prepare 外部 IO、事务内 handle 与去重登记。
|
|
47
|
+
* prepare 不持有消费事务连接,外部成功回执的持久化由消费者实现;本地去重不能代替远端幂等。
|
|
48
|
+
* 已成功消费者重投时跳过;剩余失败按永久错误/次数进入 dead 或指数退避,全部完成才标 done。
|
|
49
|
+
* 返回值是本次投递结论,retry 不代表后台已等待或重试完成。
|
|
50
|
+
*/
|
|
51
|
+
export declare function deliver(k: Kernel, row: OutboxRow, consumers: EventConsumer[], maxAttempts?: number, options?: {
|
|
52
|
+
signal?: AbortSignal;
|
|
53
|
+
}): Promise<'done' | 'retry' | 'dead'>;
|
|
33
54
|
/** 清扫:worker 崩溃后卡在「处理中」超过 5 分钟的事件重置为待投递 */
|
|
34
55
|
export declare function sweepStale(k: Kernel, olderThanMs?: number): Promise<number>;
|
|
35
56
|
/** 人工重放死信:仍然走内核流水线 */
|
|
57
|
+
/** 保留 processed_event 去重证据,仅重置投递状态;不会解除连接器 unknown 或撤销已成功的消费者。 */
|
|
36
58
|
export declare function replayDeadLetter(k: Kernel, deadLetterId: number, handledBy: string): Promise<void>;
|
|
37
59
|
/** 人工丢弃死信:标记完成,解除对同一聚合后续事件的阻塞 */
|
|
60
|
+
/** 这是运维作出的业务取舍,不会补做漏掉的副作用;上层必须先校验权限并记录操作审计。 */
|
|
38
61
|
export declare function discardDeadLetter(k: Kernel, deadLetterId: number, handledBy: string): Promise<void>;
|
package/dist/worker/outbox.js
CHANGED
|
@@ -2,11 +2,29 @@
|
|
|
2
2
|
import { sql } from 'kysely';
|
|
3
3
|
import { isCageError } from '../errors.js';
|
|
4
4
|
import { withCarrier } from '../telemetry.js';
|
|
5
|
+
const manifests = new WeakMap();
|
|
6
|
+
/** 运行期清单是启动验证的结果;投递时不能因为调用方漏传了关键消费者而静默完成。 */
|
|
7
|
+
export function registerConsumerManifest(k, consumers) {
|
|
8
|
+
const names = new Set();
|
|
9
|
+
const events = new Map(k.registry.events.map((e) => [e.name, []]));
|
|
10
|
+
for (const c of consumers) {
|
|
11
|
+
if (names.has(c.name))
|
|
12
|
+
throw new Error(`[CAGE-WORKER-002] 消费者名称重复:${c.name}`);
|
|
13
|
+
names.add(c.name);
|
|
14
|
+
events.set(c.event, [...(events.get(c.event) ?? []), c.name]);
|
|
15
|
+
}
|
|
16
|
+
manifests.set(k, events);
|
|
17
|
+
}
|
|
5
18
|
export const MAX_ATTEMPTS = 10;
|
|
6
19
|
/** 指数退避:1 秒、2 秒、4 秒……最多 1 小时 */
|
|
7
20
|
export function backoffMs(attempts) {
|
|
8
21
|
return Math.min(3600_000, 1000 * 2 ** Math.max(0, attempts - 1));
|
|
9
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* 短事务领取到期事件并标 processing,SKIP LOCKED 使其他 worker 可继续领取不同对象。
|
|
25
|
+
* 同 aggregate_id 的较早非 done 事件会阻塞后续事件,死信也不会被跳过,保持业务先后关系。
|
|
26
|
+
* 返回时领取事务已提交;实际消费者在后续独立事务执行,崩溃任务由清扫器恢复。
|
|
27
|
+
*/
|
|
10
28
|
export async function claimBatch(k, limit) {
|
|
11
29
|
return k.app.transaction().execute(async (tx) => {
|
|
12
30
|
const { rows } = await sql `
|
|
@@ -42,11 +60,29 @@ function isPermanent(err) {
|
|
|
42
60
|
// 带错误码的框架错误(声明不一致、载荷不符合声明等)重试也不会好
|
|
43
61
|
return /\[CAGE-/.test(String(e?.message ?? ''));
|
|
44
62
|
}
|
|
45
|
-
|
|
63
|
+
/**
|
|
64
|
+
* 先核对启动清单,再按消费者逐一恢复 trace、检查去重、prepare 外部 IO、事务内 handle 与去重登记。
|
|
65
|
+
* prepare 不持有消费事务连接,外部成功回执的持久化由消费者实现;本地去重不能代替远端幂等。
|
|
66
|
+
* 已成功消费者重投时跳过;剩余失败按永久错误/次数进入 dead 或指数退避,全部完成才标 done。
|
|
67
|
+
* 返回值是本次投递结论,retry 不代表后台已等待或重试完成。
|
|
68
|
+
*/
|
|
69
|
+
export async function deliver(k, row, consumers, maxAttempts = MAX_ATTEMPTS, options = {}) {
|
|
46
70
|
const mine = consumers.filter((c) => c.event === row.event);
|
|
47
71
|
try {
|
|
72
|
+
const manifest = manifests.get(k);
|
|
73
|
+
const required = manifest?.get(row.event);
|
|
74
|
+
const missing = required?.filter((name) => !mine.some((c) => c.name === name)) ?? [];
|
|
75
|
+
if (missing.length || (mine.length === 0 && !(manifest?.has(row.event) ?? k.registry.events.some((e) => e.name === row.event)))) {
|
|
76
|
+
throw new Error(`[CAGE-WORKER-002] 事件 ${row.event} 缺少必要消费者或不属于当前注册版本:${missing.join(', ') || 'unknown-event'}`);
|
|
77
|
+
}
|
|
48
78
|
await withCarrier(row.trace, async () => {
|
|
49
79
|
for (const c of mine) {
|
|
80
|
+
options.signal?.throwIfAborted();
|
|
81
|
+
const already = await k.app.selectFrom('sys.processed_event').select('event_id').where('event_id', '=', row.id).where('consumer', '=', c.name).executeTakeFirst();
|
|
82
|
+
if (already)
|
|
83
|
+
continue;
|
|
84
|
+
// 出站执行不在下方事务内等待网络,也不会持有连接再向同一个池取第二条连接。
|
|
85
|
+
const prepared = c.prepare ? await c.prepare(row, k, options) : undefined;
|
|
50
86
|
await k.app.transaction().execute(async (tx) => {
|
|
51
87
|
const first = await tx
|
|
52
88
|
.insertInto('sys.processed_event')
|
|
@@ -56,7 +92,7 @@ export async function deliver(k, row, consumers, maxAttempts = MAX_ATTEMPTS) {
|
|
|
56
92
|
.executeTakeFirst();
|
|
57
93
|
if (!first)
|
|
58
94
|
return; // 处理过了:直接跳过,保证幂等
|
|
59
|
-
await c.handle(row, tx, k);
|
|
95
|
+
await c.handle(row, tx, k, prepared);
|
|
60
96
|
});
|
|
61
97
|
}
|
|
62
98
|
});
|
|
@@ -97,6 +133,7 @@ export async function sweepStale(k, olderThanMs = 5 * 60_000) {
|
|
|
97
133
|
return Number(r.numUpdatedRows);
|
|
98
134
|
}
|
|
99
135
|
/** 人工重放死信:仍然走内核流水线 */
|
|
136
|
+
/** 保留 processed_event 去重证据,仅重置投递状态;不会解除连接器 unknown 或撤销已成功的消费者。 */
|
|
100
137
|
export async function replayDeadLetter(k, deadLetterId, handledBy) {
|
|
101
138
|
await k.app.transaction().execute(async (tx) => {
|
|
102
139
|
const d = await tx.selectFrom('sys.dead_letter').selectAll().where('id', '=', deadLetterId).where('handled_at', 'is', null).forUpdate().executeTakeFirst();
|
|
@@ -108,6 +145,7 @@ export async function replayDeadLetter(k, deadLetterId, handledBy) {
|
|
|
108
145
|
});
|
|
109
146
|
}
|
|
110
147
|
/** 人工丢弃死信:标记完成,解除对同一聚合后续事件的阻塞 */
|
|
148
|
+
/** 这是运维作出的业务取舍,不会补做漏掉的副作用;上层必须先校验权限并记录操作审计。 */
|
|
111
149
|
export async function discardDeadLetter(k, deadLetterId, handledBy) {
|
|
112
150
|
await k.app.transaction().execute(async (tx) => {
|
|
113
151
|
const d = await tx.selectFrom('sys.dead_letter').selectAll().where('id', '=', deadLetterId).where('handled_at', 'is', null).forUpdate().executeTakeFirst();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/worker/outbox.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,EAAE,GAAG,EAAoB,MAAM,QAAQ,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"outbox.js","sourceRoot":"","sources":["../../src/worker/outbox.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import type pg from 'pg';
|
|
2
2
|
import type { Kernel } from '../kernel.js';
|
|
3
3
|
import type { Job, JobApi } from '../primitives/flow.js';
|
|
4
|
+
/** 计算给定时间之后的下一周期,不枚举历史遗漏周期;无效 cron 由解析器抛错。 */
|
|
4
5
|
export declare function nextRun(cron: string, after: Date): Date;
|
|
6
|
+
/**
|
|
7
|
+
* 为一次租户任务构造受限上下文;只能读 j.reads、调用 j.calls 中同一声明对象。
|
|
8
|
+
* 每次 call 独立经过内核事务,整个 job 不是一笔大事务;业务需自行设计多步重试与幂等。
|
|
9
|
+
*/
|
|
5
10
|
export declare function jobApi(k: Kernel, j: Job, tenantId: string, now: Date): JobApi;
|
|
6
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* 同步登记本实例运行标记,再取得专用连接的会话咨询锁;二者分别防同进程重入和跨实例重叠。
|
|
13
|
+
* force 可忽略停用/已跑周期,但仍不能绕过互斥。拿锁后逐租户执行并汇总最后错误。
|
|
14
|
+
* 只有任务 Promise 真正结束才释放锁;返回 true 表示本轮执行过,不表示每个租户业务均成功。
|
|
15
|
+
*/
|
|
7
16
|
export declare function tick(k: Kernel, j: Job, lockConn: pg.Client, scheduledAt: Date, force?: boolean): Promise<boolean>;
|