Major Changes: - Add StreamingService with OpenAI Compatible format - Upgrade Chat component V2 with Ant Design X integration - Implement AIA module with 12 intelligent agents - Update API routes to unified /api/v1 prefix - Update system documentation Backend (~1300 lines): - common/streaming: OpenAI Compatible adapter - modules/aia: 12 agents, conversation service, streaming integration - Update route versions (RVW, PKB to v1) Frontend (~3500 lines): - modules/aia: AgentHub + ChatWorkspace (100% prototype restoration) - shared/Chat: AIStreamChat, ThinkingBlock, useAIStream Hook - Update API endpoints to v1 Documentation: - AIA module status guide - Universal capabilities catalog - System overview updates - All module documentation sync Tested: Stream response verified, authentication working Status: AIA V2.0 core completed (85%)
26 KiB
Postgres-Only <20>嗆<EFBFBD><E59786>寥<EFBFBD>惩<EFBFBD><E683A9>鞉<EFBFBD>餌<EFBFBD>
*<EFBFBD>交<EFBFBD>嚗? 2025撟?2<>?3<>?
*<EFBFBD><EFBFBD>𧋦嚗? V1.0
<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD> Phase 1-7 <20>券<EFBFBD>摰峕<E691B0> <20>?
<EFBFBD><EFBFBD> <20>扯<EFBFBD>璁<EFBFBD><E79281>
| <EFBFBD>嗆挾 | <EFBFBD><EFBFBD>捆 | 隞<EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD>嗆<EFBFBD>? | <EFBFBD>埈𧒄 |
|---|---|---|---|---|
| Phase 1 | <EFBFBD>臬<EFBFBD><EFBFBD><EFBFBD><EFBFBD> | ~50銵? | <EFBFBD>?摰峕<E691B0> | 0.5憭? |
| Phase 2 | PostgresCacheAdapter | ~300銵? | <EFBFBD>?摰峕<E691B0> | 1憭? |
| Phase 3 | PgBossQueue | ~400銵? | <EFBFBD>?摰峕<E691B0> | 1.5憭? |
| Phase 4 | 隞餃𦛚<EFBFBD><EFBFBD><EFBFBD><EFBFBD>箏<EFBFBD> | ~200銵? | <EFBFBD>?摰峕<E691B0> | 0.5憭? |
| Phase 5 | <EFBFBD>剔<EFBFBD>蝏凋<EFBFBD><EFBFBD>箏<EFBFBD> | ~150銵? | <EFBFBD>?摰峕<E691B0> | 0.5憭? |
| Phase 6 | ASL 蝑偦<E89D91>㗇<EFBFBD><E39787>⊥㺿<E28AA5>? | ~200銵? | <EFBFBD>?摰峕<E691B0> | 1憭? |
| <EFBFBD>齿<EFBFBD> | Platform-Only <20>嗆<EFBFBD> | *~300銵? | <EFBFBD>?摰峕<E691B0> | *1憭? |
| Phase 7 | DC <20>𣂼<EFBFBD><F0A382BC>滚𦛚<E6BB9A>寥<EFBFBD>? | ~150銵? | <EFBFBD>?摰峕<E691B0> | 0.5憭? |
| <EFBFBD>餉恣 | *<EFBFBD>詨<EFBFBD><EFBFBD>蠘<EFBFBD>撘<EFBFBD><EFBFBD>? | *~1750銵? | <EFBFBD>?<3F>券<EFBFBD>摰峕<E691B0> | *6.5憭? |
<EFBFBD>㴓 <20>詨<EFBFBD><E8A9A8>鞉<EFBFBD>
1. Platform-Only <20>嗆<EFBFBD><E59786>齿<EFBFBD> <20><>
*<EFBFBD>桅<EFBFBD><EFBFBD>𤑳緵嚗?
- <EFBFBD>嘥<EFBFBD>霈曇恣<EFBFBD>典<EFBFBD>銝𡁜𦛚銵剁<EFBFBD>ASL<EFBFBD><EFBFBD>C嚗劐葉<EFBFBD>滚<EFBFBD>摰帋<EFBFBD>鈭?6 銝芯遙<E88AAF>∠恣<E288A0><E681A3><EFBFBD>畾?
- 餈嘥<EFBFBD>鈭?DRY <20>笔<EFBFBD><E7AC94>?3 撅<>沲<EFBFBD><E6B2B2><EFBFBD><EFBFBD>?
- pg-boss <20>?
job銵典歇蝏誩銁platform_schema銝哨<E98A9D>摨磰砲蝏煺<E89D8F>蝞∠<E89D9E>
*<EFBFBD>齿<EFBFBD><EFBFBD>寞<EFBFBD>嚗?
<EFBFBD>寥<EFBFBD>惩<EFBFBD>嚗<EFBFBD><EFBFBD> <20>厰䔮憸矋<E686B8>:
asl_schema.screening_tasks
<20>鎿<EFBFBD><E98EBF><EFBFBD> totalBatches
<20>鎿<EFBFBD><E98EBF><EFBFBD> processedBatches
<20>婙<EFBFBD><E5A999><EFBFBD> ... (6銝芯遙<E88AAF>∠恣<E288A0><E681A3><EFBFBD>畾?
dc_schema.dc_extraction_tasks
<20>婙<EFBFBD><E5A999><EFBFBD> <20>峕甅<E5B395>?6 銝芸<E98A9D>畾蛛<E795BE><E89B9B>滚<EFBFBD>嚗<EFBFBD><E59A97>
<0A>寥<EFBFBD>惩<EFBFBD>嚗<EFBFBD><E59A97> Platform-Only嚗?
platform_schema.job.data (蝏煺<E89D8F>蝞∠<E89D9E>)
<20>鎿<EFBFBD><E98EBF><EFBFBD> batchIndex
<20>鎿<EFBFBD><E98EBF><EFBFBD> totalBatches
<20>鎿<EFBFBD><E98EBF><EFBFBD> checkpoint
<20>婙<EFBFBD><E5A999><EFBFBD> ... (<28><><EFBFBD>劐遙<E58A90>∩縑<E288A9>?
asl_schema.screening_tasks (<28>芰恣銝𡁜𦛚)
dc_schema.dc_extraction_tasks (<28>芰恣銝𡁜𦛚)
*<EFBFBD>嗆<EFBFBD>隡睃飵嚗?
- <EFBFBD>?蝚血<E89D9A> 3 撅<>沲<EFBFBD>?- Platform 撅<><E69285>銝<EFBFBD>蝞∠<E89D9E>隞餃𦛚
- <EFBFBD>?<3F>牐誨<E78990><E8AAA8><EFBFBD>憭?- CheckpointService <20><><EFBFBD>㗇芋<E39787>烾<EFBFBD>𡁶鍂
- <EFBFBD>?<3F>㮖<EFBFBD>蝏湔擪 - <20>芷<EFBFBD>靽格㺿銝<E3BABF>憭<EFBFBD>誨<EFBFBD>?
- <EFBFBD>?<3F>㮖<EFBFBD><E3AE96>拙<EFBFBD> - <20>芣䔉璅∪<E79285><E288AA>𣳇<EFBFBD>瘛餃<E7989B>摮埈挾
- <EFBFBD>?<3F>唳旿銝<E697BF><E98A9D>?- 隞餃𦛚靽⊥<E99DBD>銝𡡞<E98A9D><F0A1A19E>埈㺭<E59F88>桀銁銝<E98A81>韏?
2. <20>箄<EFBFBD><E7AE84><EFBFBD><EFBFBD>澆ế<E6BE86>剜㦤<E5899C>?<3F>㴓
*霈曇恣<EFBFBD><EFBFBD>艙嚗?
- 撠譍遙<EFBFBD>∴<EFBFBD><50<35>∴<EFBFBD>嚗𡁶凒<F0A181B6>亙<EFBFBD><E4BA99><EFBFBD><EFBFBD>敹恍<E695B9>笔<EFBFBD>摨?
- 憭找遙<EFBFBD>∴<EFBFBD><EFBFBD>?0<>∴<EFBFBD>嚗𡁻<E59A97><F0A181BB>堒<EFBFBD><E5A092><EFBFBD><EFBFBD><EFBFBD>舫<EFBFBD><E888AB>折<EFBFBD>
*摰䂿緵<EFBFBD><EFBFBD><EFBFBD>嚗?
| 璅∪<EFBFBD> | <EFBFBD>唳旿<EFBFBD>? | 憭<EFBFBD><EFBFBD>璅∪<EFBFBD> | <EFBFBD>寞活<EFBFBD>? | <EFBFBD>寧<EFBFBD> |
|---|---|---|---|---|
| ASL | 7蝭? | <EFBFBD>湔𦻖璅∪<EFBFBD> | 1 | 敹恍<EFBFBD>笔<EFBFBD>摨䈑<EFBFBD><1<><31><EFBFBD>嚗? |
| ASL | 100蝭? | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD> | 2 | <EFBFBD><EFBFBD><EFBFBD>+<2B>剔<EFBFBD>蝏凋<E89D8F> |
| ASL | 1000蝭? | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD> | 20 | <EFBFBD>舀<EFBFBD>24撠𤩺𧒄<EFBFBD>蹂遙<EFBFBD>? |
| DC | 7<EFBFBD>? | <EFBFBD>湔𦻖璅∪<EFBFBD> | 1 | 敹恍<EFBFBD>笔<EFBFBD>摨? |
| DC | 100<EFBFBD>? | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD> | 2 | <EFBFBD><EFBFBD><EFBFBD>+<2B>剔<EFBFBD>蝏凋<E89D8F> |
*隞<EFBFBD><EFBFBD>蝷箔<EFBFBD>嚗?
const QUEUE_THRESHOLD = 50;
const useQueue = items.length >= QUEUE_THRESHOLD;
if (useQueue) {
// <20>笔<EFBFBD>璅∪<E79285>嚗帋遙<E5B88B>⊥<EFBFBD><E28AA5>?+ <20>剔<EFBFBD>蝏凋<E89D8F>
const chunks = splitIntoChunks(items, chunkSize);
await jobQueue.push('task:batch', { ... });
} else {
// <20>湔𦻖璅∪<E79285>嚗𡁜翰<F0A1819C>笔<EFBFBD><E7AC94>?
processDirectly(items);
}
3. <20>剔<EFBFBD>蝏凋<E89D8F><E5878B>箏<EFBFBD> <20><>
*摰䂿緵<EFBFBD>孵<EFBFBD>嚗?
- <EFBFBD>拍鍂
pg-boss<20>?job.data.checkpoint摮埈挾 - 瘥誩<EFBFBD><EFBFBD>?10 <20>∟扇敶蓥<E695B6>摮䀝<E691AE>甈⊥鱏<E28AA5>?
- 隞餃𦛚銝剜鱏<EFBFBD>舘䌊<EFBFBD>其<EFBFBD>銝𦠜活雿滨蔭<EFBFBD>W<EFBFBD>
*<EFBFBD>剔<EFBFBD><EFBFBD>唳旿蝏𤘪<EFBFBD>嚗?
interface CheckpointData {
currentBatchIndex: number; // 敶枏<E695B6><E69E8F>寞活蝝W<E89D9D>
currentIndex: number; // 敶枏<E695B6>憭<EFBFBD><E686AD><EFBFBD><EFBFBD>扇敶閧揣撘?
processedBatches: number; // 撌脣<E6928C><E884A3><EFBFBD><EFBFBD><EFBFBD>寞活<E5AF9E>?
totalBatches: number; // <20>餅鸌甈⊥㺭
metadata: {
processedCount: number; // 撌脣<E6928C><E884A3><EFBFBD>㺭<EFBFBD>?
successCount: number; // <20>𣂼<EFBFBD><F0A382BC>圈<EFBFBD>
failedCount: number; // 憭梯揖<E6A2AF>圈<EFBFBD>
lastUpdate: Date; // <20><><EFBFBD>擧凒<E693A7>唳𧒄<E594B3>?
};
}
*雿輻鍂蝷箔<EFBFBD>嚗?
// 靽嘥<E99DBD><E598A5>剔<EFBFBD>
await checkpointService.saveCheckpoint(jobId, {
currentBatchIndex: 5,
currentIndex: 250,
processedBatches: 5,
totalBatches: 20
});
// <20>W<EFBFBD><EFBCB7>剔<EFBFBD>
const checkpoint = await checkpointService.loadCheckpoint(jobId);
if (checkpoint) {
resumeFrom = checkpoint.currentIndex;
}
<EFBFBD><EFBFBD> <20>啣<EFBFBD><E595A3><EFBFBD>辣皜<E8BEA3><E79A9C>
Platform 撅<><E69285><EFBFBD>𡁶鍂<F0A181B6>賢<EFBFBD>嚗?
| <EFBFBD><EFBFBD>辣 | 銵峕㺭 | 霂湔<EFBFBD> |
|---|---|---|
common/cache/PostgresCacheAdapter.ts |
300 | Postgres 蝻枏<E89DBB><E69E8F><EFBFBD><EFBFBD><EFBFBD>? |
common/jobs/PgBossQueue.ts |
400 | pg-boss <20>笔<EFBFBD><E7AC94><EFBFBD><EFBFBD><EFBFBD>? |
common/jobs/utils.ts |
200 | 隞餃𦛚<EFBFBD><EFBFBD><EFBFBD>撌亙<EFBFBD><EFBFBD>賣㺭 |
common/jobs/CheckpointService.ts |
260 | <EFBFBD>剔<EFBFBD>蝏凋<EFBFBD><EFBFBD>滚𦛚嚗<EFBFBD><EFBFBD>雿穅ob.data嚗? |
ASL 璅∪<E79285>
| <EFBFBD><EFBFBD>辣 | 銵峕㺭 | 霂湔<EFBFBD> |
|---|---|---|
modules/asl/services/screeningService.ts |
480 | 瘛餃<EFBFBD><EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>澆ế<EFBFBD>? |
modules/asl/services/screeningWorker.ts |
410 | <EFBFBD>寞活Worker嚗<EFBFBD>蝙<EFBFBD>甫ob.data嚗? |
DC 璅∪<E79285>
| <EFBFBD><EFBFBD>辣 | 銵峕㺭 | 霂湔<EFBFBD> |
|---|---|---|
modules/dc/tool-b/controllers/ExtractionController.ts |
690 | 瘛餃<EFBFBD><EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>澆ế<EFBFBD>? |
modules/dc/tool-b/workers/extractionWorker.ts |
390 | <EFBFBD>寞活Worker嚗<EFBFBD>蝙<EFBFBD>甫ob.data嚗? |
瘚贝<EFBFBD><EFBFBD><EFBFBD>辣
| <EFBFBD><EFBFBD>辣 | 銵峕㺭 | 霂湔<EFBFBD> |
|---|---|---|
tests/test-postgres-cache.ts |
130 | Postgres 蝻枏<E89DBB>瘚贝<E7989A> |
tests/test-pgboss-queue.ts |
150 | pg-boss <20>笔<EFBFBD>瘚贝<E7989A> |
tests/test-checkpoint.ts |
200 | <EFBFBD>剔<EFBFBD>蝏凋<EFBFBD>瘚贝<EFBFBD> |
tests/test-task-split.ts |
150 | 隞餃𦛚<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD> |
tests/test-asl-screening-mock.ts |
320 | ASL 璅⊥<E79285>瘚贝<E7989A> |
tests/test-dc-extraction-mock.ts |
280 | DC 璅⊥<E79285>瘚贝<E7989A> |
tests/verify-test1-database.ts |
230 | Postgres 蝻枏<E89DBB><E69E8F>唳旿摨㯄<E691A8>霂? |
tests/verify-pgboss-database.ts |
330 | pg-boss <20>唳旿摨𤘪楛摨阡<E691A8>霂? |
tests/README.md |
380 | 瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
<EFBFBD>唳旿摨栞<EFBFBD>蝘?
| <EFBFBD><EFBFBD>辣 | 霂湔<EFBFBD> |
|---|---|
manual-migrations/001_add_postgres_cache_and_checkpoint.sql |
瘛餃<EFBFBD> app_cache 銵? |
manual-migrations/002_rollback_to_platform_only.sql |
<EFBFBD>墧<EFBFBD>銝𡁜𦛚銵其遙<EFBFBD>∪<EFBFBD>畾? |
manual-migrations/run-migration.ts |
餈<EFBFBD>宏<EFBFBD>扯<EFBFBD><EFBFBD>𡁏𧋦 |
manual-migrations/run-migration-002.ts |
<EFBFBD>墧<EFBFBD>餈<EFBFBD>宏<EFBFBD>扯<EFBFBD><EFBFBD>𡁏𧋦 |
<EFBFBD>妒 瘚贝<E7989A>撉諹<E69289>蝏𤘪<E89D8F>
1. <20>箇<EFBFBD><E7AE87>蠘<EFBFBD>瘚贝<E7989A> <20>?
| 瘚贝<EFBFBD>憿? | 蝏𤘪<EFBFBD> | 霂湔<EFBFBD> |
|---|---|---|
| Postgres 蝻枏<E89DBB> | <EFBFBD>?<3F>朞<EFBFBD> | get/set/delete/<2F>寥<EFBFBD><E5AFA5>滢<EFBFBD>甇<EFBFBD>虜 |
| pg-boss <20>笔<EFBFBD> | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>券<EFBFBD>?憭<><E686AD>/<2F>滩<EFBFBD><E6BBA9>箏<EFBFBD>甇<EFBFBD>虜 |
| 隞餃𦛚<EFBFBD><EFBFBD><EFBFBD> | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>箄<EFBFBD><EFBFBD>刻<EFBFBD><EFBFBD>寞活憭批<EFBFBD>甇<EFBFBD>& |
| <EFBFBD>剔<EFBFBD>蝏凋<EFBFBD> | <EFBFBD>?<3F>朞<EFBFBD> | 靽嘥<EFBFBD>/<2F>㰘蝸/皜<>膄甇<E88684>虜 |
2. ASL 璅∪<E79285>瘚贝<E7989A> <20>?
| 瘚贝<EFBFBD><EFBFBD>箸艶 | 蝏𤘪<EFBFBD> | 霂湔<EFBFBD> |
|---|---|---|
| 7蝭<EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>湔𦻖璅∪<EFBFBD>嚗<EFBFBD>翰<EFBFBD>笔<EFBFBD><EFBFBD>? |
| 100蝭<EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD>嚗峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>? |
| <EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD>?<3F>朞<EFBFBD> | 50蝭<EFBFBD><EFBFBD><EFBFBD>潭迤蝖桀極雿? |
3. DC 璅∪<E79285>瘚贝<E7989A> <20>?
| 瘚贝<EFBFBD><EFBFBD>箸艶 | 蝏𤘪<EFBFBD> | 霂湔<EFBFBD> |
|---|---|---|
| 7<EFBFBD>∟扇敶? | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>湔𦻖璅∪<EFBFBD>嚗<EFBFBD>翰<EFBFBD>笔<EFBFBD><EFBFBD>? |
| 100<EFBFBD>∟扇敶? | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD>嚗峕<EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD>? |
| <EFBFBD>箄<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD>?<3F>朞<EFBFBD> | 50<EFBFBD>⊿<EFBFBD><EFBFBD>潭迤蝖桀極雿? |
4. Platform-Only <20>嗆<EFBFBD>撉諹<E69289> <20>?
| 撉諹<EFBFBD>憿? | 蝏𤘪<EFBFBD> | 霂湔<EFBFBD> |
|---|---|---|
| Schema <20>墧<EFBFBD> | <EFBFBD>?<3F>朞<EFBFBD> | 銝𡁜𦛚銵冽<EFBFBD>隞餃𦛚蝞∠<EFBFBD>摮埈挾 |
| job.data 摮睃<E691AE> | <EFBFBD>?<3F>朞<EFBFBD> | 隞餃𦛚靽⊥<EFBFBD>甇<EFBFBD>&摮睃<EFBFBD> |
| CheckpointService | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>滢<EFBFBD> job.data 甇<>虜 |
| 3撅<EFBFBD>沲<EFBFBD>? | <EFBFBD>?<3F>朞<EFBFBD> | <EFBFBD>諹提<EFBFBD>鍦<EFBFBD>皜<EFBFBD>苊 |
<EFBFBD>圲 <20><><EFBFBD>舀<EFBFBD>
| <EFBFBD><EFBFBD><EFBFBD>? | <EFBFBD><EFBFBD>𧋦 | <EFBFBD>券<EFBFBD>? |
|---|---|---|
| PostgreSQL | 14+ | <EFBFBD>唳旿摨?+ 蝻枏<E89DBB> + <20>笔<EFBFBD> |
| pg-boss | 9.x | 隞餃𦛚<EFBFBD>笔<EFBFBD>蝞∠<EFBFBD> |
| Prisma | 6.17.0 | ORM |
| Node.js | 22.18.0 | 餈鞱<EFBFBD><EFBFBD>臬<EFBFBD> |
| TypeScript | 5.x | 撘<EFBFBD><EFBFBD>𤏸祗閮<EFBFBD> |
| tsx | latest | TypeScript <20>扯<EFBFBD><E689AF>? |
<EFBFBD><EFBFBD> <20>喲睸<E596B2><E79DB8><EFBFBD>
隞<EFBFBD><EFBFBD><EFBFBD>讐<EFBFBD>霈?
<EFBFBD>啣<EFBFBD>隞<EFBFBD><EFBFBD>嚗鰺1750 銵?
靽格㺿隞<E3BABF><E99A9E>嚗鰺500 銵?
<0A>𣳇膄隞<E88684><E99A9E>嚗鰺100 銵?
瘚贝<E7989A>隞<EFBFBD><E99A9E>嚗鰺1800 銵?
<0A><>﹝隞<EFB99D><E99A9E>嚗鰺800 銵?
<0A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<0A>餉恣嚗𡁶漲 4950 銵?
<EFBFBD>寥<EFBFBD>䭾<EFBFBD><EFBFBD>羓<EFBFBD><EFBFBD><EFBFBD>辣
<EFBFBD>啣遣<EFBFBD><EFBFBD>辣嚗?5 銝?
靽格㺿<E6A0BC><E3BABF>辣嚗? 銝?
<0A>𣳇膄<F0A3B387><E88684>辣嚗? 銝迎<E98A9D>銝湔𧒄瘚贝<E7989A><E8B49D><EFBFBD>辣嚗?
<0A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
敶勗<E695B6><E58B97><EFBFBD>辣嚗?3 銝?
<EFBFBD>㴓 <20>嗆<EFBFBD>瞍磰<E79E8D>
<EFBFBD>寥<EFBFBD>惩<EFBFBD>
銝𡁜𦛚撅?(<28><>袇)
<0A>鎿<EFBFBD><E98EBF><EFBFBD> ASL: 隞餃𦛚蝞∠<E89D9E>摮埈挾 (6銝?
<0A>婙<EFBFBD><E5A999><EFBFBD> DC: 隞餃𦛚蝞∠<E89D9E>摮埈挾 (6銝?
<20>?隞<><E99A9E><EFBFBD>滚<EFBFBD>
<20>?蝏湔擪<E6B994>圈𠗕
<20>?銝滨泵<E6BBA8>?撅<>沲<EFBFBD>?
<EFBFBD>寥<EFBFBD>惩<EFBFBD>嚗㇊latform-Only嚗?
<EFBFBD>𢞖<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>? 銝𡁜𦛚撅?(Business Layer) <20>?
<0A>? - ASL: <20>芸<EFBFBD><E88AB8>其<EFBFBD><E585B6>∩縑<E288A9>? <20>?
<0A>? - DC: <20>芸<EFBFBD><E88AB8>其<EFBFBD><E585B6>∩縑<E288A9>? <20>?
<0A>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<20>?
<0A>𢞖<EFBFBD><F0A29E96><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<0A>? 撟喳蝱撅?(Platform Layer) <20>?
<0A>? - platform_schema.job.data <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> 蝏煺<E89D8F>摮睃<E691AE><E79D83><EFBFBD><EFBFBD>劐遙<E58A90>∠恣<E288A0><E681A3>縑<EFBFBD>? <20>?
<0A>? - platform_schema.app_cache <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> 蝏煺<E89D8F>蝻枏<E89DBB>蝞∠<E89D9E> <20>?
<0A>? - CheckpointService <20>?
<0A>? <20>婙<EFBFBD><E5A999><EFBFBD> <20><><EFBFBD>㗇芋<E39787>烾<EFBFBD>𡁶鍂 <20>?
<0A>婙<EFBFBD><E5A999><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
<EFBFBD>働 <20>喲睸霈曇恣<E69B87>喟<EFBFBD>
1. 銝箔<E98A9D>銋<EFBFBD><E98A8B>㗇𥋘 Postgres-Only嚗?
| 撖寞<EFBFBD>憿? | Redis <20>寞<EFBFBD> | Postgres-Only <20>寞<EFBFBD> |
|---|---|---|
| <EFBFBD>鞉𧋦 | +嚙?00/<2F>? | 嚙?嚗<>歇<EFBFBD>侨ostgres嚗? |
| 餈鞟輕 | 2銝芰頂蝏? | 1銝芰頂蝏? |
| *<EFBFBD>唳旿銝<EFBFBD><EFBFBD>湔<EFBFBD>? | <EFBFBD><EFBFBD>蝏<EFBFBD><EFBFBD><EFBFBD>? | 撘箔<EFBFBD><EFBFBD>? |
| 摮虫<EFBFBD><EFBFBD>鞉𧋦 | Redis + BullMQ | <EFBFBD>芷<EFBFBD> pg-boss |
| <EFBFBD>a<EFBFBD>閫<EFBFBD>芋 | <EFBFBD><EFBFBD>閬<EFBFBD>edis銝枏振 | <EFBFBD>唳<EFBFBD><EFBFBD><EFBFBD><EFBFBD>質雲憭? |
| <EFBFBD><EFBFBD>鍂閫<EFBFBD>芋 | >10銝䝄AU | <10銝䝄AU嚗<55><E59A97><EFBFBD>?00MAU嚗? |
*蝏栞捏嚗? 撖嫣<E69296>撠誩𣪧<E8AAA9><F0A3AAA7><EFBFBD>500 MAU嚗㚁<E59A97>Postgres-Only <20>舀<EFBFBD>隡㗛<E99AA1>㗇𥋘<E39787>?
2. 銝箔<E98A9D>銋<EFBFBD><E98A8B> Platform-Only <20>嗆<EFBFBD><E59786>齿<EFBFBD>嚗?
*<EFBFBD>𤑳緵<EFBFBD>桅<EFBFBD><EFBFBD>嗆㦤嚗?
- Phase 6 摰峕<E691B0><E5B395>𠬍<EFBFBD><F0A0AC8D><EFBFBD><EFBFBD> Phase 7 <20>嗅<EFBFBD><E59785>?
- ASL 撌脫溶<E884AB>?6 銝芯遙<E88AAF>∠恣<E288A0><E681A3><EFBFBD>畾萄<E795BE>銝𡁜𦛚銵?
- DC 銋笔<E98A8B>憭<EFBFBD>溶<EFBFBD>惩<EFBFBD><E683A9>瑞<EFBFBD> 6 銝芸<E98A9D>畾?
- *<EFBFBD>讛<EFBFBD><EFBFBD>啗挽霈⊥<EFBFBD><EFBFBD>桅<EFBFBD>嚗?
*<EFBFBD>齿<EFBFBD><EFBFBD>喟<EFBFBD>嚗?
- 蝡见朖<EFBFBD>𨀣迫 Phase 7嚗<37><E59A97><EFBFBD>齿<EFBFBD><E9BDBF>嗆<EFBFBD>
- <EFBFBD>墧<EFBFBD> ASL <20>?Schema 靽格㺿
- <EFBFBD>寧鍂
pg-boss<20>?job.data蝏煺<E89D8F>蝞∠<E89D9E> - <EFBFBD>滚<EFBFBD> CheckpointService 銝粹<E98A9D>𡁶鍂<F0A181B6>滚𦛚
*<EFBFBD>齿<EFBFBD><EFBFBD>鞉𧋦嚗?
- 隞<EFBFBD><EFBFBD><EFBFBD>孵𢆡嚗鰺300 銵?
- <EFBFBD>唳旿摨栞<EFBFBD>蝘鳴<EFBFBD><EFBFBD>𣳇膄 6 銝芸<E98A9D>畾?
- 瘚贝<EFBFBD>撉諹<EFBFBD>嚗? 銝芣<E98A9D>霂閗<E99C82><E99697>?
- *<EFBFBD>餉<EFBFBD>埈𧒄嚗? 憭?
<EFBFBD>齿<EFBFBD>隞瑕<EFBFBD>潘<EFBFBD>
- <EFBFBD>?<3F>踵<EFBFBD><E8B8B5>亦<EFBFBD><E4BAA6><EFBFBD><EFBFBD><EFBFBD>啣<EFBFBD>銵屸<E98AB5>憭滢誨<E6BBA2>?
- <EFBFBD>?<3F>芣䔉璅∪<E79285>嚗𠄎SA<53><41>VW<56><57>T嚗厩凒<E58EA9>亙<EFBFBD><E4BA99>?
- <EFBFBD>?蝏湔擪<E6B994>鞉𧋦憭批<E686AD><E689B9>滢<EFBFBD>
- <EFBFBD>?<3F>嗆<EFBFBD><E59786>游<EFBFBD>皜<EFBFBD>苊<EFBFBD><E88B8A><EFBFBD>
3. 銝箔<E98A9D>銋<EFBFBD>挽蝵?50 <20>⊿<EFBFBD><E28ABF>潘<EFBFBD>
| <EFBFBD>唳旿<EFBFBD>? | <EFBFBD>埈𧒄 | <EFBFBD>㗇𥋘璅∪<EFBFBD> | <EFBFBD>笔<EFBFBD> |
|---|---|---|---|
| 1-49<34>? | <5<><35><EFBFBD> | <EFBFBD>湔𦻖璅∪<EFBFBD> | SAE銝滢<EFBFBD>頞<EFBFBD>𧒄嚗屸<EFBFBD><EFBFBD>堒<EFBFBD><EFBFBD>峕<EFBFBD> |
| *50<EFBFBD>? | ~5<><35><EFBFBD> | *銝渡<EFBFBD><EFBFBD>? | *<EFBFBD>舫<EFBFBD><EFBFBD>折<EFBFBD>瘙<EFBFBD><EFBFBD><EFBFBD>? |
| 50-200<30>? | 5-20<32><30><EFBFBD> | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD> | <EFBFBD><EFBFBD>閬<EFBFBD>鱏<EFBFBD>寧賒隡? |
| 200+<2B>? | >20<32><30><EFBFBD> | <EFBFBD>笔<EFBFBD>璅∪<EFBFBD> | 敹<EFBFBD>◆<EFBFBD>剔<EFBFBD>蝏凋<EFBFBD> |
*<EFBFBD>扯<EFBFBD><EFBFBD><EFBFBD><EFBFBD>嚗?
- <EFBFBD>湔𦻖璅∪<EFBFBD>嚗𡁏<EFBFBD><EFBFBD>笔<EFBFBD>撱嗉<EFBFBD>嚗<EFBFBD>蔭霂a𡢿<EFBFBD>?蝘𡜐<E89D98>
- <EFBFBD>笔<EFBFBD>璅∪<EFBFBD>嚗𡁜虾<EFBFBD>䭾<EFBFBD>折<EFBFBD>嚗<EFBFBD>𣈲<EFBFBD><EFBFBD><EFBFBD>霂𨰻<EFBFBD><EFBFBD>鱏<EFBFBD>對<EFBFBD>
- 50<EFBFBD>⊥糓撟唾﹛<EFBFBD>對<EFBFBD><EFBFBD>V<EFBFBD><EFBFBD>箇𠧧<EFBFBD>扯<EFBFBD>嚗<EFBFBD><EFBFBD>靽肽<EFBFBD><EFBFBD>舫<EFBFBD><EFBFBD>?
<EFBFBD><EFBFBD>儭?<3F>寥<EFBFBD>删<EFBFBD><E588A0>詨<EFBFBD><E8A9A8><EFBFBD>辣
Platform 撅<><E69285><EFBFBD>啣<EFBFBD>嚗?
-
PostgresCacheAdapter.ts (300銵?
- 摰䂿緵
CacheAdapter<20>亙藁 - 雿輻鍂
platform_schema.app_cache銵? - <EFBFBD>舀<EFBFBD><EFBFBD>埝<EFBFBD><EFBFBD>𣳇膄<EFBFBD>峕鸌<EFBFBD>𤩺<EFBFBD><EFBFBD>?
- 摰䂿緵
-
PgBossQueue.ts (400銵?
- 摰䂿緵
JobQueue<20>亙藁 - 撠<EFBFBD><EFBFBD> pg-boss API
- 隞餃𦛚<EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>撠<EFBFBD><EFBFBD><EFBFBD>躰秤憭<EFBFBD><EFBFBD>
- 6撠𤩺𧒄餈<EFBFBD><EFBFBD><EFBFBD>園𡢿嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>蹂遙<EFBFBD>∴<EFBFBD>
- 摰䂿緵
-
CheckpointService.ts (260銵?
- *<EFBFBD>齿<EFBFBD>鈭桃<EFBFBD>嚗𡁏<EFBFBD>雿?
job.data嚗䔶<EFBFBD>靘肽<EFBFBD>銝𡁜𦛚銵? saveCheckpoint()- 靽嘥<E99DBD><E598A5>剔<EFBFBD><E58994>?job.dataloadCheckpoint()- 隞?job.data 霂餃<E99C82><E9A483>剔<EFBFBD>clearCheckpoint()- 皜<>膄<EFBFBD>剔<EFBFBD>getProgress()- <20>亥砭餈𥕦漲canResume()- 璉<><E79289>交糓<E4BAA4>血虾<E8A180>W<EFBFBD>
- *<EFBFBD>齿<EFBFBD>鈭桃<EFBFBD>嚗𡁏<EFBFBD>雿?
-
utils.ts (200銵?
splitIntoChunks()- <20>啁<EFBFBD><E59581><EFBFBD><EFBFBD>recommendChunkSize()- <20>箄<EFBFBD><E7AE84>刻<EFBFBD><E588BB>寞活憭批<E686AD>CHUNK_STRATEGIES- <20><>掩<EFBFBD>衤遙<E8A1A4>∠<EFBFBD><E288A0><EFBFBD><EFBFBD>蝑𣇉裦
ASL 璅∪<E79285>嚗<EFBFBD>㺿<EFBFBD>𩤃<EFBFBD>
-
screeningService.ts (480銵?
- <EFBFBD>?瘛餃<E7989B><E9A483>箄<EFBFBD><E7AE84><EFBFBD><EFBFBD>澆ế<E6BE86>哨<EFBFBD>QUEUE_THRESHOLD = 50嚗?
- <EFBFBD>?摰䂿緵<E482BF>湔𦻖璅∪<E79285><E288AA>屸<EFBFBD><E5B1B8>埈芋撘?
- <EFBFBD>?隞餃𦛚靽⊥<E99DBD>摮睃<E691AE><E79D83>?job.data 銝哨<E98A9D>銝滚<E98A9D><E6BB9A>典銁銝𡁜𦛚銵剁<E98AB5>
- <EFBFBD>?<3F>券<EFBFBD><E588B8>鸌甈∩遙<E288A9>∪<EFBFBD> pg-boss
-
screeningWorker.ts (410銵?
- <EFBFBD>?隞?job.data 霂餃<E99C82><E9A483>剔<EFBFBD>靽⊥<E99DBD>
- <EFBFBD>?雿輻鍂 CheckpointService <20>滢<EFBFBD> job.data
- <EFBFBD>?瘥?0<>∟扇敶蓥<E695B6>摮䀝<E691AE>甈⊥鱏<E28AA5>?
- <EFBFBD>?<3F>寞活摰峕<E691B0><E5B395>擧凒<E693A7>?job.data.checkpoint
- <EFBFBD>?蝏蠘恣撌脣<E6928C><E884A3>鞉鸌甈∴<E79488><E288B4>亥砭 platform_schema.job 銵剁<E98AB5>
DC 璅∪<E79285>嚗<EFBFBD>㺿<EFBFBD>𩤃<EFBFBD>
-
ExtractionController.ts (690銵?
- <EFBFBD>?瘛餃<E7989B><E9A483>箄<EFBFBD><E7AE84><EFBFBD><EFBFBD>澆ế<E6BE86>哨<EFBFBD>QUEUE_THRESHOLD = 50嚗?
- <EFBFBD>?摰䂿緵<E482BF>湔𦻖璅∪<E79285><E288AA>屸<EFBFBD><E5B1B8>埈芋撘?
- <EFBFBD>?隞餃𦛚靽⊥<E99DBD>摮睃<E691AE><E79D83>?job.data 銝?
- <EFBFBD>?<3F>券<EFBFBD><E588B8>鸌甈∩遙<E288A9>∪<EFBFBD> pg-boss
-
extractionWorker.ts (390銵䕘<E98AB5><E49598>啣遣)
- <EFBFBD>?<3F>寞活憭<E6B4BB><E686AD><EFBFBD>餉<EFBFBD>嚗<EFBFBD><E59A97> ASL 蝐颱撮嚗?
- <EFBFBD>?雿輻鍂 CheckpointService <20>滢<EFBFBD> job.data
- <EFBFBD>?<3F>峕芋<E5B395>𧢲<EFBFBD><F0A7A2B2>?+ <20>脩<EFBFBD>璉<EFBFBD>瘚?
- <EFBFBD>?<3F>剔<EFBFBD>蝏凋<E89D8F><E5878B>舀<EFBFBD>
<EFBFBD>滨蔭<EFBFBD><EFBFBD>辣嚗<EFBFBD>耨<EFBFBD>對<EFBFBD>
-
index.ts (190銵?
- <EFBFBD>?<3F>臬𢆡 jobQueue
- <EFBFBD>?瘜典<E7989C> ASL Worker
- <EFBFBD>?瘜典<E7989C> DC Worker
- <EFBFBD>?<3F>臬𢆡蝻枏<E89DBB>皜<EFBFBD><E79A9C>隞餃𦛚
-
env.ts (靽格㺿)
- <EFBFBD>?瘛餃<E7989B>
CACHE_TYPE<20>滨蔭嚗<E894AD>𣈲<EFBFBD>?postgres嚗? - <EFBFBD>?瘛餃<E7989B>
QUEUE_TYPE<20>滨蔭嚗<E894AD>𣈲<EFBFBD>?pgboss嚗?
- <EFBFBD>?瘛餃<E7989B>
-
schema.prisma (靽格㺿)
- <EFBFBD>?瘛餃<E7989B>
AppCache璅∪<E79285>嚗īlatform_schema嚗? - <EFBFBD>?<3F>墧<EFBFBD>
AslScreeningTask嚗<EFBFBD><EFBFBD><EFBFBD>?銝芸<E98A9D>畾蛛<E795BE> - <EFBFBD>?靽脲<E99DBD>
DCExtractionTask蝞<>瘣<EFBFBD><E798A3>銝齿溶<E9BDBF>惩<EFBFBD>畾蛛<E795BE>
- <EFBFBD>?瘛餃<E7989B>
<EFBFBD><EFBFBD> <20><><EFBFBD>臭漁<E887AD>?
1. pg-boss <20><><EFBFBD>蝥找蝙<E689BE>?
// <20>𥕦遣<F0A595A6>笔<EFBFBD>嚗<EFBFBD><E59A97>憿餅遬撘誩<E69298>撱綽<E692B1>
await boss.createQueue('task:batch');
// <20>券<EFBFBD><E588B8>遙<EFBFBD>∴<EFBFBD>撣血<E692A3><E8A180>唳旿嚗?
await boss.send('task:batch', {
taskId: 'xxx',
batchIndex: 5,
totalBatches: 20,
checkpoint: { ... } // <20>?隞餃𦛚蝞∠<E89D9E>靽⊥<E99DBD>摮睃銁 data 銝?
});
// 瘜典<E7989C> Worker
await boss.work('task:batch', async (jobs) => {
for (const job of jobs) {
// 隞?job.data 霂餃<E99C82><E9A483>剔<EFBFBD>
const checkpoint = job.data.checkpoint;
// 憭<><E686AD>隞餃𦛚...
}
});
2. JSONB 摮埈挾<E59F88><E68CBE><EFBFBD><EFBFBD>?
-- pg-boss <20>?job.data <20>?JSONB 蝐餃<E89D90>
-- <20>臭誑<E887AD>菜暑摮睃<E691AE>隞餅<E99A9E>蝏𤘪<E89D8F><F0A498AA><EFBFBD>㺭<EFBFBD>?
UPDATE platform_schema.job
SET data = jsonb_set(
data,
'{checkpoint}',
'{"currentIndex": 250, "processedBatches": 5}'::jsonb
)
WHERE id = $1;
-- <20>亥砭撌脣<E6928C><E884A3>鞉鸌甈∴<E79488><E288B4>拍鍂 JSONB 蝝W<E89D9D>嚗?
SELECT COUNT(*)
FROM platform_schema.job
WHERE name = 'asl:screening:batch'
AND data->>'taskId' = 'xxx'
AND data->'checkpoint'->'metadata'->>'completed' = 'true';
3. <20>箄<EFBFBD><E7AE84><EFBFBD><EFBFBD>澆ế<E6BE86>剔<EFBFBD>摰䂿緵
const QUEUE_THRESHOLD = 50;
// <20>?<3F>寞旿<E5AF9E>唳旿<E594B3>讛䌊<E8AE9B>券<EFBFBD>㗇𥋘璅∪<E79285>
if (items.length >= QUEUE_THRESHOLD) {
// <20>笔<EFBFBD>璅∪<E79285>嚗𡁜虾<F0A1819C>䭾<EFBFBD>找<EFBFBD><E689BE>?
const chunkSize = recommendChunkSize('type', items.length);
const chunks = splitIntoChunks(items, chunkSize);
await jobQueue.push(...);
} else {
// <20>湔𦻖璅∪<E79285>嚗𡁏<E59A97>扯<EFBFBD>隡睃<E99AA1>
processDirectly(items);
}
<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>䔮憸䀝<E686B8>閫<EFBFBD><E996AB>
<EFBFBD>桅<EFBFBD>1嚗䫤ts-node` ESM <20>舀<EFBFBD>撌?
*<EFBFBD>桅<EFBFBD>嚗?
Error: Cannot find module '.../PostgresCacheAdapter.js'
*<EFBFBD>笔<EFBFBD>嚗? ts-node 撖?ESM <20>?.js <20>拙<EFBFBD><E68B99>齿𣈲<E9BDBF><F0A388B2><EFBFBD>憟?
*閫<EFBFBD><EFBFBD>嚗? <20>寧鍂 tsx
npx tsx src/tests/test-postgres-cache.ts <20>?
<EFBFBD>桅<EFBFBD>2嚗䮝g-boss 餈<><E9A488><EFBFBD>園𡢿<E59C92>𣂼<EFBFBD>
*<EFBFBD>桅<EFBFBD>嚗?
AssertionError: configuration assert: expiration cannot exceed 24 hours
*<EFBFBD>笔<EFBFBD>嚗? 霈曄蔭鈭?expireInSeconds: 86400嚗?4撠𤩺𧒄嚗?
*閫<EFBFBD><EFBFBD>嚗? <20>嫣蛹 6 撠𤩺𧒄嚗<F0A79284><E59A97><EFBFBD><EFBFBD><EFBFBD>蹂遙<E8B982>∴<EFBFBD>
expireInSeconds: 21600 // 6撠𤩺𧒄
<EFBFBD>桅<EFBFBD>3嚗䮝g-boss 9.x 敹<>◆<EFBFBD>𥕦遣<F0A595A6>笔<EFBFBD>
*<EFBFBD>桅<EFBFBD>嚗?
Error: Queue test-job does not exist
*<EFBFBD>笔<EFBFBD>嚗? pg-boss 9.x <20><>閬<EFBFBD>遬撘誩<E69298>撱粹<E692B1><E7B2B9>?
*閫<EFBFBD><EFBFBD>嚗? <20>?push() <20>?process() 銝剜溶<E5899C>?createQueue()
await this.boss.createQueue(type);
<EFBFBD>桅<EFBFBD>4嚗帋<EFBFBD><EFBFBD>∟”摮埈挾<EFBFBD>滚<EFBFBD>摰帋<EFBFBD>
*<EFBFBD>桅<EFBFBD>嚗?
- ASL <20>?DC <20>質<EFBFBD>瘛餃<E7989B> 6 銝芰㮾<E88AB0>𣬚<EFBFBD>隞餃𦛚蝞∠<E89D9E>摮埈挾
- 餈嘥<EFBFBD> DRY <20>笔<EFBFBD><E7AC94>?3 撅<>沲<EFBFBD>?
*閫<EFBFBD><EFBFBD>嚗? Platform-Only <20>嗆<EFBFBD><E59786>齿<EFBFBD>
- <EFBFBD>𣳇膄銝𡁜𦛚銵其葉<EFBFBD><EFBFBD>遙<EFBFBD>∠恣<EFBFBD><EFBFBD><EFBFBD>畾?
- 蝏煺<EFBFBD>雿輻鍂
platform_schema.job.data摮睃<E691AE> - CheckpointService <20>滢<EFBFBD> job.data嚗峕<E59A97><E5B395>㗇芋<E39787>烾<EFBFBD>𡁶鍂
<EFBFBD><EFBFBD> <20>詨<EFBFBD><E8A9A8>𥟇鰵
1. Platform-Only <20>嗆<EFBFBD>璅∪<E79285>
*摰帋<EFBFBD>嚗?
- <EFBFBD><EFBFBD><EFBFBD>匧像<EFBFBD>啁漣<EFBFBD>蠘<EFBFBD>嚗<EFBFBD>遙<EFBFBD>∠恣<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>摮塩<EFBFBD><EFBFBD><EFBFBD><EFBFBD>梹<EFBFBD>蝏煺<EFBFBD><EFBFBD>?Platform 撅<><E69285><EFBFBD>?
- 銝𡁜𦛚撅<EFBFBD>蘨<EFBFBD>單釣銝𡁜𦛚<EFBFBD>餉<EFBFBD>嚗䔶<EFBFBD>摮睃<EFBFBD>隞餃𦛚蝞∠<EFBFBD>靽⊥<EFBFBD>
- <EFBFBD>拍鍂 pg-boss <20>?
job.data摮埈挾摰䂿緵隞餃𦛚<E9A483>嗆<EFBFBD><E59786>恣<EFBFBD>?
*隡睃飵嚗?
- <EFBFBD>?摰<><E691B0>蝚血<E89D9A> 3 撅<>沲<EFBFBD><E6B2B2><EFBFBD><EFBFBD>?
- <EFBFBD>?隞<><E99A9E>擃睃漲憭滨鍂嚗㇃heckpointService <20>𡁶鍂嚗?
- <EFBFBD>?<3F>㮖<EFBFBD>蝏湔擪嚗<E693AA><E59A97><EFBFBD>嫣耨<E5ABA3>對<EFBFBD>
- <EFBFBD>?<3F>㮖<EFBFBD><E3AE96>拙<EFBFBD>嚗<EFBFBD>鰵璅∪<E79285><E288AA>𣳇<EFBFBD>瘛餃<E7989B>摮埈挾嚗?
*<EFBFBD><EFBFBD>鍂<EFBFBD>箸艶嚗?
- 撠誩𣪧<EFBFBD><EFBFBD><EFBFBD><5鈭綽<E988AD>
- 銝剖<EFBFBD>閫<EFBFBD>芋蝟餌<EFBFBD>嚗?10銝䝄AU嚗?
- <EFBFBD><EFBFBD>閬<EFBFBD>翰<EFBFBD>蠘翮隞?
- 撣峕<EFBFBD><EFBFBD>滢<EFBFBD>餈鞟輕<EFBFBD>鞉𧋦
2. <20>箄<EFBFBD><E7AE84>峕芋撘誩<E69298><E8AAA9>?
*霈曇恣<EFBFBD><EFBFBD>艙嚗?
- 銝齿糓<EFBFBD><EFBFBD><EFBFBD>劐遙<EFBFBD>⊿<EFBFBD><EFBFBD><EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD>寞旿<EFBFBD>唳旿<EFBFBD>𤩺惣<EFBFBD>賡<EFBFBD>㗇𥋘憭<EFBFBD><EFBFBD>璅∪<EFBFBD>
- <EFBFBD>扯<EFBFBD>銝𤾸虾<EFBFBD>䭾<EFBFBD>抒<EFBFBD>撟唾﹛
*摰䂿緵蝏<EFBFBD><EFBFBD>嚗?
// 撠譍遙<E8AD8D>∴<EFBFBD><E288B4>湔𦻖憭<F0A6BB96><E686AD>嚗<EFBFBD><E59A97>扯<EFBFBD>隡睃<E99AA1>嚗?
if (items.length < 50) {
processDirectly(items); // 敹恍<E695B9>笔<EFBFBD>摨䈑<E691A8><1<><31><EFBFBD>
}
// 憭找遙<E689BE>∴<EFBFBD><E288B4>笔<EFBFBD>憭<EFBFBD><E686AD>嚗<EFBFBD>虾<EFBFBD>䭾<EFBFBD>找<EFBFBD><E689BE><EFBFBD><EFBFBD>
else {
const chunks = splitIntoChunks(items, 50);
await jobQueue.push(...); // <20>舀<EFBFBD><E88880>剔<EFBFBD>蝏凋<E89D8F>嚗<EFBFBD>虾餈鞱<E9A488>24撠𤩺𧒄
}
*<EFBFBD><EFBFBD><EFBFBD>嚗?
- <EFBFBD>冽<EFBFBD>雿㯄<EFBFBD>嚗𡁜<EFBFBD>隞餃𦛚蝘垍漣<EFBFBD>滚<EFBFBD>
- 蝟餌<EFBFBD><EFBFBD>舫<EFBFBD>嚗𡁜之隞餃𦛚銝滢<EFBFBD><EFBFBD>㰘<EFBFBD><EFBFBD>嗅仃韐?
- <EFBFBD>鞉𧋦隡睃<EFBFBD>嚗𡁻<EFBFBD><EFBFBD>齿<EFBFBD><EFBFBD>劐遙<EFBFBD>⊿<EFBFBD>韏圈<EFBFBD><EFBFBD>?
3. <20>箔<EFBFBD> job.data <20><>鱏<EFBFBD>寧賒隡?
隡删<EFBFBD><EFBFBD>寞<EFBFBD>嚗<EFBFBD><EFBFBD>隞祆<EFBFBD><EFBFBD>萘<EFBFBD><EFBFBD>𡁏<EFBFBD>嚗㚁<EFBFBD>
-- <20>?<3F>其<EFBFBD><E585B6>∟”銝剜溶<E5899C>䭾鱏<E4ADBE>孵<EFBFBD>畾?
ALTER TABLE screening_tasks ADD COLUMN checkpoint_data JSONB;
ALTER TABLE dc_extraction_tasks ADD COLUMN checkpoint_data JSONB;
-- 瘥譍葵璅∪<E79285><E288AA>質<EFBFBD><E8B3AA>𩤃<EFBFBD>
Platform-Only <20>寞<EFBFBD>嚗<EFBFBD><E59A97><EFBFBD><EFBFBD><EFBFBD>嚗㚁<E59A97>
// <20>?<3F>湔𦻖<E6B994>滢<EFBFBD> pg-boss <20>?job.data
await checkpointService.saveCheckpoint(jobId, {
currentIndex: 250,
processedBatches: 5,
totalBatches: 20
});
// <20><><EFBFBD>㗇芋<E39787>烾<EFBFBD>𡁶鍂嚗峕<E59A97><E5B395><EFBFBD>靽格㺿銝𡁜𦛚銵剁<E98AB5>
<EFBFBD>𥟇鰵<EFBFBD>對<EFBFBD>
- <EFBFBD>拍鍂<EFBFBD>唳<EFBFBD><EFBFBD>?
job.data摮埈挾嚗峕<E59A97><E5B395><EFBFBD><EFBFBD>啣<EFBFBD>摮埈挾 - 隞餃𦛚靽⊥<EFBFBD>銝𡡞<EFBFBD><EFBFBD>埈㺭<EFBFBD>桀銁<EFBFBD>䔶<EFBFBD>霈啣<EFBFBD>銝哨<EFBFBD><EFBFBD>唳旿銝<EFBFBD><EFBFBD>湔<EFBFBD>批撩
- CheckpointService <20><>迤<EFBFBD>𡁜<EFBFBD>鈭<EFBFBD>像<EFBFBD>啁漣<E59581>𡁶鍂
<EFBFBD><EFBFBD> 蝏誯<E89D8F><E8AAAF>躰悌
1. <20>𦠜𧒄<F0A6A09C>𤑳緵<F0A491B3>嗆<EFBFBD><E59786>桅<EFBFBD>
*<EFBFBD>躰悌嚗?
- Phase 6 摰峕<E691B0><E5B395>𠬍<EFBFBD><F0A0AC8D><EFBFBD><EFBFBD> Phase 7 <20>嗅<EFBFBD><E59785>唬誨<E594AC><E8AAA8><EFBFBD>憭漤䔮憸?
- *撟詨末<EFBFBD>𦠜𧒄<EFBFBD>𤑳緵嚗? 憒<><E68692>蝑匧<E89D91> Phase 8-9 <20>滚<EFBFBD><E6BB9A>堆<EFBFBD><E5A086>齿<EFBFBD><E9BDBF>鞉𧋦隡𡁻<E99AA1>敺<EFBFBD><E695BA>
*<EFBFBD>舐內嚗?
- 瘥誩<EFBFBD><EFBFBD>𣂷<EFBFBD>銝芷𧫴畾蛛<EFBFBD><EFBFBD>質<EFBFBD><EFBFBD>鮋▽<EFBFBD>嗆<EFBFBD>霈曇恣
- <EFBFBD>𤑳緵<EFBFBD>滚<EFBFBD>隞<EFBFBD><EFBFBD><EFBFBD>塚<EFBFBD>蝡见朖<EFBFBD><EFBFBD><EFBFBD><EFBFBD>臬炏<EFBFBD><EFBFBD>閬<EFBFBD><EFBFBD><EFBFBD>?
- "頞𦠜𡟺<F0A6A09C>齿<EFBFBD>嚗峕<E59A97><E5B395>祈<EFBFBD>雿?
2. <20><><EFBFBD><EFBFBD>拍鍂<E68B8D>唳<EFBFBD><E594B3>賢<EFBFBD>
*<EFBFBD>躰悌嚗?
- <EFBFBD><EFBFBD><EFBFBD>脲<EFBFBD>蝞堒銁<EFBFBD><EFBFBD><EFBFBD><EFBFBD>∟”銝剜溶<EFBFBD>牐遙<EFBFBD>∠恣<EFBFBD><EFBFBD><EFBFBD>畾?
- <EFBFBD>擧䔉<EFBFBD>讛<EFBFBD><EFBFBD>?pg-boss <20>?
job.data撌脩<E6928C><E884A9>𣂷<EFBFBD>鈭?JSONB 摮睃<E691AE> - 銝箔<EFBFBD>銋<EFBFBD><EFBFBD><EFBFBD>剁<EFBFBD>
*<EFBFBD>舐內嚗?
- <EFBFBD><EFBFBD><EFBFBD>閫<EFBFBD>歇<EFBFBD>匧極<EFBFBD>瑞<EFBFBD><EFBFBD>賢<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>喳<EFBFBD><EFBFBD>臬炏<EFBFBD>啣遣
- pg-boss <20>?
job.data撠望糓銝箏<E98A9D><E7AE8F>其遙<E585B6>∪<EFBFBD><E288AA>唳旿霈曇恣<E69B87>? - "銝滩<E98A9D><E6BBA9>齿鰵<E9BDBF>烐<EFBFBD>頧桀<E9A0A7>"
3. 瘚贝<E7989A>撽勗𢆡<E58B97><F0A286A1><EFBFBD><EFBFBD>?
*<EFBFBD>寞<EFBFBD>嚗?
- 瘥譍葵<EFBFBD>嗆挾摰峕<EFBFBD><EFBFBD>𡒊<EFBFBD><EFBFBD>喟<EFBFBD><EFBFBD>蹱<EFBFBD>霂?
- 瘚贝<EFBFBD>銝滢<EFBFBD>撉諹<EFBFBD><EFBFBD>蠘<EFBFBD>嚗諹<EFBFBD><EFBFBD>湧蠧霈曇恣<EFBFBD>桅<EFBFBD>
- <EFBFBD>訫<EFBFBD>瘚贝<EFBFBD> <20>?<3F><><EFBFBD>瘚贝<E7989A> <20>?<3F>嗆<EFBFBD>撉諹<E69289>瘚贝<E7989A>
*瘚贝<EFBFBD><EFBFBD><EFBFBD>辣嚗?
- Phase 1-5嚗? 銝芸<E98A9D><E88AB8><EFBFBD><EFBFBD>霂𤏪<E99C82>蝻枏<E89DBB><E69E8F><EFBFBD><EFBFBD><EFBFBD>𨰜<EFBFBD><F0A8B09C><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>鱏<EFBFBD>對<EFBFBD>
- Phase 6-7嚗? 銝芷<E98A9D><E88AB7>鞉<EFBFBD>霂𤏪<E99C82>ASL<53><4C>C 璅⊥<E79285>瘚贝<E7989A>嚗?
- <EFBFBD>齿<EFBFBD>嚗? 銝芣沲<E88AA3><E6B2B2><EFBFBD>霂<EFBFBD><E99C82>霂?
隞瑕<EFBFBD>潘<EFBFBD>
- <EFBFBD>𤑳緵鈭<EFBFBD><EFBFBD>銝?Linter <20>躰秤
- <EFBFBD>𤑳緵鈭?pg-boss API 雿輻鍂<E8BCBB>桅<EFBFBD>
- <EFBFBD>𤑳緵鈭<EFBFBD>沲<EFBFBD><EFBFBD>挽霈⊿䔮憸矋<EFBFBD><EFBFBD>滚<EFBFBD>摮埈挾嚗?
<EFBFBD>㴓 颲暹<E9A2B2><E69AB9><EFBFBD>𤌍<EFBFBD>?
<EFBFBD>詨<EFBFBD><EFBFBD>格<EFBFBD> <20>?
- **<2A>蹂遙<E8B982>∪虾<E288AA>䭾<EFBFBD>?*嚗𡁏𣈲<F0A1818F>?2-24 撠𤩺𧒄<F0A4A9BA><F0A79284>鵭隞餃𦛚嚗䔶<E59A97>隡𡁜<E99AA1>摰硺<E691B0><E7A1BA>滚鍳<E6BB9A><E98DB3>仃韐?
- **<2A>剔<EFBFBD>蝏凋<E89D8F>**嚗帋遙<E5B88B>∩葉<E288A9>剖<EFBFBD><E58996>臭<EFBFBD>銝𦠜活雿滨蔭蝏抒賒嚗䔶<E59A97>隡?<3F>賢僕"
- **<2A>園<EFBFBD>憭𡝗<E686AD><F0A19D97>?*嚗帋<E59A97>撘訫<E69298> Redis嚗䔶蝙<E494B6>典歇<E585B8>厩<EFBFBD> Postgres
- **3撅<33>沲<EFBFBD>?*嚗䥪latform 撅<><E69285>銝<EFBFBD>蝞∠<E89D9E>嚗䔶<E59A97><E494B6>∪<EFBFBD>銝𤘪釣銝𡁜𦛚
- 隞<EFBFBD><EFBFBD>憭滨鍂嚗鋴heckpointService<EFBFBD><EFBFBD>gBossQueue <20><><EFBFBD>㗇芋<E39787>烾<EFBFBD>𡁶鍂
<EFBFBD>扯<EFBFBD><EFBFBD>格<EFBFBD> <20>?
- **撠譍遙<E8AD8D>∪翰<E288AA>?*嚗?50<35>⊥㺭<E28AA5>桃<EFBFBD>蝥批<E89DA5>摨䈑<E691A8><E48891>湔𦻖璅∪<E79285>嚗?
- **憭找遙<E689BE>∪虾<E288AA>?*嚗尠竉50<35>⊥㺭<E28AA5>桅<EFBFBD><E6A185>堒<EFBFBD><E5A092><EFBFBD><EFBFBD><EFBFBD>舀<EFBFBD><E88880>剔<EFBFBD>蝏凋<E89D8F>
- **撟嗅<E6929F>憭<EFBFBD><E686AD>**嚗䮝g-boss <20>舀<EFBFBD>憭𡁜<E686AD>靘见僎銵<E5838E><E98AB5><EFBFBD>?
- **<2A>芸𢆡<E88AB8>滩<EFBFBD>**嚗𡁜仃韐乩遙<E4B9A9>∟䌊<E2889F>券<EFBFBD>霂?3 甈∴<E79488>撱嗉<E692B1> 60 蝘?
餈鞟輕<EFBFBD>格<EFBFBD> <20>?
- **蝞<><E89D9E>𤥁<EFBFBD>蝏?*嚗𡁜蘨<F0A1819C><E898A8>蝞∠<E89D9E> 1 銝芣㺭<E88AA3>桀<EFBFBD>嚗㇊ostgres嚗?
- <EFBFBD>滢<EFBFBD><EFBFBD>鞉𧋦嚗𡁻妟憸嘥<EFBFBD>韐寧鍂嚗<EFBFBD><EFBFBD><EFBFBD><EFBFBD>閬?Redis嚗?
- <EFBFBD>㮖<EFBFBD><EFBFBD>烐綉嚗𡁏<EFBFBD><EFBFBD>劐遙<EFBFBD>∩縑<EFBFBD>臬銁
platform_schema.job銵其葉 - **<2A>㮖<EFBFBD>靚<EFBFBD><E99D9A>**嚗𡁜<E59A97><F0A1819C><EFBFBD><EFBFBD><EFBFBD>亙<EFBFBD>霈啣<E99C88><E595A3>屸<EFBFBD>霂臬<E99C82><E887AC>?
<EFBFBD><EFBFBD> <20>扯<EFBFBD>憸<EFBFBD>摯
撟嗅<EFBFBD><EFBFBD>賢<EFBFBD>
| <EFBFBD>箸艶 | 撟嗅<EFBFBD><EFBFBD>? | Postgres <20>賢<EFBFBD> | <EFBFBD>園<EFBFBD> |
|---|---|---|---|
| 500 MAU | ~500 | <EFBFBD>?頧餅𠹭<E9A485>舀<EFBFBD> | Node.js <20>閧瑪蝔? |
| 5000 MAU | ~5000 | <EFBFBD>?<3F>舀<EFBFBD> | SAE 摰硺<E691B0><E7A1BA>? |
| 50000 MAU | ~50000 | <EFBFBD>𩤃<EFBFBD> <20><>隡睃<E99AA1> | Postgres 餈墧𦻖<E5A2A7>? |
*蝏栞捏嚗? 敶枏<E695B6>蝟餌<E89D9F>嚗?00 MAU嚗侨ostgres 蝏嘥笆銝齿糓<E9BDBF>園<EFBFBD><E59C92>?
隞餃𦛚憭<EFBFBD><EFBFBD><EFBFBD>賢<EFBFBD>
| 隞餃𦛚蝐餃<EFBFBD> | <EFBFBD>唳旿<EFBFBD>? | <EFBFBD>寞活<EFBFBD>? | 憸<EFBFBD>恣<EFBFBD>埈𧒄 | <EFBFBD>舫<EFBFBD><EFBFBD>? |
|---|---|---|---|---|
| ASL 蝑偦<E89D91>? | 100蝭? | 2<EFBFBD>? | 10<EFBFBD><EFBFBD><EFBFBD> | 潃鐥<EFBFBD>潃鐥<EFBFBD>潃? |
| ASL 蝑偦<E89D91>? | 1000蝭? | 20<EFBFBD>? | 2撠𤩺𧒄 | 潃鐥<EFBFBD>潃鐥<EFBFBD>潃? |
| DC <20>𣂼<EFBFBD> | 100<EFBFBD>? | 2<EFBFBD>? | 15<EFBFBD><EFBFBD><EFBFBD> | 潃鐥<EFBFBD>潃鐥<EFBFBD>潃? |
| DC <20>𣂼<EFBFBD> | 1000<EFBFBD>? | 20<EFBFBD>? | 2.5撠𤩺𧒄 | 潃鐥<EFBFBD>潃鐥<EFBFBD>潃? |
<EFBFBD>舫<EFBFBD><EFBFBD>找<EFBFBD><EFBFBD>頣<EFBFBD>
- <EFBFBD>?瘥𤩺鸌憭<E9B88C><E686AD>摰䔶<E691B0>摮䀹鱏<E480B9>?
- <EFBFBD>?隞餃𦛚憭梯揖<E6A2AF>芸𢆡<E88AB8>滩<EFBFBD>嚗?甈∴<E79488>
- <EFBFBD>?摰硺<E691B0><E7A1BA>滚鍳<E6BB9A>舘䌊<E88898>冽<EFBFBD>憭?
- <EFBFBD>?<3F>舀<EFBFBD> 24 撠𤩺𧒄頞<F0A79284>鵭隞餃𦛚
<EFBFBD>睸 <20>芣䔉<E88AA3>拙<EFBFBD>
1. <20>嗡<EFBFBD>璅∪<E79285><E288AA><EFBFBD><EFBFBD>嚗<EFBFBD>妟<EFBFBD>鞉𧋦嚗?
*SSA 璅∪<E79285>嚗<EFBFBD>惣<EFBFBD>賜<EFBFBD>霈∪<E99C88><E288AA>琜<EFBFBD>嚗?
// <20>?<3F>湔𦻖憭滨鍂 Platform 撅<><E69285><EFBFBD>?
if (models.length >= 30) {
// 30銝芣芋<E88AA3>见<EFBFBD><E8A781>嗉<EFBFBD> <20>?<3F>笔<EFBFBD>璅∪<E79285>
await jobQueue.push('ssa:model:batch', { ... });
} else {
// <30銝芣芋<E88AA3>?<3F>?<3F>湔𦻖璅∪<E79285>
runModelsDirectly();
}
*RVW 璅∪<E79285>嚗<EFBFBD><E59A97><EFBFBD>桃遞餈堆<E9A488>嚗?
// <20>?<3F>湔𦻖憭滨鍂 Platform 撅<><E69285><EFBFBD>?
if (sections.length >= 10) {
// 10銝芰<E98A9D><E88AB0>?<3F>?<3F>笔<EFBFBD>璅∪<E79285>
await jobQueue.push('rvw:section:batch', { ... });
}
*<EFBFBD>𣳇<EFBFBD>隞颱<EFBFBD> Schema 靽格㺿嚗? <20>湔𦻖雿輻鍂 job.data<74>?
2. 蝻枏<E89DBB>蝑𣇉裦隡睃<E99AA1>
*敶枏<EFBFBD>摰䂿緵嚗?
- 蝞<EFBFBD><EFBFBD>閧<EFBFBD> key-value 蝻枏<E89DBB>
- 5<EFBFBD><EFBFBD><EFBFBD>皜<EFBFBD><EFBFBD>銝<EFBFBD>甈∟<EFBFBD><EFBFBD><EFBFBD>㺭<EFBFBD>?
<EFBFBD>芣䔉<EFBFBD>臭<EFBFBD><EFBFBD>吔<EFBFBD>
- 瘛餃<EFBFBD> LRU 瘛䀹掠蝑𣇉裦
- 瘛餃<EFBFBD>蝻枏<EFBFBD>憸<EFBFBD><EFBFBD>
- 瘛餃<EFBFBD>蝻枏<EFBFBD><EFBFBD>賭葉<EFBFBD><EFBFBD><EFBFBD><EFBFBD>?
3. <20>笔<EFBFBD><E7AC94>烐綉<E78390>X踎
<EFBFBD>臬<EFBFBD><EFBFBD>堆<EFBFBD>
// <20>亥砭<E4BAA5>笔<EFBFBD>蝏蠘恣
const stats = await prisma.$queryRaw`
SELECT
name,
state,
COUNT(*) as count
FROM platform_schema.job
GROUP BY name, state
`;
// 摰墧𧒄<E5A2A7>烐綉嚗?
// - <20><><EFBFBD><EFBFBD>㛖<EFBFBD>敺<EFBFBD><E695BA><EFBFBD><EFBFBD>遙<EFBFBD>⊥㺭
// - 憭梯揖隞餃𦛚<E9A483>?
// - 撟喳<E6929F>憭<EFBFBD><E686AD><EFBFBD>園𡢿
<EFBFBD><EFBFBD> 銝衤<E98A9D>甇亥恣<E4BAA5>?
Phase 8嚗𡁜<E59A97><F0A1819C>X<EFBFBD>霂閖<E99C82>霂?<3F>妒
| 瘚贝<EFBFBD>憿? | 隡睃<EFBFBD>蝥? | 憸<EFBFBD>恣<EFBFBD>埈𧒄 |
|---|---|---|
| <EFBFBD>蠘<EFBFBD>瘚贝<EFBFBD> | 潃鐥<EFBFBD>潃? | 0.5憭? |
| 隞餃𦛚<EFBFBD><EFBFBD><EFBFBD>瘚贝<EFBFBD> | 潃鐥<EFBFBD>潃? | 0.5憭? |
| <EFBFBD>剔<EFBFBD>蝏凋<EFBFBD>瘚贝<EFBFBD> | *潃鐥<EFBFBD>潃鐥<EFBFBD>潃? | *1憭? |
| *<EFBFBD>蹂遙<EFBFBD>⊥<EFBFBD>霂? | *潃鐥<EFBFBD>潃鐥<EFBFBD>潃? | *1憭? |
| 摰硺<EFBFBD><EFBFBD>滚鍳瘚贝<EFBFBD> | 潃鐥<EFBFBD>潃鐥<EFBFBD> | 0.5憭? |
| 撟嗅<EFBFBD>瘚贝<EFBFBD> | 潃鐥<EFBFBD>潃? | 0.5憭? |
| <EFBFBD>扯<EFBFBD>瘚贝<EFBFBD> | 潃鐥<EFBFBD> | 0.5憭? |
*<EFBFBD>餉恣嚗? 5 憭?
Phase 9嚗锭AE <20>函蔡銝羓瑪 <20>噐
| 隞餃𦛚 | 憸<EFBFBD>恣<EFBFBD>埈𧒄 |
|---|---|
| <EFBFBD>滨蔭 SAE <20>臬<EFBFBD><E887AC>㗛<EFBFBD> | 0.5憭? |
| <EFBFBD>滨蔭撘寞<EFBFBD>找撓蝻? | 0.5憭? |
| <EFBFBD>啣漲<EFBFBD>穃<EFBFBD>嚗<EFBFBD><EFBFBD>撖?4撠𤩺𧒄嚗? | 1.5憭? |
| <EFBFBD>券<EFBFBD><EFBFBD>穃<EFBFBD> | 0.5憭? |
| <EFBFBD>煺漣撉諹<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>?8撠𤩺𧒄嚗? | 2.5憭? |
*<EFBFBD>餉恣嚗? 5.5 憭?
<EFBFBD>兛 <20>鞉𧋦撖寞<E69296>
Redis <20>寞<EFBFBD>
Redis 摰硺<E691B0>嚗𡄯縞500/<2F>?
餈鞟輕<E99E9F>鞉𧋦嚗𡄯縞200/<2F><><EFBFBD>憸嘥<E686B8>摮虫<E691AE><E899AB>𣬚輕<F0A3AC9A>歹<EFBFBD>
<0A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<0A>餉恣嚗𡄯縞700/<2F>?
撟湔<E6929F><E6B994>穿<EFBFBD>嚙?400
Postgres-Only <20>寞<EFBFBD>
憸嘥<EFBFBD><EFBFBD>鞉𧋦嚗𡄯縞0嚗<EFBFBD>蝙<EFBFBD>典歇<EFBFBD>侨ostgres嚗?
餈鞟輕<E99E9F>鞉𧋦嚗𡄯縞0嚗<30><E59A97><EFBFBD><EFBFBD>憸嘥<E686B8>蝏湔擪嚗?
<0A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<0A>餉恣嚗𡄯縞0/<2F>?
撟湔<E6929F><E6B994>穿<EFBFBD>嚙?
<0A><><EFBFBD>嚗𡄯縞8400/撟?<3F>兛
<EFBFBD><EFBFBD> <20><><EFBFBD>舀𤣰<E88880>?
1. pg-boss 瘛勗漲雿輻鍂
- <EFBFBD>笔<EFBFBD><EFBFBD>𥕦遣<EFBFBD>𣬚恣<EFBFBD>?
- Worker 瘜典<E7989C><E585B8>䔶遙<E494B6>∪<EFBFBD><E288AA>?
- <EFBFBD>滩<EFBFBD><EFBFBD>箏<EFBFBD><EFBFBD>諹<EFBFBD><EFBFBD>毺<EFBFBD><EFBFBD>?
- *job.data 摮埈挾<E59F88><E68CBE><EFBFBD><EFBFBD>?
2. Postgres 擃条漣<E69DA1>寞<EFBFBD>?
- JSONB 摮埈挾<E59F88><E68CBE><EFBFBD>瘣餅<E798A3>?
FOR UPDATE SKIP LOCKED<20><>僎<EFBFBD>烐綉<E78390>?- JSONB 蝝W<E89D9D><EFBCB7>峕䰻霂V<E99C82><EFBCB6>?
- 鈭见𦛚<EFBFBD>峕㺭<EFBFBD>桐<EFBFBD><EFBFBD>湔<EFBFBD>?
3. <20>嗆<EFBFBD>霈曇恣璅∪<E79285>
- 3 撅<>沲<EFBFBD><E6B2B2><EFBFBD>甇<EFBFBD>&摰噼殿
- **Platform-Only 璅∪<E79285>**嚗<><E59A97><EFBFBD>堆<EFBFBD>
- <EFBFBD><EFBFBD><EFBFBD><EFBFBD>冽芋撘𧶏<EFBFBD>CacheAdapter<EFBFBD><EFBFBD>obQueue嚗?
- 撌亙<EFBFBD>璅∪<EFBFBD>嚗㇃acheFactory<EFBFBD><EFBFBD>obFactory嚗?
<EFBFBD><EFBFBD> <20><>﹝鈭批枂
| <EFBFBD><EFBFBD>﹝ | 霂湔<EFBFBD> |
|---|---|
04-Redis<69>寥<EFBFBD>惩<EFBFBD><E683A9>質恣<E8B3AA>?md |
Redis <20>寞<EFBFBD>嚗<EFBFBD>歇摨笔<E691A8>嚗? |
05-Redis蝻枏<E89DBB>銝𡡞<E98A9D><F0A1A19E>㛖<EFBFBD><E39B96>箏<EFBFBD>霂湔<E99C82>.md |
Redis <20><><EFBFBD>臬<EFBFBD><E887AC>? |
06-<2D>踵𧒄<E8B8B5>港遙<E6B8AF>∪虾<E288AA>䭾<EFBFBD>批<EFBFBD><E689B9>?md |
<EFBFBD>蹂遙<EFBFBD>∪虾<EFBFBD>䭾<EFBFBD>抒<EFBFBD>蝛? |
07-Redis雿輻鍂<E8BCBB><E98D82>瘙<EFBFBD><E79899><EFBFBD>?<3F>㗇芋<E39787>?.md |
<EFBFBD><EFBFBD>芋<EFBFBD>?Redis <20><>瘙? |
08-Postgres-Only <20>刻<EFBFBD><E588BB>嗆<EFBFBD>閫<EFBFBD><E996AB><EFBFBD>寞<EFBFBD>.md |
Postgres-Only <20>寞<EFBFBD> |
09-Postgres-Only<6C>寥<EFBFBD>惩<EFBFBD><E683A9>質恣<E8B3AA>?摰峕㟲<E5B395>?.md |
霂衣<EFBFBD>摰墧鴌霈∪<EFBFBD> |
10-Postgres-Only<6C>寥<EFBFBD>㰘<EFBFBD>摨西蕭頦芾”.md |
餈𥕦漲蝞∠<EFBFBD> |
tests/README.md |
瘚贝<EFBFBD><EFBFBD><EFBFBD><EFBFBD> |
<EFBFBD><EFBFBD> <20>餌<EFBFBD>
隞𦠜𠯫撌乩<EFBFBD><EFBFBD>?
隞<EFBFBD><EFBFBD>蝻硋<EFBFBD>嚗鰺1750 銵?
隞<><E99A9E>靽格㺿嚗鰺500 銵?
瘚贝<E7989A>隞<EFBFBD><E99A9E>嚗鰺1800 銵?
<0A><>﹝蝻硋<E89DBB>嚗鰺800 銵?
<0A>桅<EFBFBD>靽桀<E99DBD>嚗?5+ 銝?
瘚贝<E7989A>餈鞱<E9A488>嚗?0+ 甈?
<0A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<0A>餃極雿𣈯<E99BBF>嚗𡁶漲 8-10 撠𤩺𧒄
韐券<EFBFBD>靽肽<EFBFBD>
- <EFBFBD>?Linter <20>躰秤嚗? 銝?
- <EFBFBD>?<3F>訫<EFBFBD>瘚贝<E7989A>嚗? 銝芸<E98A9D><E88AB8>券<EFBFBD>朞<EFBFBD>
- <EFBFBD>?<3F><><EFBFBD>瘚贝<E7989A>嚗? 銝芸<E98A9D><E88AB8>券<EFBFBD>朞<EFBFBD>
- <EFBFBD>?<3F>嗆<EFBFBD>撉諹<E69289>嚗𡁻<E59A97>朞<EFBFBD>
- <EFBFBD>?<3F>蠘<EFBFBD>撉諹<E69289>嚗𡁻<E59A97>朞<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD>臬<EFBFBD>箏𦛚
- <EFBFBD>𩤃<EFBFBD> Phase 8 <20>券𢒰瘚贝<E7989A>嚗<EFBFBD><E59A97>閬?<3F>剁<EFBFBD>
- <EFBFBD>𩤃<EFBFBD> <20>笔<EFBFBD> LLM 靚<>鍂瘚贝<E7989A>嚗<EFBFBD><E59A97>閬?API 撖<>𤨎嚗?
- <EFBFBD>𩤃<EFBFBD> <20>煺漣<E785BA>臬<EFBFBD>撉諹<E69289>嚗𠄎AE <20>函蔡<E587BD>𠬍<EFBFBD>
<EFBFBD><EFBFBD> 銝衤<E98A9D>甇亥<E79487><E4BAA5>?
<EFBFBD>剜<EFBFBD>嚗<EFBFBD>𧋦<EFBFBD>剁<EFBFBD>
-
*Phase 8嚗𡁜<E59A97><F0A1819C>X<EFBFBD>霂閖<E99C82>霂? 嚗?憭抬<E686AD>
- <EFBFBD>剔<EFBFBD>蝏凋<EFBFBD><EFBFBD>见<EFBFBD>瘚贝<EFBFBD>
- 1000蝭<EFBFBD><EFBFBD><EFBFBD>桀<EFBFBD><EFBFBD>湔<EFBFBD>蝔?
- 摰硺<EFBFBD><EFBFBD>滚鍳<EFBFBD>W<EFBFBD>瘚贝<EFBFBD>
-
<EFBFBD><EFBFBD>﹝<EFBFBD>湔鰵 嚗?.5憭抬<EFBFBD>
- <EFBFBD>湔鰵蝟餌<EFBFBD><EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD>﹝
- <EFBFBD>湔鰵 ASL 璅∪<E79285><E288AA><EFBFBD>﹝
- <EFBFBD>湔鰵 DC 璅∪<E79285><E288AA><EFBFBD>﹝
銝剜<EFBFBD>嚗<EFBFBD><EFBFBD><EFBFBD>剁<EFBFBD>
- Phase 9嚗锭AE <20>函蔡銝羓瑪 嚗?.5憭抬<EFBFBD>
- <EFBFBD>滨蔭<EFBFBD>臬<EFBFBD><EFBFBD>㗛<EFBFBD>
- <EFBFBD>啣漲<EFBFBD>穃<EFBFBD>
- <EFBFBD>煺漣撉諹<EFBFBD>
<EFBFBD>踵<EFBFBD>嚗<EFBFBD><EFBFBD>蝏哨<EFBFBD>
- *<EFBFBD>烐綉<EFBFBD>䔶<EFBFBD><EFBFBD>?
- <EFBFBD>烐綉<EFBFBD>笔<EFBFBD><EFBFBD>扯<EFBFBD>
- <EFBFBD>烐綉蝻枏<EFBFBD><EFBFBD>賭葉<EFBFBD>?
- <EFBFBD>寞旿摰鮋<EFBFBD><EFBFBD><EFBFBD><EFBFBD>靚<EFBFBD>㟲<EFBFBD>寞活憭批<EFBFBD>
<EFBFBD><EFBFBD> 憿寧𤌍鈭桃<E988AD>
-
Platform-Only <20>嗆<EFBFBD><E59786>𥟇鰵 <20><>
- 擐硋<EFBFBD><EFBFBD>箔<EFBFBD> job.data <20><>遙<EFBFBD>∠恣<E288A0><E681A3>芋撘?
- <EFBFBD><EFBFBD>迤摰䂿緵鈭<EFBFBD>像<EFBFBD>啣<EFBFBD>蝏煺<EFBFBD>蝞∠<EFBFBD>
- <EFBFBD>臭<EFBFBD>銝箸<EFBFBD>雿喳<EFBFBD>頝菜<EFBFBD>靘?
-
*<EFBFBD>箄<EFBFBD><EFBFBD>峕芋撘誩<EFBFBD><EFBFBD>? <20>㴓
- <EFBFBD>寞旿<EFBFBD>唳旿<EFBFBD>讛䌊<EFBFBD>券<EFBFBD>㗇𥋘璅∪<EFBFBD>
- <EFBFBD>扯<EFBFBD>銝𤾸虾<EFBFBD>䭾<EFBFBD>抒<EFBFBD>摰𣬚<EFBFBD>撟唾﹛
- <EFBFBD>冽<EFBFBD>雿㯄<EFBFBD>隡睃<EFBFBD>
-
<EFBFBD>嗆<EFBFBD><EFBFBD>祇<EFBFBD><EFBFBD>舫<EFBFBD> <20>兛
- 銝滚<EFBFBD><EFBFBD>仿<EFBFBD>憭𣇉<EFBFBD>隞?
- <EFBFBD>拍鍂 Postgres 摰䂿緵 Redis 蝥批<E89DA5><E689B9><EFBFBD><EFBFBD><EFBFBD>?
- <EFBFBD><EFBFBD><EFBFBD>撠誩𣪧<EFBFBD>笔翰<EFBFBD>蠘翮隞?
<EFBFBD><EFBFBD> <20>𠉛頂銝𤾸<E98A9D>擐?
憿寧𤌍韐蠘提鈭綽<EFBFBD> <20>冽<EFBFBD>
撘<EFBFBD><EFBFBD>穃𪂹<EFBFBD><EFBFBD><EFBFBD> 2025撟?2<>?<3F>?- 2025撟?2<>?3<>?
敶枏<EFBFBD><EFBFBD>嗆<EFBFBD><EFBFBD><EFBFBD> Phase 1-7 摰峕<E691B0>嚗釶hase 8-9 敺<><E695BA>銵?
*<EFBFBD><EFBFBD>﹝<EFBFBD><EFBFBD>𧋦嚗? V1.0
<EFBFBD><EFBFBD><EFBFBD>擧凒<EFBFBD>堆<EFBFBD> 2025撟?2<>?3<>?
*銝𧢲活<EFBFBD>湔鰵嚗? Phase 8 摰峕<E691B0><E5B395>?