vibes-plug 2.11.0 → 3.9.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/.claude/rules/vibes-plug-core.md +5 -0
- package/.cursor/rules/vibes-plug-core.mdc +8 -3
- package/.cursorrules +9 -3
- package/AGENTS.md +25 -4
- package/CHANGELOG.md +151 -0
- package/CLAUDE.md +15 -8
- package/README.md +216 -641
- package/bin/vibes.mjs +1104 -0
- package/index.js +1 -1
- package/package.json +11 -3
- package/plugin.json +4 -3
- package/scripts/check-anti-slop.js +53 -0
- package/scripts/check-anti-slop.mjs +53 -0
- package/scripts/generate_swarm_gif.py +2 -2
- package/scripts/install.js +3 -1
- package/scripts/update_skills.js +1 -1
- package/scripts/update_skills.mjs +86 -0
- package/scripts/validate-skills.mjs +111 -0
- package/skills/accessibility-testing-expert/SKILL.md +117 -116
- package/skills/affective-computing-emotion-ai/SKILL.md +83 -0
- package/skills/agentic-coding-workflow-expert/SKILL.md +297 -0
- package/skills/agentic-memory-architect/SKILL.md +52 -0
- package/skills/agentic-micro-economy-architect/SKILL.md +92 -0
- package/skills/ai-llm-integration-expert/SKILL.md +330 -187
- package/skills/ai-media-generation-expert/SKILL.md +173 -172
- package/skills/ai-prompt-engineering-expert/SKILL.md +170 -50
- package/skills/ai-safety-governance-expert/SKILL.md +223 -0
- package/skills/angular-expert/SKILL.md +149 -148
- package/skills/anti-slop/SKILL.md +134 -0
- package/skills/api-design-expert/SKILL.md +4 -3
- package/skills/api-gateway-proxy-expert/SKILL.md +3 -2
- package/skills/app-analyzer-optimizer/SKILL.md +4 -3
- package/skills/apple-ecosystem-expert/SKILL.md +6 -5
- package/skills/astro-framework-expert/SKILL.md +201 -200
- package/skills/async-queue-temporal-expert/SKILL.md +218 -240
- package/skills/authentication-identity-expert/SKILL.md +79 -184
- package/skills/autonomous-red-teamer/SKILL.md +338 -203
- package/skills/autonomous-tdd-debugger/SKILL.md +6 -5
- package/skills/biome-linter-formatter-expert/SKILL.md +90 -89
- package/skills/blockchain-web3-expert/SKILL.md +116 -115
- package/skills/brainstorming/SKILL.md +392 -377
- package/skills/browser-automation-expert/SKILL.md +260 -222
- package/skills/bun-runtime-expert/SKILL.md +5 -4
- package/skills/chatbot-messaging-expert/SKILL.md +115 -114
- package/skills/ci-cd-devops-architect/SKILL.md +3 -2
- package/skills/cloud-hosting-expert/SKILL.md +5 -4
- package/skills/coderabbit/SKILL.md +5 -4
- package/skills/compliance-gdpr-privacy-expert/SKILL.md +3 -2
- package/skills/composable-mach-architect/SKILL.md +338 -0
- package/skills/cron-scheduler-expert/SKILL.md +5 -4
- package/skills/data-pipeline-etl-expert/SKILL.md +3 -2
- package/skills/data-telemetry-expert/SKILL.md +5 -4
- package/skills/data-visualization-expert/SKILL.md +155 -154
- package/skills/database-orm-expert/SKILL.md +102 -240
- package/skills/deep-research-analyst/SKILL.md +182 -0
- package/skills/dependency-upgrade-migrator/SKILL.md +11 -10
- package/skills/design-system-architect/SKILL.md +34 -3
- package/skills/desktop-electron-expert/SKILL.md +129 -128
- package/skills/documentation-site-expert/SKILL.md +60 -59
- package/skills/doku-mcp-server/SKILL.md +5 -4
- package/skills/doku-payment-gateway/SKILL.md +250 -232
- package/skills/domain-driven-design-expert/SKILL.md +3 -2
- package/skills/e2e-testing-expert/SKILL.md +5 -4
- package/skills/ecommerce-expert/SKILL.md +88 -87
- package/skills/email-notification-expert/SKILL.md +35 -7
- package/skills/ephemeral-generative-ui-architect/SKILL.md +88 -0
- package/skills/error-resilience-expert/SKILL.md +26 -4
- package/skills/event-driven-architect/SKILL.md +5 -4
- package/skills/feature-flag-analytics-expert/SKILL.md +3 -2
- package/skills/file-upload-media-expert/SKILL.md +5 -4
- package/skills/firebase-security-expert/SKILL.md +5 -4
- package/skills/form-validation-expert/SKILL.md +7 -6
- package/skills/frontier-ai-models-expert/SKILL.md +116 -0
- package/skills/fullstack-expert/SKILL.md +68 -144
- package/skills/gemini-agent-booster/SKILL.md +248 -172
- package/skills/geospatial-maps-expert/SKILL.md +81 -80
- package/skills/global-a11y-i18n-expert/SKILL.md +5 -4
- package/skills/glsl-shader-expert/SKILL.md +155 -71
- package/skills/go-programming-expert/SKILL.md +5 -4
- package/skills/graph-rag-knowledge-expert/SKILL.md +201 -159
- package/skills/graphql-apollo-expert/SKILL.md +5 -4
- package/skills/headless-cms-expert/SKILL.md +182 -181
- package/skills/hig/SKILL.md +5 -4
- package/skills/js-backend-expert/SKILL.md +219 -218
- package/skills/legacy-code-translator/SKILL.md +6 -5
- package/skills/llm-finops-router/SKILL.md +52 -0
- package/skills/local-slm-edge-ai-expert/SKILL.md +168 -167
- package/skills/logging-error-tracking-expert/SKILL.md +5 -4
- package/skills/mcp-server-architect/SKILL.md +316 -294
- package/skills/micro-frontend-architect/SKILL.md +5 -4
- package/skills/mobile-expo-expert/SKILL.md +5 -4
- package/skills/modern-css-native-expert/SKILL.md +190 -189
- package/skills/monorepo-architect/SKILL.md +5 -4
- package/skills/mpa-orchestrator/SKILL.md +41 -4
- package/skills/multi-agent-orchestration/SKILL.md +388 -254
- package/skills/mvc-expert/SKILL.md +5 -4
- package/skills/n8n-automation-expert/SKILL.md +90 -89
- package/skills/nextjs-app-router-expert/SKILL.md +3 -2
- package/skills/openapi-swagger-codegen-expert/SKILL.md +4 -3
- package/skills/payment-gateway-expert/SKILL.md +131 -128
- package/skills/pdf-document-generation-expert/SKILL.md +92 -91
- package/skills/performance-web-vitals/SKILL.md +5 -4
- package/skills/post-quantum-crypto-migrator/SKILL.md +3 -2
- package/skills/prd-architect/SKILL.md +85 -109
- package/skills/proactive-background-watcher/SKILL.md +5 -4
- package/skills/production-ready-hardener/SKILL.md +25 -27
- package/skills/pwa-offline-first-expert/SKILL.md +227 -185
- package/skills/pydantic-ai-expert/SKILL.md +162 -0
- package/skills/python-programming-expert/SKILL.md +5 -4
- package/skills/rate-limit-abuse-prevention/SKILL.md +5 -4
- package/skills/realtime-collaboration-expert/SKILL.md +3 -2
- package/skills/rich-text-editor-expert/SKILL.md +178 -177
- package/skills/rust-programming-expert/SKILL.md +5 -4
- package/skills/saas-architect/SKILL.md +155 -0
- package/skills/saas-billing/SKILL.md +394 -382
- package/skills/saas-multi-tenant/SKILL.md +7 -6
- package/skills/scalability-clean-code/SKILL.md +5 -4
- package/skills/search-engine-expert/SKILL.md +90 -89
- package/skills/self-healing-cloud-orchestrator/SKILL.md +3 -2
- package/skills/senior-frontend/SKILL.md +21 -18
- package/skills/senior-frontend/scripts/frontend_scaffolder.py +1 -1
- package/skills/seo/SKILL.md +4 -4
- package/skills/session-memory-manager/SKILL.md +129 -0
- package/skills/solidjs-expert/SKILL.md +81 -80
- package/skills/spa-orchestrator/SKILL.md +5 -4
- package/skills/sse-websocket-streaming-expert/SKILL.md +3 -2
- package/skills/state-management-expert/SKILL.md +5 -4
- package/skills/supabase-security-expert/SKILL.md +5 -4
- package/skills/svelte-sveltekit-expert/SKILL.md +92 -91
- package/skills/svg-animation-motion-expert/SKILL.md +3 -2
- package/skills/synthetic-data-finetuning-expert/SKILL.md +156 -0
- package/skills/tailwind-expert/SKILL.md +62 -5
- package/skills/tanstack-query-expert/SKILL.md +5 -4
- package/skills/tauri-expert/SKILL.md +5 -4
- package/skills/typescript-expert/SKILL.md +5 -4
- package/skills/ui-ux-pro-max/SKILL.md +7 -4
- package/skills/vector-db-rag-expert/SKILL.md +209 -208
- package/skills/vercel-ai-sdk-expert/SKILL.md +226 -0
- package/skills/voice-ai-realtime-agent/SKILL.md +243 -202
- package/skills/vue-frontend-expert/SKILL.md +5 -4
- package/skills/wasm-edge-computing-expert/SKILL.md +3 -2
- package/skills/web-3d-graphics-expert/SKILL.md +259 -82
- package/skills/web-game-engine-expert/SKILL.md +278 -50
- package/skills/web-scraper/SKILL.md +158 -157
- package/skills/website-design-cloner/SKILL.md +5 -4
- package/skills/webxr-ar-vr-expert/SKILL.md +105 -65
- package/skills/wordpress-headless-expert/SKILL.md +145 -144
- package/skills/zero-tech-debt-auditor/SKILL.md +115 -0
- package/skills/zero-to-prod-orchestrator/SKILL.md +281 -227
- package/skills/zero-trust-secret-vault/SKILL.md +3 -2
- package/BLUEPRINT.md +0 -309
- package/skills/ai-cost-token-optimizer/SKILL.md +0 -82
- package/skills/ai-evals-benchmark-expert/SKILL.md +0 -188
- package/skills/asisten-ramah/SKILL.md +0 -47
- package/skills/auto-doc-updater/SKILL.md +0 -220
- package/skills/autonomous-chaos-monkey/SKILL.md +0 -63
- package/skills/background-jobs-queue-expert/SKILL.md +0 -235
- package/skills/bootstrap-to-modern/SKILL.md +0 -94
- package/skills/database-migration-versioning-expert/SKILL.md +0 -90
- package/skills/edge-serverless-db-expert/SKILL.md +0 -99
- package/skills/mcp-client-orchestrator/SKILL.md +0 -76
- package/skills/mobile-push-notification-expert/SKILL.md +0 -71
- package/skills/monday-design-aesthetic/SKILL.md +0 -73
- package/skills/multiple-entry-points/SKILL.md +0 -91
- package/skills/project-context-mapper/SKILL.md +0 -85
- package/skills/saas-mvp-launcher/SKILL.md +0 -260
- package/skills/saas-transformer/SKILL.md +0 -500
- package/skills/saas-transformer/references/billing_integration_guide.md +0 -401
- package/skills/secure-fuzz-testing/SKILL.md +0 -207
- package/skills/self-evolving-memory-graph/SKILL.md +0 -91
- package/skills/session-context-loader/SKILL.md +0 -83
- package/skills/session-handoff-resume/SKILL.md +0 -164
- package/skills/skill-baru/SKILL.md +0 -178
- package/skills/supabase-migration/SKILL.md +0 -91
- package/skills/token-saver/SKILL.md +0 -119
- package/skills/ui-components-expert/SKILL.md +0 -166
- package/skills/vibe-code-gardener/SKILL.md +0 -181
- package/skills/visual-qa-vision-agent/SKILL.md +0 -71
- /package/skills/{saas-transformer → saas-architect}/references/feature_gating_patterns.md +0 -0
- /package/skills/{saas-transformer → saas-architect}/references/saas_transformation_checklist.md +0 -0
- /package/skills/{saas-transformer → saas-architect}/scripts/saas_transformation_scanner.py +0 -0
|
@@ -1,240 +1,218 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: async-queue-temporal-expert
|
|
3
|
-
description: "
|
|
4
|
-
author: "Roedy Rustam"
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
###
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
1
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
return await renderDokumenPdf(data);
|
|
220
|
-
});
|
|
221
|
-
|
|
222
|
-
await ctx.run('kirim-webhook', async () => {
|
|
223
|
-
return await notifikasiWebhook(payload.tenantId, urlPdf);
|
|
224
|
-
});
|
|
225
|
-
|
|
226
|
-
return { sukses: true, urlPdf };
|
|
227
|
-
},
|
|
228
|
-
});
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
### Checklist Implementasi
|
|
234
|
-
- [ ] Terapkan penanganan rollback (Saga) untuk alur transaksi pembayaran dan provisi akun bertahap.
|
|
235
|
-
- [ ] Pastikan kode di dalam alur Temporal selalu deterministik (jangan gunakan `Math.random()` atau kueri DB langsung di dalam workflow, tempatkan di dalam activities).
|
|
236
|
-
- [ ] Pindahkan berkas besar ke S3/R2 dan hanya teruskan referensi ID melalui queue.
|
|
237
|
-
- [ ] Pasang konfigurasi DLQ (Dead Letter Queue) dan notifikasi peringatan jika ada job yang macet.
|
|
238
|
-
|
|
239
|
-
## Integrasi Orkestrasi
|
|
240
|
-
- Terintegrasi dengan: `js-backend-expert`, `background-jobs-queue-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`.
|
|
1
|
+
---
|
|
2
|
+
name: async-queue-temporal-expert
|
|
3
|
+
description: "Unified expert guide for async job queues & durable workflows: BullMQ v5 (Redis queues), Trigger.dev v3 (serverless tasks), Inngest, and Temporal.io (distributed sagas) / Panduan ahli terpadu untuk antrean job asinkron & workflow tahan-gagal: BullMQ v5, Trigger.dev v3, Inngest, dan Temporal.io."
|
|
4
|
+
author: "Roedy Rustam"
|
|
5
|
+
version: "3.0.0"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Async Queue & Durable Workflow Expert (2026 Unified Edition)
|
|
9
|
+
|
|
10
|
+
[English](#english) | [Bahasa Indonesia](#bahasa-indonesia)
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<a name="english"></a>
|
|
15
|
+
## English
|
|
16
|
+
|
|
17
|
+
### Purpose & Overview
|
|
18
|
+
Unified production-grade guide for background execution pipelines, async job queues, and distributed state machines. Covers the full spectrum from simple Redis-backed task queues to complex multi-service sagas with compensating rollbacks.
|
|
19
|
+
|
|
20
|
+
### 3-Tier Execution Model
|
|
21
|
+
| Tier | Engine | Best For |
|
|
22
|
+
|------|--------|----------|
|
|
23
|
+
| **Tier 1: Redis Task Queues** | BullMQ v5 | High-throughput worker jobs, priority queues, rate limiting, DLQ |
|
|
24
|
+
| **Tier 2: Serverless Durable Tasks** | Trigger.dev v3 / Inngest | Step-checkpointed tasks, automatic resume across crashes, zero infra |
|
|
25
|
+
| **Tier 3: Distributed Sagas** | Temporal.io | Multi-service orchestration, compensating rollbacks, long-running workflows |
|
|
26
|
+
|
|
27
|
+
### Core Capabilities
|
|
28
|
+
1. **Idempotency & Deduplication**: Deterministic `jobId` keys prevent double billing or duplicate emails.
|
|
29
|
+
2. **Dead Letter Queues (DLQ)**: Auto-relocate permanently failing jobs for audit and alerting.
|
|
30
|
+
3. **Exponential Backoff with Jitter**: Prevents thundering herds on upstream services.
|
|
31
|
+
4. **Tenant Priority Queues**: VIP/enterprise tiers get lower BullMQ priority numbers (higher throughput).
|
|
32
|
+
5. **Durable State Machines**: Workflows survive restarts, deployments, and network partitions.
|
|
33
|
+
6. **Saga Compensations**: Multi-step transactions with automated reverse-order rollbacks.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
### Tier 1: BullMQ v5 — Redis Task Queues (TypeScript)
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
import { Queue, Worker, Job } from 'bullmq';
|
|
41
|
+
import Redis from 'ioredis';
|
|
42
|
+
|
|
43
|
+
const redisConnection = new Redis(process.env.REDIS_URL!, {
|
|
44
|
+
maxRetriesPerRequest: null, // Required by BullMQ
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export interface NotificationPayload {
|
|
48
|
+
tenantId: string;
|
|
49
|
+
userId: string;
|
|
50
|
+
type: 'email' | 'webhook';
|
|
51
|
+
payload: Record<string, unknown>;
|
|
52
|
+
idempotencyKey: string;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Main Queue
|
|
56
|
+
export const notificationQueue = new Queue<NotificationPayload>('notifications', {
|
|
57
|
+
connection: redisConnection,
|
|
58
|
+
defaultJobOptions: {
|
|
59
|
+
attempts: 5,
|
|
60
|
+
backoff: { type: 'exponential', delay: 1500 },
|
|
61
|
+
removeOnComplete: { age: 86400, count: 5000 },
|
|
62
|
+
removeOnFail: false, // Preserved for DLQ audit
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Dead Letter Queue
|
|
67
|
+
export const notificationDLQ = new Queue('notifications-dlq', {
|
|
68
|
+
connection: redisConnection,
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
// Enqueue with deduplication & priority
|
|
72
|
+
export async function enqueueNotification(data: NotificationPayload, isVip = false) {
|
|
73
|
+
return await notificationQueue.add('send_notification', data, {
|
|
74
|
+
jobId: `notif_${data.idempotencyKey}`, // Deterministic dedup key
|
|
75
|
+
priority: isVip ? 1 : 10,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Worker with concurrency & rate limiting
|
|
80
|
+
export const notificationWorker = new Worker<NotificationPayload>(
|
|
81
|
+
'notifications',
|
|
82
|
+
async (job: Job<NotificationPayload>) => {
|
|
83
|
+
if (job.data.type === 'email') await deliverEmail(job.data);
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
connection: redisConnection,
|
|
87
|
+
concurrency: 20,
|
|
88
|
+
limiter: { max: 100, duration: 1000 },
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
// DLQ forwarding on retry exhaustion
|
|
93
|
+
notificationWorker.on('failed', async (job, error) => {
|
|
94
|
+
if (job && job.attemptsMade >= (job.opts.attempts || 5)) {
|
|
95
|
+
await notificationDLQ.add('failed_notification', {
|
|
96
|
+
originalJobId: job.id, failedReason: error.message,
|
|
97
|
+
data: job.data, exhaustedAt: new Date().toISOString(),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
### Tier 2: Trigger.dev v3 — Serverless Durable Tasks
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
import { task } from '@trigger.dev/sdk/v3';
|
|
109
|
+
|
|
110
|
+
export const generateReport = task({
|
|
111
|
+
id: 'generate-enterprise-report',
|
|
112
|
+
retry: { maxAttempts: 4, minTimeoutInMs: 2000, factor: 2, randomize: true },
|
|
113
|
+
run: async (payload: { tenantId: string; month: string }, { ctx }) => {
|
|
114
|
+
// Each step is a durable checkpoint — survives crashes
|
|
115
|
+
const data = await ctx.run('fetch-telemetry', async () => {
|
|
116
|
+
return await fetchTelemetryFromWarehouse(payload.tenantId, payload.month);
|
|
117
|
+
});
|
|
118
|
+
const pdfUrl = await ctx.run('render-pdf', async () => {
|
|
119
|
+
return await generateReportPdf(data);
|
|
120
|
+
});
|
|
121
|
+
await ctx.run('dispatch-webhook', async () => {
|
|
122
|
+
return await sendWebhookNotification(payload.tenantId, pdfUrl);
|
|
123
|
+
});
|
|
124
|
+
return { success: true, pdfUrl };
|
|
125
|
+
},
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
### Tier 3: Temporal.io — Distributed Saga with Compensations
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
import { proxyActivities, ApplicationFailure } from '@temporalio/workflow';
|
|
135
|
+
import type * as activities from './activities';
|
|
136
|
+
|
|
137
|
+
const { chargeCustomer, provisionLicense, sendWelcomeEmail, refundCustomer, revokeLicense } =
|
|
138
|
+
proxyActivities<typeof activities>({
|
|
139
|
+
startToCloseTimeout: '1 minute',
|
|
140
|
+
retry: {
|
|
141
|
+
initialInterval: '1s', backoffCoefficient: 2, maximumAttempts: 5,
|
|
142
|
+
nonRetryableErrorTypes: ['InvalidCardError', 'AccountSuspendedError'],
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
export async function subscriptionSagaWorkflow(input: {
|
|
147
|
+
customerId: string; planId: string; amountCents: number;
|
|
148
|
+
}) {
|
|
149
|
+
const compensations: Array<() => Promise<void>> = [];
|
|
150
|
+
try {
|
|
151
|
+
const charge = await chargeCustomer(input.customerId, input.amountCents);
|
|
152
|
+
compensations.unshift(() => refundCustomer(charge.chargeId));
|
|
153
|
+
|
|
154
|
+
const license = await provisionLicense(input.customerId, input.planId);
|
|
155
|
+
compensations.unshift(() => revokeLicense(license.licenseId));
|
|
156
|
+
|
|
157
|
+
await sendWelcomeEmail(input.customerId, license.licenseKey);
|
|
158
|
+
return { status: 'COMPLETED' };
|
|
159
|
+
} catch (error) {
|
|
160
|
+
for (const compensate of compensations) {
|
|
161
|
+
try { await compensate(); } catch (e) { console.error('Compensation failed:', e); }
|
|
162
|
+
}
|
|
163
|
+
throw ApplicationFailure.create({
|
|
164
|
+
message: `Saga rolled back: ${(error as Error).message}`, nonRetryable: true,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
> **Temporal Determinism Rule**: Never use `Math.random()`, `Date.now()`, or direct DB calls inside workflow files. Run them inside activities.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
### Implementation Checklist
|
|
175
|
+
- [ ] Configure `maxRetriesPerRequest: null` on ioredis for BullMQ v5.
|
|
176
|
+
- [ ] Use deterministic `jobId` from business logic (`order_${orderId}`) for deduplication.
|
|
177
|
+
- [ ] Forward permanently dead jobs to DLQ via `worker.on('failed')` listener.
|
|
178
|
+
- [ ] Implement rate limiting via worker `limiter` to protect third-party APIs.
|
|
179
|
+
- [ ] Enforce deterministic code inside Temporal workflows (activities for side-effects).
|
|
180
|
+
- [ ] Store large payloads in S3/R2; pass only IDs through queues.
|
|
181
|
+
- [ ] Implement Saga rollback handlers for multi-step distributed payments.
|
|
182
|
+
|
|
183
|
+
## Orchestration & Integration
|
|
184
|
+
- Integrates with: `js-backend-expert`, `cron-scheduler-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`, `data-telemetry-expert`.
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
<a name="bahasa-indonesia"></a>
|
|
189
|
+
## Bahasa Indonesia
|
|
190
|
+
|
|
191
|
+
### Tujuan & Gambaran Umum
|
|
192
|
+
Panduan terpadu tingkat produksi untuk pipeline eksekusi latar belakang, antrean job asinkron, dan state machine terdistribusi. Mencakup spektrum penuh dari antrean Redis sederhana hingga saga multi-layanan dengan rollback kompensasi.
|
|
193
|
+
|
|
194
|
+
### Model Eksekusi 3-Tier
|
|
195
|
+
| Tier | Engine | Cocok Untuk |
|
|
196
|
+
|------|--------|-------------|
|
|
197
|
+
| **Tier 1: Antrean Redis** | BullMQ v5 | Job worker throughput tinggi, prioritas, rate limiting, DLQ |
|
|
198
|
+
| **Tier 2: Task Serverless** | Trigger.dev v3 / Inngest | Task dengan checkpoint, resume otomatis, tanpa infra |
|
|
199
|
+
| **Tier 3: Saga Terdistribusi** | Temporal.io | Orkestrasi multi-layanan, rollback kompensasi, workflow jangka panjang |
|
|
200
|
+
|
|
201
|
+
### Kemampuan Utama
|
|
202
|
+
1. **Idempotensi & Deduplikasi**: Kunci `jobId` deterministik mencegah duplikasi penagihan atau email.
|
|
203
|
+
2. **Dead Letter Queue (DLQ)**: Pemindahan otomatis job gagal total untuk audit.
|
|
204
|
+
3. **Backoff Eksponensial + Jitter**: Mencegah thundering herd pada server hilir.
|
|
205
|
+
4. **Prioritas Tenant**: Tier VIP/enterprise mendapat prioritas lebih tinggi (angka lebih kecil di BullMQ).
|
|
206
|
+
5. **State Machine Tahan-Gagal**: Workflow bertahan saat restart, deployment, dan partisi jaringan.
|
|
207
|
+
6. **Kompensasi Saga**: Transaksi multi-langkah dengan rollback otomatis urutan mundur.
|
|
208
|
+
|
|
209
|
+
### Checklist Implementasi
|
|
210
|
+
- [ ] Atur `maxRetriesPerRequest: null` pada ioredis untuk BullMQ v5.
|
|
211
|
+
- [ ] Gunakan `jobId` deterministik dari ID bisnis (`invoice_${invoiceId}`) untuk deduplikasi.
|
|
212
|
+
- [ ] Pasang listener `worker.on('failed')` untuk forward job gagal ke DLQ.
|
|
213
|
+
- [ ] Terapkan rate limiter pada worker untuk stabilitas API eksternal.
|
|
214
|
+
- [ ] Pastikan kode Temporal selalu deterministik (side-effect hanya di activities).
|
|
215
|
+
- [ ] Simpan file besar di S3/R2; kirim hanya referensi ID melalui queue.
|
|
216
|
+
|
|
217
|
+
## Integrasi Orkestrasi
|
|
218
|
+
- Terintegrasi dengan: `js-backend-expert`, `cron-scheduler-expert`, `error-resilience-expert`, `saas-billing`, `doku-payment-gateway`, `data-telemetry-expert`.
|