@stacksjs/ts-cloud-core 0.1.1
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/LICENSE.md +21 -0
- package/README.md +321 -0
- package/package.json +31 -0
- package/src/advanced-features.test.ts +465 -0
- package/src/aws/cloudformation.ts +421 -0
- package/src/aws/cloudfront.ts +158 -0
- package/src/aws/credentials.test.ts +132 -0
- package/src/aws/credentials.ts +545 -0
- package/src/aws/index.ts +87 -0
- package/src/aws/s3.test.ts +188 -0
- package/src/aws/s3.ts +1088 -0
- package/src/aws/signature.test.ts +670 -0
- package/src/aws/signature.ts +1155 -0
- package/src/backup/disaster-recovery.test.ts +726 -0
- package/src/backup/disaster-recovery.ts +500 -0
- package/src/backup/index.ts +34 -0
- package/src/backup/manager.test.ts +498 -0
- package/src/backup/manager.ts +432 -0
- package/src/cicd/circleci.ts +430 -0
- package/src/cicd/github-actions.ts +424 -0
- package/src/cicd/gitlab-ci.ts +255 -0
- package/src/cicd/index.ts +8 -0
- package/src/cli/history.ts +396 -0
- package/src/cli/index.ts +10 -0
- package/src/cli/progress.ts +458 -0
- package/src/cli/repl.ts +454 -0
- package/src/cli/suggestions.ts +327 -0
- package/src/cli/table.test.ts +319 -0
- package/src/cli/table.ts +332 -0
- package/src/cloudformation/builder.test.ts +327 -0
- package/src/cloudformation/builder.ts +378 -0
- package/src/cloudformation/builders/api-gateway.ts +449 -0
- package/src/cloudformation/builders/cache.ts +334 -0
- package/src/cloudformation/builders/cdn.ts +278 -0
- package/src/cloudformation/builders/compute.ts +485 -0
- package/src/cloudformation/builders/database.ts +392 -0
- package/src/cloudformation/builders/functions.ts +343 -0
- package/src/cloudformation/builders/messaging.ts +140 -0
- package/src/cloudformation/builders/monitoring.ts +300 -0
- package/src/cloudformation/builders/network.ts +264 -0
- package/src/cloudformation/builders/queue.ts +147 -0
- package/src/cloudformation/builders/security.ts +399 -0
- package/src/cloudformation/builders/storage.ts +285 -0
- package/src/cloudformation/index.ts +30 -0
- package/src/cloudformation/types.ts +173 -0
- package/src/compliance/aws-config.ts +543 -0
- package/src/compliance/cloudtrail.ts +376 -0
- package/src/compliance/compliance.test.ts +423 -0
- package/src/compliance/guardduty.ts +446 -0
- package/src/compliance/index.ts +66 -0
- package/src/compliance/security-hub.ts +456 -0
- package/src/containers/build-optimization.ts +416 -0
- package/src/containers/containers.test.ts +508 -0
- package/src/containers/image-scanning.ts +360 -0
- package/src/containers/index.ts +9 -0
- package/src/containers/registry.ts +293 -0
- package/src/containers/service-mesh.ts +520 -0
- package/src/database/database.test.ts +762 -0
- package/src/database/index.ts +9 -0
- package/src/database/migrations.ts +444 -0
- package/src/database/performance.ts +528 -0
- package/src/database/replicas.ts +534 -0
- package/src/database/users.ts +494 -0
- package/src/dependency-graph.ts +143 -0
- package/src/deployment/ab-testing.ts +582 -0
- package/src/deployment/blue-green.ts +452 -0
- package/src/deployment/canary.ts +500 -0
- package/src/deployment/deployment.test.ts +526 -0
- package/src/deployment/index.ts +61 -0
- package/src/deployment/progressive.ts +62 -0
- package/src/dns/dns.test.ts +641 -0
- package/src/dns/dnssec.ts +315 -0
- package/src/dns/index.ts +8 -0
- package/src/dns/resolver.ts +496 -0
- package/src/dns/routing.ts +593 -0
- package/src/email/advanced/analytics.ts +445 -0
- package/src/email/advanced/index.ts +11 -0
- package/src/email/advanced/rules.ts +465 -0
- package/src/email/advanced/scheduling.ts +352 -0
- package/src/email/advanced/search.ts +412 -0
- package/src/email/advanced/shared-mailboxes.ts +404 -0
- package/src/email/advanced/templates.ts +455 -0
- package/src/email/advanced/threading.ts +281 -0
- package/src/email/analytics.ts +467 -0
- package/src/email/bounce-handling.ts +425 -0
- package/src/email/email.test.ts +431 -0
- package/src/email/handlers/__tests__/inbound.test.ts +38 -0
- package/src/email/handlers/__tests__/outbound.test.ts +37 -0
- package/src/email/handlers/converter.ts +227 -0
- package/src/email/handlers/feedback.ts +228 -0
- package/src/email/handlers/inbound.ts +169 -0
- package/src/email/handlers/outbound.ts +178 -0
- package/src/email/index.ts +15 -0
- package/src/email/reputation.ts +303 -0
- package/src/email/templates.ts +352 -0
- package/src/errors/index.test.ts +434 -0
- package/src/errors/index.ts +416 -0
- package/src/health-checks/index.ts +40 -0
- package/src/index.ts +360 -0
- package/src/intrinsic-functions.ts +118 -0
- package/src/lambda/concurrency.ts +330 -0
- package/src/lambda/destinations.ts +345 -0
- package/src/lambda/dlq.ts +425 -0
- package/src/lambda/index.ts +11 -0
- package/src/lambda/lambda.test.ts +840 -0
- package/src/lambda/layers.ts +263 -0
- package/src/lambda/versions.ts +376 -0
- package/src/lambda/vpc.ts +399 -0
- package/src/local/config.ts +114 -0
- package/src/local/index.ts +6 -0
- package/src/local/mock-aws.ts +351 -0
- package/src/modules/ai.ts +340 -0
- package/src/modules/api.ts +478 -0
- package/src/modules/auth.ts +805 -0
- package/src/modules/cache.ts +417 -0
- package/src/modules/cdn.ts +1062 -0
- package/src/modules/communication.ts +1094 -0
- package/src/modules/compute.ts +3348 -0
- package/src/modules/database.ts +554 -0
- package/src/modules/deployment.ts +1079 -0
- package/src/modules/dns.ts +337 -0
- package/src/modules/email.ts +1538 -0
- package/src/modules/filesystem.ts +515 -0
- package/src/modules/index.ts +32 -0
- package/src/modules/messaging.ts +486 -0
- package/src/modules/monitoring.ts +2086 -0
- package/src/modules/network.ts +664 -0
- package/src/modules/parameter-store.ts +325 -0
- package/src/modules/permissions.ts +1081 -0
- package/src/modules/phone.ts +494 -0
- package/src/modules/queue.ts +1260 -0
- package/src/modules/redirects.ts +464 -0
- package/src/modules/registry.ts +699 -0
- package/src/modules/search.ts +401 -0
- package/src/modules/secrets.ts +416 -0
- package/src/modules/security.ts +731 -0
- package/src/modules/sms.ts +389 -0
- package/src/modules/storage.ts +1120 -0
- package/src/modules/workflow.ts +680 -0
- package/src/multi-account/config.ts +521 -0
- package/src/multi-account/index.ts +7 -0
- package/src/multi-account/manager.ts +427 -0
- package/src/multi-region/cross-region.ts +410 -0
- package/src/multi-region/index.ts +8 -0
- package/src/multi-region/manager.ts +483 -0
- package/src/multi-region/regions.ts +435 -0
- package/src/network-security/index.ts +48 -0
- package/src/observability/index.ts +9 -0
- package/src/observability/logs.ts +522 -0
- package/src/observability/metrics.ts +460 -0
- package/src/observability/observability.test.ts +782 -0
- package/src/observability/synthetics.ts +568 -0
- package/src/observability/xray.ts +358 -0
- package/src/phone/advanced/analytics.ts +349 -0
- package/src/phone/advanced/callbacks.ts +428 -0
- package/src/phone/advanced/index.ts +8 -0
- package/src/phone/advanced/ivr-builder.ts +504 -0
- package/src/phone/advanced/recording.ts +310 -0
- package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
- package/src/phone/handlers/incoming-call.ts +117 -0
- package/src/phone/handlers/missed-call.ts +116 -0
- package/src/phone/handlers/voicemail.ts +179 -0
- package/src/phone/index.ts +9 -0
- package/src/presets/api-backend.ts +134 -0
- package/src/presets/data-pipeline.ts +204 -0
- package/src/presets/extend.test.ts +295 -0
- package/src/presets/extend.ts +297 -0
- package/src/presets/fullstack-app.ts +144 -0
- package/src/presets/index.ts +27 -0
- package/src/presets/jamstack.ts +135 -0
- package/src/presets/microservices.ts +167 -0
- package/src/presets/ml-api.ts +208 -0
- package/src/presets/nodejs-server.ts +104 -0
- package/src/presets/nodejs-serverless.ts +114 -0
- package/src/presets/realtime-app.ts +184 -0
- package/src/presets/static-site.ts +64 -0
- package/src/presets/traditional-web-app.ts +339 -0
- package/src/presets/wordpress.ts +138 -0
- package/src/preview/github.test.ts +249 -0
- package/src/preview/github.ts +297 -0
- package/src/preview/index.ts +37 -0
- package/src/preview/manager.test.ts +440 -0
- package/src/preview/manager.ts +326 -0
- package/src/preview/notifications.test.ts +582 -0
- package/src/preview/notifications.ts +341 -0
- package/src/queue/batch-processing.ts +402 -0
- package/src/queue/dlq-monitoring.ts +402 -0
- package/src/queue/fifo.ts +342 -0
- package/src/queue/index.ts +9 -0
- package/src/queue/management.ts +428 -0
- package/src/queue/queue.test.ts +429 -0
- package/src/resource-mgmt/index.ts +39 -0
- package/src/resource-naming.ts +62 -0
- package/src/s3/index.ts +523 -0
- package/src/schema/cloud-config.schema.json +554 -0
- package/src/schema/index.ts +68 -0
- package/src/security/certificate-manager.ts +492 -0
- package/src/security/index.ts +9 -0
- package/src/security/scanning.ts +545 -0
- package/src/security/secrets-manager.ts +476 -0
- package/src/security/secrets-rotation.ts +456 -0
- package/src/security/security.test.ts +738 -0
- package/src/sms/advanced/ab-testing.ts +389 -0
- package/src/sms/advanced/analytics.ts +336 -0
- package/src/sms/advanced/campaigns.ts +523 -0
- package/src/sms/advanced/chatbot.ts +224 -0
- package/src/sms/advanced/index.ts +10 -0
- package/src/sms/advanced/link-tracking.ts +248 -0
- package/src/sms/advanced/mms.ts +308 -0
- package/src/sms/handlers/__tests__/send.test.ts +40 -0
- package/src/sms/handlers/delivery-status.ts +133 -0
- package/src/sms/handlers/receive.ts +162 -0
- package/src/sms/handlers/send.ts +174 -0
- package/src/sms/index.ts +9 -0
- package/src/stack-diff.ts +389 -0
- package/src/static-site/index.ts +85 -0
- package/src/template-builder.ts +110 -0
- package/src/template-validator.ts +574 -0
- package/src/utils/cache.ts +291 -0
- package/src/utils/diff.ts +269 -0
- package/src/utils/hash.ts +227 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/parallel.ts +294 -0
- package/src/validators/credentials.test.ts +274 -0
- package/src/validators/credentials.ts +233 -0
- package/src/validators/quotas.test.ts +434 -0
- package/src/validators/quotas.ts +217 -0
- package/test/ai.test.ts +327 -0
- package/test/api.test.ts +511 -0
- package/test/auth.test.ts +632 -0
- package/test/cache.test.ts +406 -0
- package/test/cdn.test.ts +247 -0
- package/test/compute.test.ts +861 -0
- package/test/database.test.ts +523 -0
- package/test/deployment.test.ts +499 -0
- package/test/dns.test.ts +270 -0
- package/test/email.test.ts +439 -0
- package/test/filesystem.test.ts +382 -0
- package/test/integration.test.ts +350 -0
- package/test/messaging.test.ts +514 -0
- package/test/monitoring.test.ts +634 -0
- package/test/network.test.ts +425 -0
- package/test/permissions.test.ts +488 -0
- package/test/queue.test.ts +484 -0
- package/test/registry.test.ts +306 -0
- package/test/security.test.ts +462 -0
- package/test/storage.test.ts +463 -0
- package/test/template-validator.test.ts +559 -0
- package/test/workflow.test.ts +592 -0
- package/tsconfig.json +16 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,402 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SQS Batch Processing
|
|
3
|
+
* Batch operations, parallel processing, and throughput optimization
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export interface BatchConfig {
|
|
7
|
+
id: string
|
|
8
|
+
queueUrl: string
|
|
9
|
+
batchSize: number
|
|
10
|
+
maxWaitTime: number // milliseconds
|
|
11
|
+
parallelProcessors: number
|
|
12
|
+
retryAttempts: number
|
|
13
|
+
visibilityTimeout: number
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export interface BatchJob {
|
|
17
|
+
id: string
|
|
18
|
+
configId: string
|
|
19
|
+
messages: BatchMessage[]
|
|
20
|
+
status: 'pending' | 'processing' | 'completed' | 'failed'
|
|
21
|
+
startedAt?: Date
|
|
22
|
+
completedAt?: Date
|
|
23
|
+
processedCount: number
|
|
24
|
+
failedCount: number
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface BatchMessage {
|
|
28
|
+
id: string
|
|
29
|
+
messageId: string
|
|
30
|
+
body: string
|
|
31
|
+
receiptHandle: string
|
|
32
|
+
attributes: Record<string, any>
|
|
33
|
+
status: 'pending' | 'processing' | 'success' | 'failed'
|
|
34
|
+
processingTime?: number
|
|
35
|
+
error?: string
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export interface ProcessorMetrics {
|
|
39
|
+
id: string
|
|
40
|
+
configId: string
|
|
41
|
+
timestamp: Date
|
|
42
|
+
messagesProcessed: number
|
|
43
|
+
averageProcessingTime: number
|
|
44
|
+
throughput: number // messages per second
|
|
45
|
+
errorRate: number
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Batch processing manager
|
|
50
|
+
*/
|
|
51
|
+
export class BatchProcessingManager {
|
|
52
|
+
private configs: Map<string, BatchConfig> = new Map()
|
|
53
|
+
private jobs: Map<string, BatchJob> = new Map()
|
|
54
|
+
private metrics: Map<string, ProcessorMetrics[]> = new Map()
|
|
55
|
+
private configCounter = 0
|
|
56
|
+
private jobCounter = 0
|
|
57
|
+
private metricsCounter = 0
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Create batch config
|
|
61
|
+
*/
|
|
62
|
+
createBatchConfig(config: Omit<BatchConfig, 'id'>): BatchConfig {
|
|
63
|
+
const id = `batch-config-${Date.now()}-${this.configCounter++}`
|
|
64
|
+
|
|
65
|
+
const batchConfig: BatchConfig = {
|
|
66
|
+
id,
|
|
67
|
+
...config,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
this.configs.set(id, batchConfig)
|
|
71
|
+
|
|
72
|
+
return batchConfig
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Create high-throughput batch config
|
|
77
|
+
*/
|
|
78
|
+
createHighThroughputConfig(options: {
|
|
79
|
+
queueUrl: string
|
|
80
|
+
}): BatchConfig {
|
|
81
|
+
return this.createBatchConfig({
|
|
82
|
+
queueUrl: options.queueUrl,
|
|
83
|
+
batchSize: 10, // Max for SQS
|
|
84
|
+
maxWaitTime: 100,
|
|
85
|
+
parallelProcessors: 10,
|
|
86
|
+
retryAttempts: 3,
|
|
87
|
+
visibilityTimeout: 30,
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Create low-latency batch config
|
|
93
|
+
*/
|
|
94
|
+
createLowLatencyConfig(options: {
|
|
95
|
+
queueUrl: string
|
|
96
|
+
}): BatchConfig {
|
|
97
|
+
return this.createBatchConfig({
|
|
98
|
+
queueUrl: options.queueUrl,
|
|
99
|
+
batchSize: 1,
|
|
100
|
+
maxWaitTime: 0,
|
|
101
|
+
parallelProcessors: 5,
|
|
102
|
+
retryAttempts: 2,
|
|
103
|
+
visibilityTimeout: 10,
|
|
104
|
+
})
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Create batch job
|
|
109
|
+
*/
|
|
110
|
+
createBatchJob(options: {
|
|
111
|
+
configId: string
|
|
112
|
+
messageCount: number
|
|
113
|
+
}): BatchJob {
|
|
114
|
+
const id = `batch-job-${Date.now()}-${this.jobCounter++}`
|
|
115
|
+
|
|
116
|
+
const config = this.configs.get(options.configId)
|
|
117
|
+
|
|
118
|
+
if (!config) {
|
|
119
|
+
throw new Error(`Batch config not found: ${options.configId}`)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const messages: BatchMessage[] = []
|
|
123
|
+
for (let i = 0; i < options.messageCount; i++) {
|
|
124
|
+
messages.push({
|
|
125
|
+
id: `msg-${id}-${i}`,
|
|
126
|
+
messageId: `${id}-${i}`,
|
|
127
|
+
body: `Message ${i}`,
|
|
128
|
+
receiptHandle: `receipt-${id}-${i}`,
|
|
129
|
+
attributes: {},
|
|
130
|
+
status: 'pending',
|
|
131
|
+
})
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const job: BatchJob = {
|
|
135
|
+
id,
|
|
136
|
+
configId: options.configId,
|
|
137
|
+
messages,
|
|
138
|
+
status: 'pending',
|
|
139
|
+
processedCount: 0,
|
|
140
|
+
failedCount: 0,
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
this.jobs.set(id, job)
|
|
144
|
+
|
|
145
|
+
return job
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Process batch job
|
|
150
|
+
*/
|
|
151
|
+
async processBatchJob(jobId: string): Promise<BatchJob> {
|
|
152
|
+
const job = this.jobs.get(jobId)
|
|
153
|
+
|
|
154
|
+
if (!job) {
|
|
155
|
+
throw new Error(`Batch job not found: ${jobId}`)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const config = this.configs.get(job.configId)
|
|
159
|
+
|
|
160
|
+
if (!config) {
|
|
161
|
+
throw new Error(`Batch config not found: ${job.configId}`)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
job.status = 'processing'
|
|
165
|
+
job.startedAt = new Date()
|
|
166
|
+
|
|
167
|
+
// Process in batches
|
|
168
|
+
const batches = this.chunkArray(job.messages, config.batchSize)
|
|
169
|
+
|
|
170
|
+
for (const batch of batches) {
|
|
171
|
+
await this.processBatch(batch, config)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Update job status
|
|
175
|
+
job.processedCount = job.messages.filter(m => m.status === 'success').length
|
|
176
|
+
job.failedCount = job.messages.filter(m => m.status === 'failed').length
|
|
177
|
+
job.status = job.failedCount === 0 ? 'completed' : 'failed'
|
|
178
|
+
job.completedAt = new Date()
|
|
179
|
+
|
|
180
|
+
// Collect metrics
|
|
181
|
+
this.collectProcessorMetrics(config.id, job)
|
|
182
|
+
|
|
183
|
+
return job
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Process single batch
|
|
188
|
+
*/
|
|
189
|
+
private async processBatch(messages: BatchMessage[], config: BatchConfig): Promise<void> {
|
|
190
|
+
const promises = messages.map(msg => this.processMessage(msg, config))
|
|
191
|
+
await Promise.all(promises)
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Process single message
|
|
196
|
+
*/
|
|
197
|
+
private async processMessage(message: BatchMessage, config: BatchConfig): Promise<void> {
|
|
198
|
+
message.status = 'processing'
|
|
199
|
+
|
|
200
|
+
const startTime = Date.now()
|
|
201
|
+
|
|
202
|
+
// Simulate processing with random delay
|
|
203
|
+
await new Promise(resolve => setTimeout(resolve, Math.random() * 100))
|
|
204
|
+
|
|
205
|
+
const processingTime = Date.now() - startTime
|
|
206
|
+
message.processingTime = processingTime
|
|
207
|
+
|
|
208
|
+
// Random success/failure
|
|
209
|
+
const success = Math.random() > 0.1
|
|
210
|
+
|
|
211
|
+
if (success) {
|
|
212
|
+
message.status = 'success'
|
|
213
|
+
} else {
|
|
214
|
+
message.status = 'failed'
|
|
215
|
+
message.error = 'Processing error'
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Chunk array into batches
|
|
221
|
+
*/
|
|
222
|
+
private chunkArray<T>(array: T[], chunkSize: number): T[][] {
|
|
223
|
+
const chunks: T[][] = []
|
|
224
|
+
for (let i = 0; i < array.length; i += chunkSize) {
|
|
225
|
+
chunks.push(array.slice(i, i + chunkSize))
|
|
226
|
+
}
|
|
227
|
+
return chunks
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Collect processor metrics
|
|
232
|
+
*/
|
|
233
|
+
private collectProcessorMetrics(configId: string, job: BatchJob): void {
|
|
234
|
+
const id = `metrics-${Date.now()}-${this.metricsCounter++}`
|
|
235
|
+
|
|
236
|
+
const successfulMessages = job.messages.filter(m => m.status === 'success')
|
|
237
|
+
const processingTimes = successfulMessages
|
|
238
|
+
.map(m => m.processingTime || 0)
|
|
239
|
+
.filter(t => t > 0)
|
|
240
|
+
|
|
241
|
+
const averageProcessingTime = processingTimes.length > 0
|
|
242
|
+
? processingTimes.reduce((sum, t) => sum + t, 0) / processingTimes.length
|
|
243
|
+
: 0
|
|
244
|
+
|
|
245
|
+
const duration = job.completedAt && job.startedAt
|
|
246
|
+
? (job.completedAt.getTime() - job.startedAt.getTime()) / 1000
|
|
247
|
+
: 1
|
|
248
|
+
|
|
249
|
+
const throughput = job.processedCount / duration
|
|
250
|
+
|
|
251
|
+
const errorRate = job.messages.length > 0
|
|
252
|
+
? (job.failedCount / job.messages.length) * 100
|
|
253
|
+
: 0
|
|
254
|
+
|
|
255
|
+
const metrics: ProcessorMetrics = {
|
|
256
|
+
id,
|
|
257
|
+
configId,
|
|
258
|
+
timestamp: new Date(),
|
|
259
|
+
messagesProcessed: job.processedCount,
|
|
260
|
+
averageProcessingTime,
|
|
261
|
+
throughput,
|
|
262
|
+
errorRate,
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const configMetrics = this.metrics.get(configId) || []
|
|
266
|
+
configMetrics.push(metrics)
|
|
267
|
+
this.metrics.set(configId, configMetrics)
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Get batch statistics
|
|
272
|
+
*/
|
|
273
|
+
getBatchStatistics(configId: string): {
|
|
274
|
+
totalJobsProcessed: number
|
|
275
|
+
totalMessagesProcessed: number
|
|
276
|
+
averageThroughput: number
|
|
277
|
+
averageErrorRate: number
|
|
278
|
+
averageProcessingTime: number
|
|
279
|
+
} {
|
|
280
|
+
const metricsHistory = this.metrics.get(configId) || []
|
|
281
|
+
|
|
282
|
+
if (metricsHistory.length === 0) {
|
|
283
|
+
return {
|
|
284
|
+
totalJobsProcessed: 0,
|
|
285
|
+
totalMessagesProcessed: 0,
|
|
286
|
+
averageThroughput: 0,
|
|
287
|
+
averageErrorRate: 0,
|
|
288
|
+
averageProcessingTime: 0,
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const totalMessagesProcessed = metricsHistory.reduce((sum, m) => sum + m.messagesProcessed, 0)
|
|
293
|
+
const averageThroughput = metricsHistory.reduce((sum, m) => sum + m.throughput, 0) / metricsHistory.length
|
|
294
|
+
const averageErrorRate = metricsHistory.reduce((sum, m) => sum + m.errorRate, 0) / metricsHistory.length
|
|
295
|
+
const averageProcessingTime = metricsHistory.reduce((sum, m) => sum + m.averageProcessingTime, 0) / metricsHistory.length
|
|
296
|
+
|
|
297
|
+
return {
|
|
298
|
+
totalJobsProcessed: metricsHistory.length,
|
|
299
|
+
totalMessagesProcessed,
|
|
300
|
+
averageThroughput,
|
|
301
|
+
averageErrorRate,
|
|
302
|
+
averageProcessingTime,
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/**
|
|
307
|
+
* Optimize batch config
|
|
308
|
+
*/
|
|
309
|
+
optimizeBatchConfig(configId: string): BatchConfig {
|
|
310
|
+
const config = this.configs.get(configId)
|
|
311
|
+
|
|
312
|
+
if (!config) {
|
|
313
|
+
throw new Error(`Batch config not found: ${configId}`)
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
const stats = this.getBatchStatistics(configId)
|
|
317
|
+
|
|
318
|
+
// Increase batch size if error rate is low
|
|
319
|
+
if (stats.averageErrorRate < 5 && config.batchSize < 10) {
|
|
320
|
+
config.batchSize = Math.min(10, config.batchSize + 1)
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Decrease batch size if error rate is high
|
|
324
|
+
if (stats.averageErrorRate > 20 && config.batchSize > 1) {
|
|
325
|
+
config.batchSize = Math.max(1, config.batchSize - 1)
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Adjust parallel processors based on throughput
|
|
329
|
+
if (stats.averageThroughput < 5 && config.parallelProcessors < 20) {
|
|
330
|
+
config.parallelProcessors++
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return config
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Get config
|
|
338
|
+
*/
|
|
339
|
+
getConfig(id: string): BatchConfig | undefined {
|
|
340
|
+
return this.configs.get(id)
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* List configs
|
|
345
|
+
*/
|
|
346
|
+
listConfigs(): BatchConfig[] {
|
|
347
|
+
return Array.from(this.configs.values())
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Get job
|
|
352
|
+
*/
|
|
353
|
+
getJob(id: string): BatchJob | undefined {
|
|
354
|
+
return this.jobs.get(id)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* List jobs
|
|
359
|
+
*/
|
|
360
|
+
listJobs(configId?: string): BatchJob[] {
|
|
361
|
+
let jobs = Array.from(this.jobs.values())
|
|
362
|
+
|
|
363
|
+
if (configId) {
|
|
364
|
+
jobs = jobs.filter(j => j.configId === configId)
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return jobs
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Generate CloudFormation for Lambda batch processor
|
|
372
|
+
*/
|
|
373
|
+
generateBatchProcessorCF(config: BatchConfig): any {
|
|
374
|
+
return {
|
|
375
|
+
Type: 'AWS::Lambda::EventSourceMapping',
|
|
376
|
+
Properties: {
|
|
377
|
+
EventSourceArn: `arn:aws:sqs:us-east-1:123456789012:${config.queueUrl.split('/').pop()}`,
|
|
378
|
+
FunctionName: 'batch-processor-function',
|
|
379
|
+
BatchSize: config.batchSize,
|
|
380
|
+
MaximumBatchingWindowInSeconds: config.maxWaitTime / 1000,
|
|
381
|
+
FunctionResponseTypes: ['ReportBatchItemFailures'],
|
|
382
|
+
},
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Clear all data
|
|
388
|
+
*/
|
|
389
|
+
clear(): void {
|
|
390
|
+
this.configs.clear()
|
|
391
|
+
this.jobs.clear()
|
|
392
|
+
this.metrics.clear()
|
|
393
|
+
this.configCounter = 0
|
|
394
|
+
this.jobCounter = 0
|
|
395
|
+
this.metricsCounter = 0
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Global batch processing manager instance
|
|
401
|
+
*/
|
|
402
|
+
export const batchProcessingManager: BatchProcessingManager = new BatchProcessingManager()
|