Loading skill
Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Microservices design patterns including service mesh, event-driven architecture, saga pattern, and API gateway
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 7% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 39% | 0% |
| case-03 | ✓→✓ | = Same ✓ | 25% | 0% |
| case-05 | ✓→✓ | = Same ✓ | 39% | 0% |
Define services around business capabilities, not technical layers. Each service owns its data store and exposes a clear API contract.
order-service/ -> owns orders table, publishes OrderCreated events
inventory-service/ -> owns inventory table, subscribes to OrderCreated
payment-service/ -> owns payments table, handles payment processing
notification-service -> stateless, subscribes to events, sends emails/SMStypescriptinterface DomainEvent { eventId: string; eventType: string; aggregateId: string; timestamp: string; version: number; payload: Record<string, unknown>; } const orderCreatedEvent: DomainEvent = { eventId: crypto.randomUUID(), eventType: "order.created", aggregateId: orderId, timestamp: new Date().toISOString(), version: 1, payload: { customerId, items, totalAmount }, }; await broker.publish("orders", orderCreatedEvent);
typescriptasync function handleOrderCreated(event: DomainEvent) { const { items } = event.payload as OrderPayload; for (const item of items) { await db.inventory.update({ where: { productId: item.productId }, data: { quantity: { decrement: item.quantity } }, }); } await markEventProcessed(event.eventId); }
Use idempotency keys (eventId) to handle duplicate deliveries safely.
typescriptclass OrderSaga { private steps: SagaStep[] = [ { name: "reserveInventory", execute: (ctx) => inventoryService.reserve(ctx.items), compensate: (ctx) => inventoryService.release(ctx.items), }, { name: "processPayment", execute: (ctx) => paymentService.charge(ctx.customerId, ctx.amount), compensate: (ctx) => paymentService.refund(ctx.paymentId), }, { name: "confirmOrder", execute: (ctx) => orderService.confirm(ctx.orderId), compensate: (ctx) => orderService.cancel(ctx.orderId), }, ]; async run(context: SagaContext): Promise<void> { const completed: SagaStep[] = []; for (const step of this.steps) { try { const result = await step.execute(context); Object.assign(context, result); completed.push(step); } catch (error) { for (const s of completed.reverse()) { await s.compensate(context); } throw new SagaFailedError(step.name, error); } } } }
yaml# Kong or similar gateway config services: - name: orders url: http://order-service:3000 routes: - paths: ["/api/v1/orders"] methods: [GET, POST] plugins: - name: rate-limiting config: minute: 100 - name: jwt - name: correlation-id - name: users url: http://user-service:3000 routes: - paths: ["/api/v1/users"] plugins: - name: rate-limiting config: minute: 200
typescriptapp.get("/health", async (req, res) => { const checks = { database: await checkDatabase(), cache: await checkRedis(), broker: await checkMessageBroker(), }; const healthy = Object.values(checks).every(c => c.status === "up"); res.status(healthy ? 200 : 503).json({ status: healthy ? "healthy" : "degraded", checks, version: process.env.APP_VERSION, uptime: process.uptime(), }); });
Other measured skills in the registry, with their headline benchmark lift.