界面已本地化;技能介绍与说明文档按所选语言由 AI 自动翻译,代码、命令、路径和专业术语保留原文,以原作者文档为准。
探索技能
设计与创意 · SKILL.md

system-design-communication

system-design-communication

【设计与创意】Select how services talk: REST, gRPC, GraphQL, WebSocket, SSE, or webhook per hop, sync versus async per flow, service discovery mode, and DNS/edge routing. Use when choosing a protocol or API paradigm; defer REST contract detail (status codes, pagination, OpenAPI) to common-api-design.

独立 GitHub 快照 · 自动分类 · 以原作者文档为准

技能说明

GitHub

name: system-design-communication description: "Select how services talk: REST, gRPC, GraphQL, WebSocket, SSE, or webhook per hop, sync versus async per flow, service discovery mode, and DNS/edge routing. Use when choosing a protocol or API paradigm; defer REST contract detail (status codes, pagination, OpenAPI) to common-api-design." metadata: triggers: keywords: - grpc - graphql vs rest - websocket - server-sent events - webhook - service discovery - protocol choice - api paradigm - dns routing

Communication Selection

Priority: P1 (HIGH)

Choose the paradigm per hop from the constraint, not from familiarity. One flow may legitimately use three.

Paradigm Table

Constraint observedParadigmCost accepted
Resource CRUD for broad, unknown clients; HTTP caching wantedRESTOver/under-fetching; N round trips for aggregates
Internal service-to-service, low latency, streaming, schema-firstgRPCBrowser needs a proxy; L7 balancers need HTTP/2 awareness
One client aggregates many sources with client-shaped responsesGraphQLQuery-cost limits and N+1 resolvers become your problem
Bidirectional real-time (chat, collaboration, gaming)WebSocketStateful connections; LB affinity; reconnect protocol
Server push only (feeds, progress, notifications)SSEOne direction; plain HTTP, auto-reconnect built in
Cross-organization async callbackWebhookReceiver retries, signature verification, idempotency required

Sync vs Async per Flow

  • The caller needs the answer to proceed -> synchronous call with a timeout and a fallback.
  • The caller needs completion, not the answer now -> queue or event; return an id to poll or push the result.
  • Never chain more than 2 synchronous internal hops on a user-facing path; each hop multiplies latency and failure.

Service Discovery

  • Start with DNS-based discovery of a load balancer; it is discovery enough for most systems.
  • Move to a health-checked registry (server-side discovery) when instances churn faster than DNS TTLs propagate.
  • Client-side discovery only when the client must pick the instance (cache affinity, zone-local routing); it couples every client to the registry.

DNS and Edge Routing

  • DNS TTL is a failover lever: low TTL enables fast region switch, at the cost of resolver load.
  • Geo-DNS routes users to the nearest region; it is routing, not failover - pair it with health checks.
  • Do not use DNS for instance-level balancing; resolvers cache and ignore your weights.

Versioning

  • Additive changes only on live contracts: new fields optional, old fields never repurposed.
  • Breaking change = new version side by side, a deprecation window with usage telemetry, then removal.
  • Internal gRPC/proto: reserve removed field numbers; never reuse them.

Anti-Patterns

  • No one-paradigm-everywhere: edge REST plus internal gRPC plus async events is normal, not inconsistency.
  • No WebSocket for server-push-only: SSE is cheaper and survives proxies better.
  • No webhook without signature, retry policy, and idempotency key: all three, or it is not production.
  • No GraphQL as a proxy for missing API design: schema sprawl without owners is the same mess with resolvers.
  • No sync call to a service that only needs to know: notifications are events.

References

我的收藏