LinkedIn — Detailed#
flowchart TB
subgraph Clients
Web
Mobile
end
subgraph Edge
CDN
LB
GW[REST + GraphQL]
end
subgraph Profile
PSVC[Profile Service]
PDB[(Profiles - Espresso<br/>document store)]
SKILL[Skills / Endorsements]
end
subgraph Graph[Economic Graph]
CONN[Connection Service]
GDB[(Distributed Graph<br/>LiquidGraph)]
DEG[Degree / shortest path]
end
subgraph Search
PEO[People Search]
JOB[Jobs Search]
GAL[Galene / Lucene search]
QU[Query understanding]
end
subgraph Feed
HOMEFEED[Home Feed]
AGG([Aggregator])
RANK([ML Ranker])
CANDS([Candidate Gen<br/>followed + suggested])
end
subgraph Jobs
JOBS[Jobs Service]
JDB[(Jobs DB)]
REC([Job Recommendations])
ALERT[Job Alerts]
APPLY[Easy Apply / ATS]
end
subgraph Msg
INMAIL[InMail]
DM[Messaging Service]
WS[WebSocket gateway]
end
subgraph Async
KAFKA[[Kafka pipelines]]
SAMZA([Samza / Flink])
EMB([Embeddings - Pinot])
LAKE[(Data lake)]
end
subgraph ML
PYM[People You May Know - PYMK]
PYMW[People You May Work With]
NOTIF([Notifications Ranker])
ADS[Ads / Sponsored]
end
Clients --> CDN --> LB --> GW
GW --> Profile --> PDB
GW --> Graph --> GDB
GW --> Search --> GAL
GW --> Feed --> AGG --> CANDS
CANDS --> Graph
Feed --> RANK
GW --> Jobs --> JDB
GW --> Msg --> WS
Profile --> KAFKA
Graph --> KAFKA
Jobs --> KAFKA
KAFKA --> SAMZA --> EMB
EMB --> PYM
EMB --> JOBS
PYM --> CANDS
ADS --> RANK
classDef client fill:#dbeafe,stroke:#1e40af,stroke-width:1px,color:#0f172a;
classDef edge fill:#cffafe,stroke:#0e7490,stroke-width:1px,color:#0f172a;
classDef service fill:#fef3c7,stroke:#92400e,stroke-width:1px,color:#0f172a;
classDef datastore fill:#fee2e2,stroke:#991b1b,stroke-width:1px,color:#0f172a;
classDef cache fill:#fed7aa,stroke:#9a3412,stroke-width:1px,color:#0f172a;
classDef queue fill:#ede9fe,stroke:#5b21b6,stroke-width:1px,color:#0f172a;
classDef compute fill:#d1fae5,stroke:#065f46,stroke-width:1px,color:#0f172a;
classDef storage fill:#e5e7eb,stroke:#374151,stroke-width:1px,color:#0f172a;
classDef external fill:#fce7f3,stroke:#9d174d,stroke-width:1px,color:#0f172a;
classDef obs fill:#f3e8ff,stroke:#6b21a8,stroke-width:1px,color:#0f172a;
class WS edge;
class GW,PSVC,SKILL,CONN,DEG,PEO,JOB,GAL,QU,HOMEFEED,JOBS,APPLY,INMAIL,DM,PYM,PYMW,ADS service;
class PDB,GDB,JDB,LAKE datastore;
class KAFKA queue;
class AGG,RANK,CANDS,REC,SAMZA,EMB,NOTIF compute;
class ALERT obs;
Distinctive parts#
- Economic Graph: members, companies, skills, jobs as nodes. Used for PYMK, job match, talent insights.
- People You May Know (PYMK): ML-driven candidate gen using 2nd/3rd-degree contacts, school/company overlap, embeddings.
- Galene = LinkedIn's Lucene-based search platform (now superseded internally) with custom relevance for "name + headline + company" queries.
- Espresso = LinkedIn's distributed document store (Helix-managed, Avro schemas).
- Voldemort historically for KV; replaced by Espresso + Venice.
Messaging#
- InMail (one-off to non-connections, paid) vs Direct Messaging (connections).
- Same kind of WS + inbox queue as WhatsApp but simpler (no E2E).
Jobs#
- Index = job postings + filters (location, exp, remote).
- Recommendations combine collaborative + content (skills, profile embedding).
Trade-offs#
- Strongly typed graph unlocks rich features but ops complexity.
- Multi-DC writes for profile but mostly single-region for graph hot path.
- Privacy & compliance (GDPR, recruiter visibility) drive complex ACL.
Glossary & fundamentals#
Concepts referenced in this design. Each row links to its canonical page; the tag column shows whether it is a high-level (HLD) or low-level (LLD) concept.
| Tag | Concept | What it is | Page |
|---|---|---|---|
HLD |
CDN | edge caching for static assets | cdn |
HLD |
Pub/Sub & message brokers | topics, consumer groups, delivery semantics | pub-sub-pattern |
HLD |
Realtime protocols | WS / SSE / polling / gRPC streaming | realtime-protocols |
HLD |
Batch & stream processing | Lambda vs Kappa, watermarks, windows | batch-stream-processing |
LLD |
REST API design | verbs, statuses, pagination, errors | rest-api-design |