用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/miles990/claude-software-skills --skill system-design命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
Enterprise-grade repository analysis with arc42/C4 architecture documentation, technical debt quantification, security assessment, and multi-stakeholder reporting
Claude Code Plugin 開發、發布、安裝、更新與 Marketplace 管理完整指南
Flame Engine core fundamentals - components, input, collision, camera, animation, scenes
基于 SOC 职业分类
正在显示 SKILL.md
| name | system-design |
| description | Scalability, availability, and distributed systems design |
| domain | software-design |
| version | 1.0.0 |
| tags | ["scalability","availability","distributed","caching","load-balancing","database"] |
| triggers | {"keywords":{"primary":["system design","scalability","distributed","architecture","high availability"],"secondary":["load balancer","caching","sharding","replication","cap theorem","microservices"]},"context_boost":["interview","scale","performance","infrastructure"],"context_penalty":["frontend","ui","mobile"],"priority":"high"} |
Principles for designing systems that handle scale, remain available, and perform well under load.
Vertical Scaling (Scale Up):
┌─────────────────────┐
│ Bigger Server │
│ - More CPU │
│ - More RAM │
│ - Faster disk │
└─────────────────────┘
Limit: Hardware ceiling
Horizontal Scaling (Scale Out):
┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐
│Server│ │Server│ │Server│ │Server│
└──────┘ └──────┘ └──────┘ └──────┘
↑
Load Balancer
Limit: Coordination complexity
// ❌ Stateful - stores session in memory
class BadService {
private sessions = new Map();
login(userId: string) {
this.sessions.set(userId, { loggedIn: true });
}
}
// ✅ Stateless - external session store
class GoodService {
constructor(private sessionStore: Redis) {}
async login(userId: string) {
await this.sessionStore.set(`session:${userId}`, { loggedIn: true });
}
}
| Strategy | Description | Use Case |
|---|---|---|
| Round Robin | Cycle through servers | Equal capacity servers |
| Weighted RR | Based on server capacity | Mixed capacity |
| Least Connections | Route to least busy | Long-lived connections |
| IP Hash | Same IP → same server | Session stickiness |
| URL Hash | Same URL → same server | Cache optimization |
# Kubernetes-style health checks
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 3
periodSeconds: 10
readinessProbe:
httpGet:
path: /health/ready
port: 8080
initialDelaySeconds: 5
periodSeconds: 5
// Health check endpoints
app.get('/health/live', (req, res) => {
// Am I running?
res.status(200).json({ status: 'alive' });
});
app.get('/health/ready', async (req, res) => {
// Can I serve traffic?
const dbOk = await checkDatabase();
const cacheOk = await checkCache();
if (dbOk && cacheOk) {
res.status(200).json({ status: 'ready' });
} else {
res.status(503).json({ status: 'not ready', db: dbOk, cache: cacheOk });
}
});
Cache-Aside (Lazy Loading):
┌────────┐ miss ┌────────┐
│ App │ ──────────→ │ Cache │
│ │ ←────────── │ │
└────────┘ null └────────┘
│
│ read
↓
┌────────┐
│ DB │ ──── write ──→ Cache
└────────┘
Write-Through:
App → Cache → DB (synchronous)
Write-Behind (Write-Back):
App → Cache → (async) → DB
// Cache-aside implementation
class CachedUserService {
constructor(
private cache: Redis,
private db: Database
) {}
async getUser(id: string): Promise<User> {
// Try cache first
const cached = await this.cache.get(`user:${id}`);
if (cached) return JSON.parse(cached);
// Cache miss - read from DB
const user = await this.db.users.findById(id);
if (user) {
// Store in cache with TTL
await this.cache.set(`user:${id}`, JSON.stringify(user), 'EX', 3600);
}
return user;
}
async updateUser(id: , : <>): <> {
user = ...(id, data);
..();
user;
}
}
| Strategy | Description | Complexity |
|---|---|---|
| TTL | Expire after time | Simple |
| Event-based | Invalidate on write | Medium |
| Version-based | Key includes version | Medium |
| Tag-based | Group related keys | Complex |
┌─────────────────┐
Writes ──────→ │ Primary DB │
└────────┬────────┘
│ replication
┌─────────────────┼─────────────────┐
↓ ↓ ↓
┌──────────┐ ┌──────────┐ ┌──────────┐
│ Replica 1│ │ Replica 2│ │ Replica 3│
└──────────┘ └──────────┘ └──────────┘
↑ ↑ ↑
└─────── Reads ───┴────────────────┘
// Hash-based sharding
function getShard(userId: string, numShards: number): number {
const hash = crypto.createHash('md5').update(userId).digest('hex');
return parseInt(hash.slice(0, 8), 16) % numShards;
}
// Range-based sharding
function getShardByDate(date: Date): string {
const year = date.getFullYear();
const month = date.getMonth() + 1;
return `orders_${year}_${month.toString().padStart(2, '0')}`;
}
// Consistent hashing for dynamic shards
class ConsistentHash {
private ring: Map<number, string> = new Map();
addNode(node: string) {
for ( i = ; i < ; i++) {
hash = .();
..(hash, node);
}
}
(: ): {
hash = .(key);
( [nodeHash, node] [.....()].()) {
(nodeHash >= hash) node;
}
..().().;
}
}
Point-to-Point:
Producer → Queue → Consumer
Pub/Sub:
┌─→ Subscriber 1
Publisher → Topic ─→ Subscriber 2
└─→ Subscriber 3
Work Queue:
┌─→ Worker 1
Producer → Queue ─→ Worker 2 (competing consumers)
└─→ Worker 3
| Guarantee | Description | Implementation |
|---|---|---|
| At-most-once | May lose messages | Fire and forget |
| At-least-once | May duplicate | Ack after process |
| Exactly-once | No loss, no dupe | Idempotency + dedup |
// Idempotent processing
async function processOrder(event: OrderEvent) {
// Check if already processed
const processed = await redis.get(`processed:${event.id}`);
if (processed) {
console.log(`Already processed ${event.id}`);
return;
}
// Process the order
await db.orders.create(event.order);
// Mark as processed (with TTL for cleanup)
await redis.set(`processed:${event.id}`, '1', 'EX', 86400 * 7);
}
Active-Active:
┌────────┐ ┌────────┐
│Server A│ ←─→ │Server B│ Both handle traffic
└────────┘ └────────┘
Active-Passive:
┌────────┐ ┌────────┐
│ Active │ ──→ │Standby │ Failover on failure
└────────┘ └────────┘
class CircuitBreaker {
private failures = 0;
private lastFailure: Date | null = null;
private state: 'closed' | 'open' | 'half-open' = 'closed';
constructor(
private threshold: number = 5,
private timeout: number = 30000
) {}
async execute<T>(fn: () => Promise<T>): Promise<T> {
if (this.state === 'open') {
if (Date.now() - this.lastFailure!.getTime() > this.timeout) {
this.state = 'half-open';
} else {
throw new Error('Circuit is open');
}
}
try {
const result = await ();
.();
result;
} (error) {
.();
error;
}
}
() {
. = ;
. = ;
}
() {
.++;
. = ();
(. >= .) {
. = ;
}
}
}
Consistency
/\
/ \
/ \
/ \
/ CA \
/──────────\
/ \
/ CP AP \
/________________\
Partition Availability
Tolerance
CA: Single node (RDBMS)
CP: MongoDB, HBase (may reject writes during partition)
AP: Cassandra, DynamoDB (eventual consistency)
| Model | Description | Example |
|---|---|---|
| Strong | Read sees latest write | RDBMS |
| Eventual | Eventually consistent | DNS, Cassandra |
| Causal | Respects causality | Chat apps |
| Read-your-writes | See your own writes | Social feeds |
// Token Bucket
class TokenBucket {
private tokens: number;
private lastRefill: number;
constructor(
private capacity: number,
private refillRate: number // tokens per second
) {
this.tokens = capacity;
this.lastRefill = Date.now();
}
consume(tokens: number = 1): boolean {
this.refill();
if (this.tokens >= tokens) {
this.tokens -= tokens;
return true;
}
return false;
}
private refill() {
const now = Date.now();
const elapsed = (now - this.lastRefill) / 1000;
this.tokens = .(
.,
. + elapsed * .
);
. = now;
}
}
{
() {}
(: ): <> {
now = .();
windowStart = now - . * ;
pipe = ..();
pipe.(key, , windowStart);
pipe.(key, now, );
pipe.(key);
pipe.(key, .);
results = pipe.();
count = results[][] ;
count <= .;
}
}
| System | Key Components |
|---|---|
| URL Shortener | Hash function, Redis cache, DB |
| Twitter Feed | Fan-out, Redis timeline, Kafka |
| Chat App | WebSocket, Presence, Message queue |
| E-commerce | Cart service, Inventory, Payment |
| Video Streaming | CDN, Chunking, Adaptive bitrate |