@yss123/cage-kernel 0.1.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 +71 -9
- 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 +40 -1
- package/dist/db/ddl.js +111 -7
- 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 +6 -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 +14 -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 +12 -2
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/kernel.d.ts +88 -0
- package/dist/kernel.js +82 -41
- package/dist/kernel.js.map +1 -1
- package/dist/mask.d.ts +7 -1
- package/dist/mask.js +11 -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 +22 -6
- package/dist/pipeline/load.js.map +1 -1
- package/dist/primitives/aggregate.d.ts +95 -2
- package/dist/primitives/aggregate.js +15 -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 +12 -1
- package/dist/primitives/event.js.map +1 -1
- package/dist/primitives/fields.d.ts +176 -36
- package/dist/primitives/fields.js +134 -14
- 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 +39 -3
- package/dist/read.js +193 -48
- package/dist/read.js.map +1 -1
- package/dist/registry.d.ts +51 -1
- package/dist/registry.js +105 -5
- package/dist/registry.js.map +1 -1
- package/dist/relations.d.ts +21 -0
- package/dist/relations.js +65 -0
- package/dist/relations.js.map +1 -0
- 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 +19 -0
- package/dist/transfer/csv.js +125 -0
- package/dist/transfer/csv.js.map +1 -0
- package/dist/transfer/index.d.ts +67 -0
- package/dist/transfer/index.js +271 -0
- package/dist/transfer/index.js.map +1 -0
- package/dist/transfer/schema.d.ts +9 -0
- package/dist/transfer/schema.js +36 -0
- package/dist/transfer/schema.js.map +1 -0
- 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 +176 -37
- 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
package/dist/worker/index.js
CHANGED
|
@@ -1,30 +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';
|
|
11
|
+
import { expireTransfers, transferConsumer } from '../transfer/index.js';
|
|
12
|
+
import { describeConsumers, registerWorkerSnapshot } from './health.js';
|
|
9
13
|
export * from './outbox.js';
|
|
10
14
|
export * from './consumers.js';
|
|
11
15
|
export * from './scheduler.js';
|
|
16
|
+
export * from './health.js';
|
|
17
|
+
/** 合并内置、扩展和额外消费者,显式审批引擎覆盖同名代码路由;缺失引擎或名称冲突在启动前失败。 */
|
|
12
18
|
export function buildConsumers(k, opts = {}) {
|
|
13
19
|
const engines = { ...routeEngines(k), ...(opts.approvalEngines ?? {}) };
|
|
14
|
-
|
|
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));
|
|
15
27
|
}
|
|
16
28
|
/** 不启动循环,只创建可手动驱动的 worker(测试用) */
|
|
29
|
+
/**
|
|
30
|
+
* 手动驱动当前可领取任务,drain 默认最多 50 轮;无到期事件且扩展无进展即返回处理数量。
|
|
31
|
+
* 未来重试、死信及被前序阻塞的事件仍可能存在,因此 drain 返回并不证明完整业务链已经成功。
|
|
32
|
+
*/
|
|
17
33
|
export function createWorker(k, opts = {}) {
|
|
34
|
+
const services = runtimeServices(k);
|
|
18
35
|
const consumers = buildConsumers(k, opts);
|
|
36
|
+
const manifest = describeConsumers(k, consumers);
|
|
19
37
|
const max = opts.maxAttempts ?? MAX_ATTEMPTS;
|
|
20
38
|
return {
|
|
21
39
|
kernel: k,
|
|
22
40
|
consumers,
|
|
41
|
+
manifest,
|
|
42
|
+
snapshot: () => ({ id: 'manual', pid: process.pid, status: 'stopped', listenerHealthy: false, schedulerHealthy: false, heartbeatAt: null, inFlight: [], lastError: null, manifest }),
|
|
23
43
|
async drain(maxRounds = 50) {
|
|
24
44
|
let n = 0;
|
|
25
45
|
for (let i = 0; i < maxRounds; i++) {
|
|
26
46
|
const rows = await claimBatch(k, opts.concurrency ?? 8);
|
|
27
|
-
|
|
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)
|
|
28
50
|
break;
|
|
29
51
|
await Promise.all(rows.map((r) => deliver(k, r, consumers, max)));
|
|
30
52
|
n += rows.length;
|
|
@@ -33,34 +55,116 @@ export function createWorker(k, opts = {}) {
|
|
|
33
55
|
},
|
|
34
56
|
};
|
|
35
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* 装配服务和消费者后,建立独立 LISTEN/调度锁连接,写首个心跳,再启动投递、定时任务和维护循环。
|
|
60
|
+
* 所有后台 Promise 统一登记,停机先停止新工作、取消可取消 IO,再等待在途工作后释放连接与锁。
|
|
61
|
+
* 停机超时只向调用方报错,不提前关闭仍持有任务锁的连接;后台清理继续等待真实任务结束。
|
|
62
|
+
* LISTEN 失效可由轮询继续发现 outbox;调度连接异常会停止新调度,健康状态如实反映该区别。
|
|
63
|
+
*/
|
|
36
64
|
export async function startWorker(opts = {}) {
|
|
37
65
|
const log = opts.logger ?? consoleLogger;
|
|
38
66
|
const urls = opts.urls ?? (opts.kernel ? undefined : urlsFromEnv());
|
|
39
67
|
const k = opts.kernel ?? createKernel({ domain: opts.domain ?? {}, urls, logger: log });
|
|
40
|
-
|
|
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
|
+
}
|
|
41
77
|
const concurrency = opts.concurrency ?? 8;
|
|
42
78
|
const poll = opts.pollIntervalMs ?? 500;
|
|
43
79
|
let stopped = false;
|
|
44
80
|
let wake = null;
|
|
45
81
|
const timers = [];
|
|
46
|
-
|
|
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
|
+
};
|
|
47
114
|
const appUrl = urls?.app ?? urlsFromEnv().app;
|
|
48
|
-
|
|
49
|
-
|
|
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
|
+
}
|
|
50
140
|
listener.on('notification', () => wake?.());
|
|
51
|
-
listener.on('error', (e) =>
|
|
141
|
+
listener.on('error', (e) => { state.listenerHealthy = false; failed('outbox-listener', e); });
|
|
142
|
+
listener.on('end', () => { state.listenerHealthy = false; });
|
|
52
143
|
const loop = (async () => {
|
|
53
144
|
while (!stopped) {
|
|
54
145
|
try {
|
|
55
146
|
const rows = await claimBatch(k, concurrency);
|
|
56
147
|
if (rows.length > 0) {
|
|
57
|
-
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);
|
|
58
160
|
continue;
|
|
59
161
|
}
|
|
60
162
|
}
|
|
61
163
|
catch (e) {
|
|
62
|
-
|
|
164
|
+
failed('outbox-claim', e);
|
|
63
165
|
}
|
|
166
|
+
if (stopped)
|
|
167
|
+
break;
|
|
64
168
|
await new Promise((resolve) => {
|
|
65
169
|
const t = setTimeout(resolve, poll);
|
|
66
170
|
wake = () => {
|
|
@@ -71,49 +175,84 @@ export async function startWorker(opts = {}) {
|
|
|
71
175
|
wake = null;
|
|
72
176
|
}
|
|
73
177
|
})();
|
|
74
|
-
|
|
75
|
-
|
|
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));
|
|
76
184
|
const housekeeping = async () => {
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
catch (e) {
|
|
83
|
-
log.warn({ err: String(e) }, '日常维护失败');
|
|
84
|
-
}
|
|
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);
|
|
85
189
|
};
|
|
86
|
-
|
|
87
|
-
timers.push(setInterval(() =>
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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) {
|
|
92
199
|
const due = new Map(k.registry.jobs.map((j) => [j.name, nextRun(j.cron, new Date())]));
|
|
93
200
|
timers.push(setInterval(() => {
|
|
201
|
+
if (!state.schedulerHealthy || stopped)
|
|
202
|
+
return;
|
|
94
203
|
const now = new Date();
|
|
95
204
|
for (const j of k.registry.jobs) {
|
|
96
205
|
const at = due.get(j.name);
|
|
97
206
|
if (now < at)
|
|
98
207
|
continue;
|
|
99
208
|
due.set(j.name, nextRun(j.cron, now));
|
|
100
|
-
|
|
209
|
+
launch(`job:${j.name}`, () => tick(k, j, lockConn, at));
|
|
101
210
|
}
|
|
102
|
-
}, 5_000));
|
|
211
|
+
}, opts.schedulerIntervalMs ?? 5_000));
|
|
103
212
|
}
|
|
104
|
-
log.info({
|
|
213
|
+
log.info({ ...w.manifest, workerId: state.id }, 'worker 已启动');
|
|
214
|
+
let stopping = null;
|
|
105
215
|
return {
|
|
106
216
|
...w,
|
|
107
|
-
|
|
217
|
+
snapshot,
|
|
218
|
+
stop() {
|
|
219
|
+
if (state.status === 'stopped')
|
|
220
|
+
return Promise.resolve();
|
|
221
|
+
if (stopping)
|
|
222
|
+
return stopping;
|
|
108
223
|
stopped = true;
|
|
224
|
+
state.status = 'stopping';
|
|
225
|
+
for (const timer of timers)
|
|
226
|
+
clearInterval(timer);
|
|
109
227
|
wake?.();
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
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;
|
|
117
256
|
},
|
|
118
257
|
};
|
|
119
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>;
|
package/dist/worker/scheduler.js
CHANGED
|
@@ -6,9 +6,14 @@ import { systemCtx } from '../org.js';
|
|
|
6
6
|
import { scopedFind } from '../pipeline/load.js';
|
|
7
7
|
import { rowToSnapshot } from '../db/rows.js';
|
|
8
8
|
import { hash32 } from '../util/names.js';
|
|
9
|
+
/** 计算给定时间之后的下一周期,不枚举历史遗漏周期;无效 cron 由解析器抛错。 */
|
|
9
10
|
export function nextRun(cron, after) {
|
|
10
11
|
return CronExpressionParser.parse(cron, { currentDate: after }).next().toDate();
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* 为一次租户任务构造受限上下文;只能读 j.reads、调用 j.calls 中同一声明对象。
|
|
15
|
+
* 每次 call 独立经过内核事务,整个 job 不是一笔大事务;业务需自行设计多步重试与幂等。
|
|
16
|
+
*/
|
|
12
17
|
export function jobApi(k, j, tenantId, now) {
|
|
13
18
|
const caps = j.calls.map((c) => k.registry.capabilityOf(c));
|
|
14
19
|
const ctx = systemCtx({ kind: 'job', name: j.name, tenantId, capabilities: caps });
|
|
@@ -40,12 +45,31 @@ export function jobApi(k, j, tenantId, now) {
|
|
|
40
45
|
};
|
|
41
46
|
}
|
|
42
47
|
/** 执行一次任务(拿到锁才执行);返回是否执行了 */
|
|
48
|
+
const running = new WeakMap();
|
|
49
|
+
/**
|
|
50
|
+
* 同步登记本实例运行标记,再取得专用连接的会话咨询锁;二者分别防同进程重入和跨实例重叠。
|
|
51
|
+
* force 可忽略停用/已跑周期,但仍不能绕过互斥。拿锁后逐租户执行并汇总最后错误。
|
|
52
|
+
* 只有任务 Promise 真正结束才释放锁;返回 true 表示本轮执行过,不表示每个租户业务均成功。
|
|
53
|
+
*/
|
|
43
54
|
export async function tick(k, j, lockConn, scheduledAt, force = false) {
|
|
55
|
+
const active = running.get(k) ?? new Set();
|
|
56
|
+
running.set(k, active);
|
|
57
|
+
// 会话 advisory lock 对同一连接可重入,必须先同步登记本进程正在运行的任务。
|
|
58
|
+
// 错过周期默认跳过,不积累一个追赶队列。
|
|
59
|
+
if (active.has(j.name)) {
|
|
60
|
+
k.log.info({ job: j.name, scheduledAt: scheduledAt.toISOString(), reason: 'already-running' }, '跳过重叠的任务周期');
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
active.add(j.name);
|
|
44
64
|
const lockId = hash32(`cage.job.${j.name}`);
|
|
45
|
-
|
|
46
|
-
if (!r.rows[0].ok)
|
|
47
|
-
return false; // 别的实例在跑:本实例跳过
|
|
65
|
+
let locked = false;
|
|
48
66
|
try {
|
|
67
|
+
const r = await lockConn.query('select pg_try_advisory_lock($1) as ok', [lockId]);
|
|
68
|
+
locked = r.rows[0].ok;
|
|
69
|
+
if (!locked) {
|
|
70
|
+
k.log.info({ job: j.name, scheduledAt: scheduledAt.toISOString(), reason: 'other-worker' }, '跳过其他实例持有的任务周期');
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
49
73
|
await k.app.insertInto('sys.job_state').values({ name: j.name }).onConflict((oc) => oc.column('name').doNothing()).execute();
|
|
50
74
|
const st = await k.app.selectFrom('sys.job_state').selectAll().where('name', '=', j.name).executeTakeFirstOrThrow();
|
|
51
75
|
if (!st.enabled && !force)
|
|
@@ -71,7 +95,13 @@ export async function tick(k, j, lockConn, scheduledAt, force = false) {
|
|
|
71
95
|
return true;
|
|
72
96
|
}
|
|
73
97
|
finally {
|
|
74
|
-
|
|
98
|
+
try {
|
|
99
|
+
if (locked)
|
|
100
|
+
await lockConn.query('select pg_advisory_unlock($1)', [lockId]); // 任务结束前不能释放跨实例锁
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
active.delete(j.name);
|
|
104
|
+
}
|
|
75
105
|
}
|
|
76
106
|
}
|
|
77
107
|
//# sourceMappingURL=scheduler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/worker/scheduler.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/worker/scheduler.ts"],"names":[],"mappings":"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"}
|