ЁЯУЛ рдзрдбрд╛ 01 тАФ рдЧрд░рдЬрд╛ рдЖрдгрд┐ рдорд░реНрдпрд╛рджрд╛: рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛рдврдгреНрдпрд╛рдЖрдзреА рд╡рд┐рдЪрд╛рд░рддреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 01 ┬╖ рдкреБрдвреЗ: lesson-02-capacity
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рд╣рд╛ рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕ рдЬреНрдпрд╛ рдПрдХрд╛ рд╕рд╡рдпреАрд╡рд░ рдЙрднрд╛ рдЖрд╣реЗ рддреА: рдПрдХрд╣реА box рдХрд╛рдврдгреНрдпрд╛рдЖрдзреА, system рдиреЗ рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ, рдХрд┐рддреА рдЪрд╛рдВрдЧрд▓реЗ, рдЖрдгрд┐ рдХреЛрдгрддреНрдпрд╛ рдорд░реНрдпрд╛рджреЗрдд тАФ рд╣реЗ рд▓рд┐рд╣реВрди рдареЗрд╡рд╛. рдХрд╛рдо рдПрдХрд╛ рдУрд│реАрдЪреЗ рдЖрд╣реЗ тАФ "5 million рдкрд╛рд▓рдХрд╛рдВрд╕рд╛рдареА рд╕реВрдЪрдирд╛ рдлрд▓рдХ app рдмрдирд╡рд╛" тАФ рдЖрдгрд┐ рдпрд╛ рдзрдбреНрдпрд╛рдд рддреЗ рдЪрд╛рд░ рднрд╛рдЧрд╛рдВрдЪрд╛ рдПрдХ рдХрд╛рдЧрдж рдмрдирддреЗ: functional рдЧрд░рдЬрд╛, рдЖрдХрдбреНрдпрд╛рдВрд╕рд╣ non-functional рдЧрд░рдЬрд╛, рдорд░реНрдпрд╛рджрд╛ (constraints) рдЖрдгрд┐ рдХрдХреНрд╖реЗрдмрд╛рд╣реЗрд░ (out of scope), рд╕реЛрдмрдд рдХрд╛рдо рджреЗрдгрд╛рд▒реНрдпрд╛ рд╡реНрдпрдХреНрддреАрд▓рд╛ рд╡рд┐рдЪрд╛рд░рд╛рдпрдЪреЗ рдкреНрд░рд╢реНрди. рд╕рдВрдкреВрд░реНрдг рдХреЛрд░реНрд╕рднрд░ рддреБрдореНрд╣реА рд╡рд╛рдкрд░рд╛рд▓ рдЕрд╢рд╛ рдЦрд▒реНрдпрд╛ files:
- design/blocks.py тАФ рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреА рд╣рддреНрдпрд╛рд░рдкреЗрдЯреА: рдЕрдВрджрд╛рдЬ, hash ring, LRU cache, рджреЛрди rate limiters, quorums, 2PC рдЖрдгрд┐ sagas, outbox, fan-out (144 рдУрд│реА, рд╢реВрдиреНрдп dependencies)
- design/designs.py тАФ рдХрд╛рд░реНрдпрдкрддреНрд░рдХреЗ: pagination рдЪрд╛ рдЦрд░реНрдЪ, store рдЪреА рдирд┐рд╡рдб, call chains, STRIDE, error budgets, рдкрд╣рд┐рд▓реЗ рдмрд┐рд▓, ADRs рдЖрдгрд┐ рд╕рд╣рд╛ рд╕реЛрдбрд╡рд▓реЗрд▓реНрдпрд╛ рд░рдЪрдирд╛ (107 рдУрд│реА)
- design/demo.py тАФ рдкреНрд░рддреНрдпреЗрдХ рдзрдбрд╛ рдПрдХ рдЫреЛрдЯрд╛ program рдореНрд╣рдгреВрди (
python3 design/demo.py <section>; sections:requirements capacity api data cache balance queues events services consistency transactions ratelimit resilience security observability cost designs1 designs2) - design/test_design.py тАФ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдЪреНрдпрд╛ рдирд┐рдпрдорд╛рдВрд╡рд░рдЪреНрдпрд╛ 18 рддрдкрд╛рд╕рдгреНрдпрд╛
- demo-output.txt тАФ рдирд┐рд░реЛрдЧреА run рдХрд╛рдп рдЫрд╛рдкрддреЛ
ЁЯОТ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЖрдзреА: рддреБрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд Python 3 рд▓рд╛рдЧреЗрд▓, рдмрд╛рдХреА рдХрд╛рд╣реА рдирд╛рд╣реА тАФ cloud account рдирд╛рд╣реА,
pip installрдирд╛рд╣реА. рдпрд╛ files рдордзреНрдпреЗ рдЧреЛрд▓ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ рдЖрдХрдбреНрдпрд╛рдВрд╕рд╣ рд╢рд┐рдХрд╡рдгреНрдпрд╛рд╕рд╛рдареАрдЪреЗ models рдЖрд╣реЗрдд (рдкреНрд░рддреНрдпреЗрдХ server рд▓рд╛ рд╕реЗрдХрдВрджрд╛рд▓рд╛ 500 requests, рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдиреЗрд▓рд╛ 2 KB, 3├Ч рдЪрд╛ peak). рдЕрдВрдХрд╛рдВрдкреЗрдХреНрд╖рд╛ рдкрджреНрдзрдд рдЬрд╛рд╕реНрдд рдорд╣рддреНрддреНрд╡рд╛рдЪреА рдЖрд╣реЗ. on a real account рдЕрд╢реА рдЦреВрдг рдЕрд╕рд▓реЗрд▓реНрдпрд╛ commands рдирд╛ AWS CLI (рдХрд┐рдВрд╡рд╛ Terraform,psql, тАж) рдЖрдгрд┐ credentials рд▓рд╛рдЧрддрд╛рдд, рдЖрдгрд┐ рддреНрдпрд╛рдВрдЪрд╛ рдЦрд░реНрдЪ рдпреЗрдК рд╢рдХрддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрд▓рд╛ рдирд╡реА рдЗрдорд╛рд░рдд рд╣рд╡реА рдЖрд╣реЗ. рдореБрдЦреНрдпрд╛рдзреНрдпрд╛рдкрд┐рдХрд╛ рдХрддрд░рд┐рдирд╛ рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдд рдпреЗрддреЗ рдЖрдгрд┐ рдореНрд╣рдгрддреЗ: "рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдирд╡рд╛ рд╣реЙрд▓ рд╣рд╡рд╛ рдЖрд╣реЗ."
рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рджреАрдкрд┐рдХрд╛ рдЪрд╛рд▓рд╡рддреЗ. рддреА рдкреЗрдиреНрд╕рд┐рд▓ рдЙрдЪрд▓реВрди рд▓рдЧреЗрдЪ рдЪрд┐рддреНрд░ рдХрд╛рдврд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдд рдирд╛рд╣реА. рддреА рдПрдХ рдлреЙрд░реНрдо ЁЯУЛ рдЙрдЪрд▓рддреЗ рдЖрдгрд┐ рд╡рд┐рдЪрд╛рд░рддреЗ:
- рд╣реЙрд▓рдордзреНрдпреЗ рдХрд╛рдп рд╣реЛрдгрд╛рд░? рдкрд░рд┐рдкрд╛рда? рдкрд░реАрдХреНрд╖рд╛? рдЦреЗрд│? (рдХрд╛рдп рдХрд░рд╛рдпрдЪреЗ)
- рдХрд┐рддреА рдореБрд▓реЗ, рдЖрдгрд┐ рддреА рдХрд┐рддреА рдкрдЯрдХрди рдЖрдд рдпрд╛рдпрд▓рд╛ рд╣рд╡реАрдд? 5 рдорд┐рдирд┐рдЯрд╛рдВрдд 600 рдореБрд▓реЗ? (рдХрд┐рддреА рдЪрд╛рдВрдЧрд▓реЗ)
- рдЖрдкрд▓реНрдпрд╛рдХрдбреЗ рдХрд╛рдп рдЖрд╣реЗ? рдХрд┐рддреА рдкреИрд╕реЗ, рдХрд┐рддреА рдЬрдореАрди, рдХреЛрдгрддреЗ рдмрд╛рдВрдзрдХрд╛рдо рдХрд░рдгрд╛рд░реЗ, рдХрдзреАрдкрд░реНрдпрдВрдд? (рдорд░реНрдпрд╛рджрд╛)
- рддреЛ рдХрд╛рдп рдЕрд╕рдгрд╛рд░ рдирд╛рд╣реА? рдЬрд▓рддрд░рдг рддрд▓рд╛рд╡ рдирд╛рд╣реА. рдЙрдкрд╛рд╣рд╛рд░рдЧреГрд╣ рдирд╛рд╣реА. (рдХрдХреНрд╖реЗрдмрд╛рд╣реЗрд░)
60 рдореБрд▓рд╛рдВрд╕рд╛рдареАрдЪрд╛ рд╣реЙрд▓ рдЖрдгрд┐ 6,000 рдореБрд▓рд╛рдВрд╕рд╛рдареАрдЪрд╛ рд╣реЙрд▓ рдпрд╛ рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЗрдорд╛рд░рддреА рдЖрд╣реЗрдд. рджреАрдкрд┐рдХрд╛рдиреЗ рдЖрдзреА рдХрд╛рдврд▓реЗ рдЖрдгрд┐ рдирдВрддрд░ рд╡рд┐рдЪрд╛рд░рд▓реЗ, рддрд░ рддреА рдЪреБрдХреАрдЪреА рдЗрдорд╛рд░рдд рдХрд╛рдвреЗрд▓ тАФ рдЖрдгрд┐ рднрд┐рдВрддреА рдЙрднреНрдпрд╛ рд░рд╛рд╣реАрдкрд░реНрдпрдВрдд рдХреЛрдгрд╛рдЪреНрдпрд╛рд╣реА рд▓рдХреНрд╖рд╛рдд рдпреЗрдгрд╛рд░ рдирд╛рд╣реА.
рдЖрдкрд▓рд╛ "рд╣реЙрд▓" рдореНрд╣рдгрдЬреЗ рдПрдХ app: рдПрдХ рд╕реВрдЪрдирд╛ рдлрд▓рдХ, рдЬрд┐рдереЗ рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рд╕реВрдЪрдирд╛ post рдХрд░рддрд╛рдд рдЖрдгрд┐ 5 million рдкрд╛рд▓рдХ рддреНрдпрд╛ рд╡рд╛рдЪрддрд╛рдд. рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдЖрдзреА рдлреЙрд░реНрдо рднрд░рддреЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
brief["ЁЯУЭ the brief<br/>'a notice board app<br/>for 5 million parents'"]
q["тЭУ clarifying questions<br/>how many schools? peak time?<br/>data kept how long?"]
subgraph sheet["ЁЯУЛ the requirements sheet"]
f["тЬЕ functional<br/>post ┬╖ read ┬╖ notify"]
nf["ЁЯУП non-functional<br/>p99 < 200 ms ┬╖ 99.9%<br/>100 reads : 1 post ┬╖ never lost"]
c["ЁЯз▒ constraints<br/>team of 4 ┬╖ AWS ┬╖ Marathi + English<br/>few thousand $/month ┬╖ 3 months"]
o["ЁЯЪл out of scope<br/>chat ┬╖ payments ┬╖ video"]
end
next["ЁЯзо lesson 02<br/>turn it into numbers"]
brief --> q --> sheet --> next
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/system-design/lesson-diagrams.html#l01
тЭУ рдХрд╛рдп
- System design тАФ system рдЪреЗ рднрд╛рдЧ (boxes), рддреЗ рдПрдХрдореЗрдХрд╛рдВрд╢реА рдХрд╕реЗ рдмреЛрд▓рддрд╛рдд (рдмрд╛рдг), data рдХреБрдареЗ рд░рд╛рд╣рддреЛ рдЖрдгрд┐ рдХрд╛, рд╣реЗ рдмрд╣реБрддреЗрдХ code рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзреА рдард░рд╡рдгреЗ. рдпрд╛рдЪреЗ рдлрд▓рд┐рдд рдореНрд╣рдгрдЬреЗ рдПрдХ рдЖрдХреГрддреА рдЖрдгрд┐ рддреНрдпрд╛рдорд╛рдЧрдЪреА рдХрд╛рд░рдгреЗ.
- Functional рдЧрд░рдЬрд╛ тАФ system рдХрд╛рдп рдХрд░рддреЗ, рдПрдЦрд╛рджреА рд╡реНрдпрдХреНрддреА рдХрд░реВ рд╢рдХреЗрд▓ рдЕрд╢рд╛ рдХреГрддреАрдВрдЪреНрдпрд╛ рд░реВрдкрд╛рдд рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ: "рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рдПрдХрд╛ рд╡рд░реНрдЧрд╛рд╕рд╛рдареА рд╕реВрдЪрдирд╛ post рдХрд░рддреЗ". рдпрд╛рддрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧрд░рдЬ рдкреБрдвреЗ рдПрдХ API call (рдзрдбрд╛ 03) рдЖрдгрд┐ data рд▓рд╛ рд╡рд┐рдЪрд╛рд░рд╛рдпрдЪрд╛ рдПрдХ рдкреНрд░рд╢реНрди (рдзрдбрд╛ 04) рдмрдирддреЗ.
- Non-functional рдЧрд░рдЬрд╛ тАФ рддреЗ рдХрд╛рдо рдХрд┐рддреА рдЪрд╛рдВрдЧрд▓реЗ рд╣реЛрддреЗ, рдиреЗрд╣рдореА рдПрдХрд╛ рдЖрдХрдбреНрдпрд╛рд╕рд╣:
- latency тАФ "read p99 < 200 ms" (100 рдкреИрдХреА 99 reads 200 ms рдкреЗрдХреНрд╖рд╛ рдХрдореА рд╡реЗрд│рд╛рдд рдкреВрд░реНрдг рд╣реЛрддрд╛рдд),
- availability тАФ "99.9% available" (30 рджрд┐рд╡рд╕рд╛рдВрдд рд╕реБрдорд╛рд░реЗ 43 рдорд┐рдирд┐рдЯрд╛рдВрдЪреЗ рдЕрдкрдпрд╢, рдзрдбрд╛ 15),
- scale тАФ "5 million рдкрд╛рд▓рдХ, reads рдЪреА рд╕рдВрдЦреНрдпрд╛ posts рдкреЗрдХреНрд╖рд╛ ~100 : 1 рдиреЗ рдЬрд╛рд╕реНрдд",
- durability тАФ "'posted' рджрд╛рдЦрд╡рд▓реНрдпрд╛рдирдВрддрд░ рд╕реВрдЪрдирд╛ рдХрдзреАрд╣реА рд╣рд░рд╡рддрд╛ рдХрд╛рдорд╛ рдирдпреЗ",
- рд╢рд┐рд╡рд╛рдп: consistency (рдзрдбрд╛ 10), security (рдзрдбрд╛ 14), cost (рдзрдбрд╛ 16). "рдЬрд▓рдж", "scalable" рдЖрдгрд┐ "secure" рдпрд╛ рдЧрд░рдЬрд╛ рдирд╛рд╣реАрдд. "p99 < 200 ms" рд╣реА рдЧрд░рдЬ рдЖрд╣реЗ.
- рдорд░реНрдпрд╛рджрд╛ (constraints) тАФ рддреБрдореНрд╣реА рдмрджрд▓реВ рд╢рдХрдд рдирд╛рд╣реА рдЕрд╢рд╛ рдЧреЛрд╖реНрдЯреА: team рдЪрд╛ рдЖрдХрд╛рд░, cloud, рднрд╛рд╖рд╛, budget, deadline, рдХрд╛рдпрджреЗ (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдореБрд▓рд╛рдВрдЪрд╛ data рдХреБрдареЗ рд╕рд╛рдард╡рддрд╛ рдпреЗрддреЛ).
- рдХрдХреНрд╖реЗрдмрд╛рд╣реЗрд░ (out of scope) тАФ рддреБрдореНрд╣реА рдЖрддреНрддрд╛ рдХрд╛рдп рдмрдирд╡рдгрд╛рд░ рдирд╛рд╣реА. рддреЗ рдореЛрдареНрдпрд╛рдиреЗ рд╕рд╛рдВрдЧрд┐рддрд▓реНрдпрд╛рдиреЗ рд░рдЪрдирд╛ рдЕрдорд░реНрдпрд╛рдж рд╡рд╛рдврдд рдирд╛рд╣реА.
- рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рдЪреЗ рдкреНрд░рд╢реНрди тАФ рд░рдЪрдирд╛ рдмрджрд▓рдгрд╛рд░реЗ рдкреНрд░рд╢реНрди: рдХрд┐рддреА рд╢рд╛рд│рд╛? peak рдХрдзреА рдЕрд╕рддреЛ? data рдХрд┐рддреА рдХрд╛рд│ рдареЗрд╡рд╛рдпрдЪрд╛? post рдХреЛрдг рдХрд░реВ рд╢рдХрддреЗ?
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдкреБрдврдЪрд╛ рдкреНрд░рддреНрдпреЗрдХ рдирд┐рд░реНрдгрдп рдпрд╛ рдХрд╛рдЧрджрд╛рд╡рд░ рдЕрд╡рд▓рдВрдмреВрди рдЕрд╕рддреЛ. рдкреНрд░рддреНрдпреЗрдХ post рдорд╛рдЧреЗ 100 reads рдореНрд╣рдгрдЬреЗ "reads cache рдХрд░рд╛" (рдзрдбрд╛ 05). "рдХрдзреАрд╣реА рд╣рд░рд╡реВ рдирдпреЗ" рдореНрд╣рдгрдЬреЗ "posted" рджрд╛рдЦрд╡рдгреНрдпрд╛рдЖрдзреА database рдордзреНрдпреЗ рдЯрд┐рдХрд╛рдК write, рдЖрдгрд┐ events рд╕рд╛рдареА outbox (рдзрдбрд╛ 08). 4 рдЬрдгрд╛рдВрдЪреА team рдореНрд╣рдгрдЬреЗ рдмрд╛рд░рд╛ services рдирд╛рд╣реА, рддрд░ рдПрдХ modular monolith (рдзрдбрд╛ 09). рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ рдХрд╛рд╣реА рд╣рдЬрд╛рд░ dollars рдореНрд╣рдгрдЬреЗ 200 servers рд▓рд╛рдЧрдгрд╛рд░реА рд░рдЪрдирд╛ рдмрд╛рдж. рдХрд╛рдЧрджрд╛рд╡рд░рдЪреА рдПрдХ рдУрд│ рдмрджрд▓рд╛ рдЖрдгрд┐ рдпреЛрдЧреНрдп рд░рдЪрдирд╛ рдмрджрд▓рддреЗ. рдореНрд╣рдгреВрдирдЪ рдХрд╛рдЧрдж рдЖрдзреА рдпреЗрддреЛ.
ЁЯОд рдореБрд▓рд╛рдЦрддреАрдд vs ЁЯПв рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдорд╛рдд
| ЁЯОд design рдореБрд▓рд╛рдЦрдд (45 рдорд┐рдирд┐рдЯреЗ) | ЁЯПв рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдо (рдЖрдард╡рдбреЗ) | |
|---|---|---|
| рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдЙрддреНрддрд░реЗ рдХреЛрдг рджреЗрддреЗ | рдореБрд▓рд╛рдЦрдд рдШреЗрдгрд╛рд░реЗ, рдПрдХрд╛ рд╡рд╛рдХреНрдпрд╛рдд | product owners, рд╢рд┐рдХреНрд╖рд┐рдХрд╛, рдкрд╛рд▓рдХ, рд╡рдХреАрд▓, finance |
| рддреБрдореНрд╣реА рдХрд┐рддреА рд╡реЗрд│ рдШрд╛рд▓рд╡рддрд╛ | 5 рдорд┐рдирд┐рдЯреЗ тАФ рдордЧ рдкреБрдвреЗ рдЬрд╛ | рджрд┐рд╡рд╕ тАФ рдЖрдгрд┐ рдХрд╛рдЧрдж рдирдВрддрд░ рдмрджрд▓рддреЛ |
| рдЖрдХрдбреЗ | рдЧреЛрд▓ рдЖрдгрд┐ рдорд┐рд│реВрди рдард░рд╡рд▓реЗрд▓реЗ ("рд╕рдордЬрд╛ 5M users") | logs, рд╕рд░реНрд╡реЗрдХреНрд╖рдгреЗ, рддрд╢рд╛рдЪ app рдордзреВрди рдореЛрдЬрд▓реЗрд▓реЗ |
| рддреЗ рдХрд╛рдп рддрдкрд╛рд╕рддрд╛рдд | рддреБрдореНрд╣реА рдХрд╛рдврдгреНрдпрд╛рдЖрдзреА рд╡рд┐рдЪрд╛рд░рддрд╛ рдХрд╛, рдЖрдгрд┐ trade-offs рд╕рд╛рдВрдЧрддрд╛ рдХрд╛ | launch рд╡реЗрд│реА тАФ рдЖрдгрд┐ рдирдВрддрд░рд╣реА тАФ system рдХрд╛рдЧрджрд╛рд╡рд░рдЪреНрдпрд╛ рдЧрд░рдЬрд╛ рдкреВрд░реНрдг рдХрд░рддреЗ рдХрд╛ |
| рдлрд▓рд┐рдд | whiteboard рд╡рд░рдЪреА рдЖрдХреГрддреА | рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ design doc + ADRs (рдзрдбрд╛ 16), рдЗрддрд░рд╛рдВрдиреА рддрдкрд╛рд╕рд▓реЗрд▓реЗ |
рджреЛрдиреНрд╣реАрдХрдбреЗ рд╕рд╡рдп рдПрдХрдЪ: рд╡рд┐рдЪрд╛рд░рд╛, рд▓рд┐рд╣реВрди рдареЗрд╡рд╛, рдордЧ рдХрд╛рдврд╛.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
design/demo.py рдордзреАрд▓ requirements() рд╕реВрдЪрдирд╛ рдлрд▓рдХрд╛рдЪрд╛ рдХрд╛рдЧрдж рдЫрд╛рдкрддреЗ:
рддреАрди functional рдУрд│реА, рдЖрдХрдбреНрдпрд╛рдВрд╕рд╣ рдЪрд╛рд░ non-functional рдУрд│реА, рддреАрди рдорд░реНрдпрд╛рджрд╛, рдХрдХреНрд╖реЗрдмрд╛рд╣реЗрд░рдЪреА рдпрд╛рджреА рдЖрдгрд┐
рд╡рд┐рдЪрд╛рд░рд╛рдпрдЪреЗ рдкреНрд░рд╢реНрди. рдордЧ рдзрдбрд╛ 02 рдпрд╛ рдХрд╛рдЧрджрд╛рд╡рд░рдЪреЗ рдЖрдХрдбреЗ design/blocks.py
рдордзреАрд▓ estimate() рд▓рд╛ рджреЗрддреЛ. рдЦрд╛рд▓рдЪреНрдпрд╛ snippet рдордзреНрдпреЗ рддреБрдореНрд╣реА рджреЛрди рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдВрдЪреА рдЙрддреНрддрд░реЗ
рд╡реЗрдЧрд╡реЗрдЧрд│реА рджреЗрддрд╛ тАФ рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдиреЗрд▓рд╛ рдХрд┐рддреА reads? рдЖрдгрд┐ рд╕реВрдЪрдирд╛ рдХрд┐рддреА рдХрд╛рд│ рдареЗрд╡рд╛рдпрдЪреНрдпрд╛? тАФ рдЖрдгрд┐
system рдЪрд╛ рдЖрдХрд╛рд░ рдХрд╕рд╛ рдмрджрд▓рддреЛ рддреЗ рдкрд╛рд╣рддрд╛.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 design/demo.py requirements
python3 - <<'EOF'
import sys; sys.path.insert(0, "design"); from blocks import estimate
for ratio in (10, 100, 1000):
e = estimate(5_000_000, 0.2, ratio, 2_000)
print(f"reads per notice {ratio:>4} тЖТ peak {e['peak_rps']:>6,} req/s ┬╖ {e['servers']:>3} servers")
for years in (1, 5, 10):
print(f"notices kept {years:>2} y тЖТ {estimate(5_000_000, 0.2, 100, 2_000, years=years)['storage_tb']:>5} TB")
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
requirements рдЫрд╛рдкрддреЗ:
тФАтФА the brief: 'build a notice board app for 5 million parents'. Before drawing a box, write the sheet:
functional a teacher posts a notice to a class
a parent reads the notices of their children's classes
a parent gets a notification for urgent notices
non-functional read p99 < 200 ms ┬╖ post p99 < 500 ms
99.9% available
reads outnumber posts ~100 : 1
a notice must never be lost once 'posted' is shown
constraints team of 4 ┬╖ AWS ┬╖ Marathi + English
budget: a few thousand dollars a month
launch in 3 months
out of scope (say it!): chat, payments, video ┬╖ questions to ask: how many schools? peak time? data kept how long?
рддреБрдордЪрд╛ snippet рдЫрд╛рдкрддреЛ:
reads per notice 10 тЖТ peak 382 req/s ┬╖ 2 servers
reads per notice 100 тЖТ peak 3,507 req/s ┬╖ 12 servers
reads per notice 1000 тЖТ peak 34,757 req/s ┬╖ 116 servers
notices kept 1 y тЖТ 2.19 TB
notices kept 5 y тЖТ 10.95 TB
notices kept 10 y тЖТ 21.9 TB
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдПрдХрд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдгрд╛рдЪреНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рдЪреЗ рдПрдХ рдЙрддреНрддрд░ рд░рдЪрдиреЗрд▓рд╛ 2 servers рд╡рд░реВрди 116 рд╡рд░ рдиреЗрддреЗ. рджреБрд╕рд░реЗ рдЙрддреНрддрд░ storage рджреБрдкреНрдкрдЯ рдХрд░рддреЗ. рддреЗрдЪ рдХрд╛рдо, рддреАрдЪ app рдЪреА рдХрд▓реНрдкрдирд╛ тАФ рдкрдг рд╡реЗрдЧрд│реА рдЗрдорд╛рд░рдд. рдореНрд╣рдгреВрдирдЪ рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд╛рдврдгреНрдпрд╛рдЖрдзреА рд╡рд┐рдЪрд╛рд░рддреЗ: рдЪрд┐рддреНрд░ рдирд╡реНрд╣реЗ, рдХрд╛рдЧрдж рдЖрдХрд╛рд░ рдард░рд╡рддреЛ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рдорд┐рдирд┐рдЯрд╛рдд boxes рдХрд╛рдврдгреЗ тАФ reads, peak рдХрд┐рдВрд╡рд╛ budget рдХреЛрдгрд╛рд▓рд╛рд╣реА рдорд╛рд╣реАрдд рд╣реЛрдгреНрдпрд╛рдЖрдзреА
- рдЖрдХрдбреЗ рдирд╕рд▓реЗрд▓реНрдпрд╛ non-functional рдЧрд░рдЬрд╛: "рддреЗ рдЬрд▓рдж рдЖрдгрд┐ scalable рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ"
- durability рд╡рд┐рд╕рд░рдгреЗ: "рдЖрдкрдг рдХрдзреА рд╕реВрдЪрдирд╛ рдЧрдорд╛рд╡реВ рд╢рдХрддреЛ рдХрд╛?" рд╣рд╛ рдкреНрд░рд╢реНрди write path рдмрджрд▓рддреЛ (рдзрдбрд╛ 08)
- рдХрдХреНрд╖реЗрдмрд╛рд╣реЗрд░рдЪреА рдпрд╛рджреАрдЪ рдирд╛рд╣реА тАФ рдордЧ chat, payments рдЖрдгрд┐ video рдПрдХреЗрдХ рдХрд░реВрди рдЖрдд рдШреБрд╕рддрд╛рдд
- рдХрд╛рдо 5 million рдЪреЗ рдЕрд╕рддрд╛рдирд╛ 1 billion users рд╕рд╛рдареА рд░рдЪрдирд╛ рдХрд░рдгреЗ (рдЖрдгрд┐ team 4 рдЬрдгрд╛рдВрдЪреА рдЕрд╕рддрд╛рдирд╛)
- рдкреНрд░рд╢реНрди рд╡рд┐рдЪрд╛рд░рдгреЗ рдкрдг рдЙрддреНрддрд░реЗ рд╕рдЧрд│реНрдпрд╛рдВрдирд╛ рджрд┐рд╕рддреАрд▓ рдЕрд╢реА рд▓рд┐рд╣реВрди рди рдареЗрд╡рдгреЗ
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдорд╛рдд рд╣рд╛ рдХрд╛рдЧрдж design document рдЪреЗ рдкрд╣рд┐рд▓реЗ рдкрд╛рди рдЕрд╕рддреЛ, рдХреЛрдгреАрд╣реА рдмрд╛рдВрдзрд╛рдпрд▓рд╛ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рдгреНрдпрд╛рдЖрдзреА рддрдкрд╛рд╕рд▓реЗрд▓реЗ. рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп repo рдордзреНрдпреЗ рдареЗрд╡рддреЗ рддреА рдЫреЛрдЯреА рдЖрд╡реГрддреНрддреА:
# Notice board тАФ requirements (v1, 2026-09)
## Functional
- F1 a teacher posts a notice to a class (text, optional photo, urgent flag)
- F2 a parent reads the notices of their children's classes, newest first
- F3 a parent gets a push/SMS for urgent notices
## Non-functional
- read p99 < 200 ms, post p99 < 500 ms (measured at the load balancer)
- 99.9% monthly availability; RPO 0 for posted notices, RTO 1 hour
- 5M parents, ~1M notices/day, ~100 reads per notice, peak ├Ч3 at 7тАУ9 am
## Constraints
- team of 4 ┬╖ AWS ap-south-1 (children's data stays in India) ┬╖ Marathi + English
- budget ~$3,000/month ┬╖ launch in 3 months
## Out of scope (v1)
- chat, payments, video
## Open questions
- how many schools in year 1? ┬╖ how long are notices kept? ┬╖ may parents reply?
On a real account тАФ рдХрд╛рд╣реА рдорд░реНрдпрд╛рджрд╛ рдкрдХреНрдХреНрдпрд╛ рдЕрд╕рддрд╛рдд, рдЬреНрдпрд╛ рд░рдЪрдирд╛ рдХрд░рдгреНрдпрд╛рдЖрдзреА рддреБрдореНрд╣реА рдкрд╛рд╣реВ рд╢рдХрддрд╛. рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рддреБрдордЪреНрдпрд╛ account рдордзреАрд▓ Amazon SNS рдЪреА SMS рдЦрд░реНрдЪ рдорд░реНрдпрд╛рджрд╛ (5M рддрд╛рддрдбреАрдЪреЗ SMS рд▓рд╣рд╛рди default рдорд░реНрдпрд╛рджрд╛ рдореЛрдбрддреАрд▓):
aws sns get-sms-attributes --attributes MonthlySpendLimit
aws service-quotas list-service-quotas --service-code sns --query 'Quotas[].{name:QuotaName,value:Value}'
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдмрд╣реБрддреЗрдХ рдЕрдкрдпрд╢реА projects рдПрдЦрд╛рджреНрдпрд╛ рдХрдареАрдг algorithm рдореБрд│реЗ рдЕрдкрдпрд╢реА рдЭрд╛рд▓реЗ рдирд╛рд╣реАрдд. рддреНрдпрд╛рдВрдиреА рдЪреБрдХреАрдЪреА рдЧреЛрд╖реНрдЯ рдмрд╛рдВрдзрд▓реА, рдХрд┐рдВрд╡рд╛ рдмрд░реЛрдмрд░ рдЧреЛрд╖реНрдЯ рдЪреБрдХреАрдЪреНрдпрд╛ рдЖрдХрдбреНрдпрд╛рдВрд╕рд╛рдареА рдмрд╛рдВрдзрд▓реА. System рдорд╛рдЧрдгрд╛рд▒реНрдпрд╛ рд▓реЛрдХрд╛рдВрдиреА рдорд╛рдиреНрдпрддрд╛ рджрд┐рд▓реЗрд▓рд╛ рдПрдХрд╛ рдкрд╛рдирд╛рдЪрд╛ рдХрд╛рдЧрдж рд╣рд╛ рд╕рд░реНрд╡рд╛рдд рд╕реНрд╡рд╕реНрдд рдЙрдкрд╛рдп рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рдХрд╛рдЧрдж рдореНрд╣рдгрддреЛ "5 million рдкрд╛рд▓рдХ" рдЖрдгрд┐ "рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдиреЗрд▓рд╛ 100 reads". рдореНрд╣рдгрдЬреЗ рд╕реЗрдХрдВрджрд╛рд▓рд╛ рдХрд┐рддреА requests? рдХрд┐рддреА terabytes? рдХрд┐рддреА servers? рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдЖрдХрдбреЗрдореЛрдб рдХрд░рддреЗ.
git checkout lesson-02-capacity