ๆๅฐไปฃๆถไบคๆๆตๅฏฆไฝ - ไฝฟ็จ Cloudflare WorkersใPostgreSQL ๅ AWS SQS ๅปบๆง็ไบไปถ้ฉ ๅๆฏไป็ณป็ตฑใ
ๆฌๅฐๆกๅฏฆไฝไธๅๆๅฐๅฏ้ไฝ็ไปฃๆถไบคๆๆต็จ๏ผๅ ๅซ๏ผ
- ๅๆถ้้ API ็ผ่ตทไปฃๆถไบคๆ่ซๆฑ
- ็ณป็ตฑๅฐไบคๆ่ฝ็ผ่ณไธๆธธ่็
- ๆฅๆถไธๆธธๅ่ชฟไธฆๆดๆฐ่จๅฎ็ๆ
- ้้ Webhook ้็ฅๅๆถไบคๆ็ตๆ
- ๅคฑๆ้็ฅ้ฒๅ ฅๆญปไฟกไฝๅไพไบบๅทฅ่็
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Payment Remaster โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
โ โ
โ โโโโโโโโโโโโ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ Merchant โโโโโถโ order-ingress โโโโโถโ PostgreSQL โ โ
โ โโโโโโโโโโโโ โโโโโโโโโฌโโโโโโโโ โโโโโโโโโโโโโโโโโโโ โ
โ โ โฒ โ
โ โผ โ โ
โ โโโโโโโโโโโโโโโโโ โ โ
โ โ AWS SQS โ โ โ
โ โ OrderCreated โ โ โ
โ โโโโโโโโโฌโโโโโโโโ โ โ
โ โ โ โ
โ โผ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Lambda Bridge โ โ
โ โ โโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ
โ โ โ gateway-router- โ โ webhook-notifier- โ โ โ
โ โ โ trigger โ โ trigger โ โ โ
โ โ โโโโโโโโโโโโฌโโโโโโโโโโโ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ โ
โ โผ โผ โ
โ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ โ
โ โgateway-router โ โmerchant-webhook- โ โ
โ โ Worker โ โnotifier Worker โโโโถ Merchant โ
โ โโโโโโโโโฌโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโ Webhook โ
โ โ โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
โ โmock-provider โโโโโถโupstream-callback โ โ
โ โ Worker โ โ Worker โ โ
โ โโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโ โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
| ๅฑค็ด | ๆ่ก |
|---|---|
| Runtime | Cloudflare Workers (Edge) |
| Language | TypeScript 5.x |
| HTTP Framework | Hono |
| Database | PostgreSQL (via Hyperdrive) |
| Message Queue | AWS SQS (Free Tier) |
| Lambda Bridge | AWS SAM / Lambda |
| Testing | Vitest |
| Package Manager | pnpm (Monorepo) |
payment-remaster/
โโโ workers/ # Cloudflare Workers
โ โโโ order-ingress/ # HTTP: ๆฅๆถๅๆถไธๅฎ
โ โโโ gateway-router/ # SQS Consumer: ๅผๅซไธๆธธ
โ โโโ upstream-callback/ # HTTP: ๆฅๆถไธๆธธๅ่ชฟ
โ โโโ merchant-webhook-notifier/ # SQS Consumer: ้็ฅๅๆถ
โ โโโ mock-provider/ # HTTP: ๆจกๆฌไธๆธธๆๅ
โโโ shared/ # ๅ
ฑ็จๆจก็ต
โ โโโ src/
โ โโโ db/ # ่ณๆๅบซ้ฃ็ท่ Repository
โ โโโ sqs/ # SQS ๅฎขๆถ็ซฏ่ๆถ่ฒป่
โ โโโ events/ # ไบไปถๅฎ็พฉ
โ โโโ domain/ # ้ ๅ้่ผฏ
โ โโโ http/ # HTTP ๅทฅๅ
ท
โ โโโ observability/ # ็ฃๆงๆๆจ
โโโ lambda-bridge/ # AWS Lambda ๆฉๆฅ
โ โโโ src/
โ โ โโโ gateway-router-trigger.ts
โ โ โโโ webhook-notifier-trigger.ts
โ โโโ template.yaml # SAM ๆจกๆฟ
โโโ tests/ # ๆธฌ่ฉฆ
โ โโโ unit/
โ โโโ integration/
โ โโโ contract/
โโโ specs/ # ่ฆๆ ผๆไปถ
โ โโโ 001-minimal-payment-flow/
โโโ scripts/ # ้จ็ฝฒ่
ณๆฌ
โ โโโ deploy-workers.sh
โ โโโ deploy-lambda.sh
โ โโโ e2e.sh
โโโ docker-compose.yml # ๆฌๆฉ้็ผ็ฐๅข
- Node.js 18+
- pnpm 8+
- Docker & Docker Compose
- AWS CLI (็จๆผ Lambda ้จ็ฝฒ)
- Wrangler CLI (็จๆผ Workers ้จ็ฝฒ)
# ๅๅ PostgreSQL ๅ LocalStack (SQS)
docker-compose up -d
# ็ขบ่ชๆๅ็ๆ
docker-compose pspnpm install# ้ฃ็ทๅฐ PostgreSQL ๅท่ก้ท็งป
docker exec -i payment-postgres psql -U postgres -d payment < shared/src/db/migrations/001_initial_schema.sql# ้ๅๅคๅ็ต็ซฏๆฉ๏ผๅๅฅๅๅๅ Worker
pnpm --filter order-ingress dev
pnpm --filter gateway-router dev
pnpm --filter upstream-callback dev
pnpm --filter merchant-webhook-notifier dev
pnpm --filter mock-provider dev# ๅท่กๆๆๆธฌ่ฉฆ
pnpm vitest run
# ๅท่ก็นๅฎๆธฌ่ฉฆ
pnpm vitest run tests/unit
pnpm vitest run tests/integration
pnpm vitest run tests/contract# ๅปบ็ซไธ็ญ่จๅฎ
curl -X POST http://localhost:8787/api/merchant/orders \
-H "Content-Type: application/json" \
-H "X-API-Key: TEST_MERCHANT_KEY" \
-d '{
"merchant_order_no": "MO-001",
"amount": 100.00,
"currency": "TWD",
"description": "Test order"
}'ๅปบ็ซไปฃๆถไบคๆ่จๅฎใ
Request Headers:
X-API-Key: ๅๆถ API ้้ฐ (ๅฟ ๅกซ)Content-Type: application/json
Request Body:
{
"merchant_order_no": "MO-001",
"amount": 100.00,
"currency": "TWD",
"description": "่จๅฎ่ชชๆ"
}Response (201 Created):
{
"order_id": "uuid-v4",
"status": "PENDING",
"created_at": "2025-12-05T10:00:00.000Z"
}ๅฅๅบทๆชขๆฅ็ซฏ้ปใ
Response (200 OK):
{
"status": "ok",
"service": "order-ingress",
"timestamp": "2025-12-05T10:00:00.000Z",
"checks": {
"worker": { "status": "ok" },
"database": { "status": "ok", "latency_ms": 5 },
"sqs": { "status": "ok" }
}
}# ่จญๅฎ Cloudflare ๆ่ญ
wrangler login
# ้จ็ฝฒๅฐ staging
./scripts/deploy-workers.sh staging
# ้จ็ฝฒๅฐ production
./scripts/deploy-workers.sh production# ่จญๅฎ็ฐๅข่ฎๆธ
export GATEWAY_ROUTER_URL="https://gateway-router.your-workers.dev"
export WEBHOOK_NOTIFIER_URL="https://webhook-notifier.your-workers.dev"
# ้จ็ฝฒๅฐ staging
./scripts/deploy-lambda.sh staging
# ้จ็ฝฒๅฐ production
./scripts/deploy-lambda.sh production| ๆๆจๅ็จฑ | ้กๅ | ่ชชๆ |
|---|---|---|
orders_created_total |
Counter | ๅปบ็ซ็่จๅฎ็ธฝๆธ |
orders_completed_total |
Counter | ๅฎๆ็่จๅฎ็ธฝๆธ |
webhook_attempts_total |
Counter | Webhook ้็ฅๅ่ฉฆๆฌกๆธ |
webhook_failures_total |
Counter | Webhook ้็ฅๅคฑๆๆฌกๆธ |
dead_letters_total |
Counter | ๆญปไฟก่จ้็ธฝๆธ |
ๆฏๅ่ซๆฑ้ฝๆ่จ้ไปฅไธๆฌไฝ๏ผ
trace_id: ่ฟฝ่นค IDorder_id: ่จๅฎ IDmerchant_id: ๅๆถ ID- Handler ๅ็จฑ
Q: ่จๅฎ็ๆ ไธ็ดๆฏ PENDING๏ผ A: ็ขบ่ช SQS ไฝๅๅ Lambda Bridge ๆญฃๅธธ้ไฝใๆชขๆฅ CloudWatch ๆฅ่ชใ
Q: Webhook ้็ฅๅคฑๆ๏ผ
A: ๆฅ็ dead_letter_records ่กจๆ ผ็ขบ่ชๅคฑๆๅๅ ใๆชขๆฅๅๆถ็ซฏ้ปๆฏๅฆๅฏ้ใ
Q: ๆฌๆฉ้็ผ Workers ็กๆณ้ฃ็ท่ณๆๅบซ๏ผ A: ็ขบ่ช Docker Compose ๆๅๆญฃๅธธ้ไฝ๏ผPostgreSQL ็ซฏๅฃ 5432 ๅฏ้ฃ็ทใ
SELECT * FROM dead_letter_records
WHERE order_id = 'your-order-id'
ORDER BY last_failed_at DESC;- ๅปบ็ซ
workers/your-worker/็ฎ้ - ่ค่ฃฝ็พๆ Worker ็
package.jsonๅwrangler.toml - ๅฏฆไฝ
src/index.ts - ๆดๆฐ
pnpm-workspace.yaml
# ๅฎๅ
ๆธฌ่ฉฆ
pnpm vitest run tests/unit
# ๆดๅๆธฌ่ฉฆ
pnpm vitest run tests/integration
# ๅฅ็ดๆธฌ่ฉฆ
pnpm vitest run tests/contract
# ็ฃ็ๆจกๅผ
pnpm vitestPrivate - All rights reserved.