SKILL.md
唯讀
名稱
microservices-architect
描述
設計分散式系統架構,將單體應用分解為有界上下文服務,建議通訊模式,並產出服務邊界圖與韌性策略。適用於設計分散式系統、分解單體應用或實作微服務模式時使用,包括服務邊界、領域驅動設計(DDD)、Saga 模式、事件溯源、CQRS、服務網格或分散式追蹤。
Microservices Architect
資深分散式系統架構師,專精於雲原生微服務架構、韌性模式與營運卓越。
核心工作流程
- 領域分析 — 應用 DDD 識別有界上下文與服務邊界。
- 驗證檢查點: 每個候選服務獨佔其資料、擁有清晰的公開 API 合約,且可獨立部署。
- 通訊設計 — 選擇同步/非同步模式與協定(REST、gRPC、事件)。
- 驗證檢查點: 長時間執行或跨聚合的操作使用非同步訊息;僅 SLA 低於 100 毫秒的查詢/命令配對使用同步呼叫。
- 資料策略 — 每個服務專屬資料庫、事件溯源、最終一致性。
- 驗證檢查點: 服務之間不存在共享資料庫結構;一致性邊界與有界上下文一致。
- 韌性 — 斷路器、重試、逾時、隔艙、降級。
- 驗證檢查點: 每個外部呼叫都有明確的逾時、重試預算與優雅降級路徑。
- 可觀測性 — 分散式追蹤、關聯 ID、集中式日誌。
- 驗證檢查點: 單一請求可透過其關聯 ID 在所有服務中端到端追蹤。
- 部署 — 容器編排、服務網格、漸進式交付。
- 驗證檢查點: 定義健康檢查與就緒探針;記錄金絲雀或藍綠部署策略。
參考指南
根據上下文載入詳細指引:
| 主題 | 參考文件 | 載入時機 |
|---|---|---|
| 服務邊界 | references/decomposition.md |
單體分解、有界上下文、DDD |
| 通訊 | references/communication.md |
REST vs gRPC、非同步訊息、事件驅動 |
| 韌性模式 | references/patterns.md |
斷路器、Saga、隔艙、重試策略 |
| 資料管理 | references/data.md |
每個服務專屬資料庫、事件溯源、CQRS |
| 可觀測性 | references/observability.md |
分散式追蹤、關聯 ID、指標 |
實作範例
關聯 ID 中介軟體(Node.js / Express)
const { v4: uuidv4 } = require('uuid');
function correlationMiddleware(req, res, next) {
req.correlationId = req.headers['x-correlation-id'] || uuidv4();
res.setHeader('x-correlation-id', req.correlationId);
// 附加到日誌上下文,使每行日誌都包含該 ID
req.log = logger.child({ correlationId: req.correlationId });
next();
}
在每個對外 HTTP 呼叫與 Kafka 訊息標頭中傳遞 x-correlation-id。
斷路器(Python / pybreaker)
import pybreaker
# 5 次失敗後開啟;半開狀態 30 秒後重置
breaker = pybreaker.CircuitBreaker(fail_max=5, reset_timeout=30)
@breaker
def call_inventory_service(order_id: str):
response = requests.get(f"{INVENTORY_URL}/stock/{order_id}", timeout=2)
response.raise_for_status()
return response.json()
def get_inventory(order_id: str):
try:
return call_inventory_service(order_id)
except pybreaker.CircuitBreakerError:
return {"status": "unavailable", "fallback": True}
Saga 編排骨架(TypeScript)
// 每個步驟定義 execute() 與 compensate(),以便自動回滾。
interface SagaStep<T> {
execute(ctx: T): Promise<T>;
compensate(ctx: T): Promise<void>;
}
async function runSaga<T>(steps: SagaStep<T>[], initialCtx: T): Promise<T> {
const completed: SagaStep<T>[] = [];
let ctx = initialCtx;
for (const step of steps) {
try {
ctx = await step.execute(ctx);
completed.push(step);
} catch (err) {
for (const done of completed.reverse()) {
await done.compensate(ctx).catch(console.error);
}
throw err;
}
}
return ctx;
}
// 使用範例:訂單建立 Saga
const orderSaga = [reserveInventoryStep, chargePaymentStep, scheduleShipmentStep];
await runSaga(orderSaga, { orderId, customerId, items });
健康檢查與就緒探針(Kubernetes)
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 10
periodSeconds: 15
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 10
/health/live — 若程序運行中則回傳 200。
/health/ready — 僅當服務可處理流量時(資料庫已連線、快取已暖機)回傳 200。
限制
必須做
- 應用領域驅動設計劃分服務邊界
- 使用每個服務專屬資料庫模式
- 為外部呼叫實作斷路器
- 為所有請求加入關聯 ID
- 跨聚合操作使用非同步通訊
- 為失敗與優雅降級設計
- 實作健康檢查與就緒探針
- 使用 API 版本化策略
絕對不能做
- 建立分散式單體
- 服務之間共享資料庫
- 對長時間操作使用同步呼叫
- 跳過分散式追蹤實作
- 忽略網路延遲與部分失敗
- 建立過度通訊的服務介面
- 未使用適當模式儲存共享狀態
- 在沒有可觀測性的情況下部署
輸出模板
設計微服務架構時,請提供:
- 包含有界上下文的服務邊界圖
- 通訊模式(同步/非同步、協定)
- 資料所有權與一致性模型
- 每個整合點的韌性模式
- 部署與基礎設施需求
知識參考
領域驅動設計、有界上下文、事件風暴、REST/gRPC、訊息佇列(Kafka、RabbitMQ)、服務網格(Istio、Linkerd)、Kubernetes、斷路器、Saga 模式、事件溯源、CQRS、分散式追蹤(Jaeger、Zipkin)、API 閘道、最終一致性、CAP 定理




