[ SKILL_DOCUMENTATION ]
# 架构模式
## 组件资源
typescript
class WorkerApp extends pulumi.ComponentResource {
constructor(name: string, args: WorkerAppArgs, opts?) {
super("custom:cloudflare:WorkerApp", name, {}, opts);
const defaultOpts = {parent: this};
this.kv = new cloudflare.WorkersKvNamespace(`${name}-kv`, {accountId: args.accountId, title: `${name}-kv`}, defaultOpts);
this.worker = new cloudflare.WorkerScript(`${name}-worker`, {
accountId: args.accountId, name: `${name}-worker`, content: args.workerCode,
module: true, kvNamespaceBindings: [{name: "KV", namespaceId: this.kv.id}],
}, defaultOpts);
this.domain = new cloudflare.WorkersDomain(`${name}-domain`, {
accountId: args.accountId, hostname: args.domain, service: this.worker.name,
}, defaultOpts);
}
}
## 全栈 Worker 应用
typescript
const kv = new cloudflare.WorkersKvNamespace("cache", {accountId, title: "api-cache"});
const db = new cloudflare.D1Database("db", {accountId, name: "app-database"});
const bucket = new cloudflare.R2Bucket("assets", {accountId, name: "app-assets"});
const apiWorker = new cloudflare.WorkerScript("api", {
accountId, name: "api-worker", content: fs.readFileSync("./dist/api.js", "utf8"),
module: true, kvNamespaceBindings: [{name: "CACHE", namespaceId: kv.id}],
d1DatabaseBindings: [{name: "DB", databaseId: db.id}],
r2BucketBindings: [{name: "ASSETS", bucketName: bucket.name}],
});
## 多环境设置
typescript
const stack = pulumi.getStack();
const worker = new cloudflare.WorkerScript(`worker-${stack}`, {
accountId, name: `my-worker-${stack}`, content: code,
plainTextBindings: [{name: "ENVIRONMENT", text: stack}],
});
## 基于队列的处理
typescript
const queue = new cloudflare.Queue("processing-queue", {accountId, name: "image-processing"});
// 生产者:API 接收请求
const apiWorker = new cloudflare.WorkerScript("api", {
accountId, name: "api-worker", content: apiCode,
queueBindings: [{name: "PROCESSING_QUEUE", queue: queue.id}],
});
// 消费者:异步处理
const processorWorker = new cloudflare.WorkerScript("processor", {
accountId, name: "processor-worker", content: processorCode,
queueConsumers: [{queue: queue.name, maxBatchSize: 10, maxRetries: 3, maxWaitTimeMs: 5000}],
r2BucketBindings: [{name: "OUTPUT_BUCKET", bucketName: outputBucket.name}],
});
## 微服务