ЁЯзо рдзрдбрд╛ 02 тАФ Capacity рдЕрдВрджрд╛рдЬ: рд░рдЪрдиреЗрдЪрд╛ рдЖрдХрд╛рд░ рдард░рд╡рдгрд╛рд░реЗ рдЖрдХрдбреЗ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 02 ┬╖ рдорд╛рдЧреЗ: lesson-01-requirements ┬╖ рдкреБрдвреЗ: lesson-03-api-design
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбрд╛ 01, рдЖрдгрд┐ рдкрджреНрдзрддреАрдЪреА рджреБрд╕рд░реА рдкрд╛рдпрд░реА: рдХрд╛рдЧрджрд╛рд▓рд╛ рдвреЛрдмрд│ рдЖрдХрдбреНрдпрд╛рдВрдд рдмрджрд▓рд╛ тАФ рдЬреЗ рддреБрдореНрд╣реА рдкрд╛рдЪ
рдорд┐рдирд┐рдЯрд╛рдВрдд рдХрд╛рдЧрджрд╛рд╡рд░ рдХрд╛рдвреВ рд╢рдХрддрд╛ тАФ requests per second, peak, рд╡рд░реНрд╖рд╛рдиреБрд╡рд░реНрд╖рд╛рдВрдЪреЗ storage
(рдкреНрд░рддреАрдВрд╕рд╣), bandwidth рдЖрдгрд┐ servers. design/blocks.py рдордзреАрд▓
estimate() рдЧрдгрд┐рдд рдХрд░рддреЗ; design/demo.py рдордзреАрд▓ capacity() рддреЗ рд╕реВрдЪрдирд╛
рдлрд▓рдХрд╛рд╕рд╛рдареА рдЪрд╛рд▓рд╡рддреЗ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рдХрддрд░рд┐рдирд╛ рдореНрд╣рдгрддреЗ рдирд╡рд╛ рд╣реЙрд▓ "рдЦреВрдк рдореБрд▓рд╛рдВрд╕рд╛рдареА" рдЖрд╣реЗ. рджреАрдкрд┐рдХрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рддреАрд▓ рдЖрдХрдбреНрдпрд╛рдВрдЪреА рдЬрд╛рдгрдХрд╛рд░ рдРрд╢реНрд╡рд░реНрдпрд╛рд▓рд╛ "рдЦреВрдк" рдЪреЗ рдЖрдХрдбреЗ рдХрд░рд╛рдпрд▓рд╛ рд╕рд╛рдВрдЧрддреЗ.
рдРрд╢реНрд╡рд░реНрдпрд╛рд▓рд╛ рдЕрдЪреВрдХ рдЕрд╕рдгреНрдпрд╛рдЪреА рдЧрд░рдЬ рдирд╛рд╣реА. рд╣реЙрд▓ рд╡рд░реНрдЧрдЦреЛрд▓реА, рд╡реНрдпрд╛рдпрд╛рдорд╢рд╛рд│рд╛ рдХреА рд╕реНрдЯреЗрдбрд┐рдпрдо рдПрд╡рдвреНрдпрд╛ рдЖрдХрд╛рд░рд╛рдЪрд╛ рдЖрд╣реЗ, рдПрд╡рдвреЗрдЪ рддрд┐рд▓рд╛ рдХрд│рд╛рдпрд▓рд╛ рд╣рд╡реЗ. рдореНрд╣рдгреВрди рддреА рдвреЛрдмрд│ рдореЛрдЬрддреЗ:
- 5 million рдкрд╛рд▓рдХ. рд╢рд┐рдХреНрд╖рд┐рдХрд╛ рджрд░ 5 рдкрд╛рд▓рдХрд╛рдВрдорд╛рдЧреЗ рджрд┐рд╡рд╕рд╛рд▓рд╛ рд╕реБрдорд╛рд░реЗ 1 рд╕реВрдЪрдирд╛ post рдХрд░рддрд╛рдд тАФ рдореНрд╣рдгрдЬреЗ рд╕рдЧрд│реНрдпрд╛ рд╢рд╛рд│рд╛рдВрдд рдорд┐рд│реВрди рджрд┐рд╡рд╕рд╛рд▓рд╛ рд╕реБрдорд╛рд░реЗ 1 million рд╕реВрдЪрдирд╛.
- рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдирд╛ рд╕реБрдорд╛рд░реЗ 100 рд╡реЗрд│рд╛ рд╡рд╛рдЪрд▓реА рдЬрд╛рддреЗ. рдореНрд╣рдгрдЬреЗ рдореЛрдареЗ рдХрд╛рдо reads рдЪреЗ рдЖрд╣реЗ, writes рдЪреЗ рдирд╛рд╣реА.
- рдПрдХрд╛ рджрд┐рд╡рд╕рд╛рдд рд╕реБрдорд╛рд░реЗ 86,400 рд╕реЗрдХрдВрдж рдЕрд╕рддрд╛рдд тАФ рддреНрдпрд╛рд▓рд╛ 100,000 рдореНрд╣рдгрд╛. рдореНрд╣рдгрдЬреЗ рджрд┐рд╡рд╕рд╛рд▓рд╛ 1 million рдореНрд╣рдгрдЬреЗ рд╕реЗрдХрдВрджрд╛рд▓рд╛ рд╕реБрдорд╛рд░реЗ 12. рд╕реЛрдкреЗ.
- рд╕рдХрд╛рд│реА 8 рд╡рд╛рдЬрддрд╛ рд╕рдЧрд│реЗ рдПрдХрджрдо app рдЙрдШрдбрддрд╛рдд: рдиреЗрд╣рдореАрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреНрдпрд╛ 3 рдкрдЯ.
- рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдирд╛ 5 рд╡рд░реНрд╖реЗ рдареЗрд╡рд▓реА рдЬрд╛рддреЗ, рдЖрдгрд┐ рдПрдЦрд╛рджреА рдЬрд│рд▓реА рддрд░ рдореНрд╣рдгреВрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдиреЛрдВрджрд╡рд╣реАрдЪреНрдпрд╛ 3 рдкреНрд░рддреА рдареЗрд╡рддреЗ.
рдЖрддрд╛ рдРрд╢реНрд╡рд░реНрдпрд╛ рд╕рд╛рдВрдЧреВ рд╢рдХрддреЗ: "рд╣реА рд╡реНрдпрд╛рдпрд╛рдорд╢рд╛рд│рд╛ рдЖрд╣реЗ, рд╕реНрдЯреЗрдбрд┐рдпрдо рдирд╛рд╣реА. рд╡рд╛рдЪрдгрд╛рд░реЗ рдЦреВрдк, рд▓рд┐рд╣рд┐рдгрд╛рд░реЗ рдлрд╛рд░ рдереЛрдбреЗ, рдЖрдгрд┐ рдиреЛрдВрджрд╡рд╣реА рдПрдХрд╛ рдХрдкрд╛рдЯрд╛рдд рдорд╛рд╡рддреЗ." рддреЗ рд╡рд╛рдХреНрдп рдореНрд╣рдгрдЬреЗ рдЙрддреНрддрд░. рдиреЗрдордХреЗ рдЕрдВрдХ рдирд╡реНрд╣реЗрдд.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
u["ЁЯСк 5M parents<br/>1M notices/day"] --> w["тЬНя╕П writes<br/>1M ├╖ 86,400 тЙИ 11.6/s"]
w --> r["ЁЯСА reads ├Ч100<br/>тЙИ 1,157/s"]
r --> avg["ЁЯУК average<br/>тЙИ 1,169 req/s"]
avg --> pk["тЫ░я╕П peak ├Ч3<br/>тЙИ 3,507 req/s"]
pk --> sv["ЁЯЦея╕П servers<br/>3,507 ├╖ (500 ├Ч 60%) тЖТ 12"]
w --> st["ЁЯТ╛ storage<br/>1M ├Ч 2 KB ├Ч 365 ├Ч 5 ├Ч 3 copies<br/>тЙИ 10.95 TB"]
pk --> bw["ЁЯУ╢ bandwidth<br/>3,507 ├Ч 2 KB тЙИ 7 MB/s"]
sv --> shape["ЁЯзн the SHAPE<br/>tiny writes ┬╖ heavy reads<br/>тЖТ cache the reads"]
st --> shape
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/system-design/lesson-diagrams.html#l02
тЭУ рдХрд╛рдп
- Back-of-the-envelope рдЕрдВрджрд╛рдЬ тАФ рдвреЛрдмрд│ рдЖрдХрдбреЗ, рдЬреЛрд░рд╛рдд рдЧреЛрд▓ рдХреЗрд▓реЗрд▓реЗ, рдорд┐рдирд┐рдЯрд╛рдВрдд рдХреЗрд▓реЗрд▓реЗ. рдЙрджреНрджреЗрд╢ рдЖрд╣реЗ рдкрд░рд┐рдорд╛рдгрд╛рдЪрд╛ рдХреНрд░рдо (order of magnitude): рд╕реЗрдХрдВрджрд╛рд▓рд╛ рджрд╣рд╛, рд╣рдЬрд╛рд░ рдХреА million?
- рддреЛрдВрдбрдкрд╛рда рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реНрдпрд╛рдд рдЕрд╢рд╛ рджрд╣рд╛рдЪреНрдпрд╛ рдШрд╛рддреА:
- 1 рд╣рдЬрд╛рд░ = 10^3 (KB), 1 million = 10^6 (MB), 1 billion = 10^9 (GB), 1 trillion = 10^12 (TB)
- рдПрдХ рджрд┐рд╡рд╕ тЙИ 86,400 s тЙИ 10^5 s тЖТ рджрд┐рд╡рд╕рд╛рд▓рд╛ 1 million тЙИ рд╕реЗрдХрдВрджрд╛рд▓рд╛ 12
- рдПрдХ рдорд╣рд┐рдирд╛ тЙИ 2.6 million рд╕реЗрдХрдВрдж; рдПрдХ рд╡рд░реНрд╖ тЙИ 31.5 million рд╕реЗрдХрдВрдж
- 2 KB ├Ч 1 million = 2 GB
- Read/write ratio тАФ рдкреНрд░рддреНрдпреЗрдХ write рдорд╛рдЧреЗ рдХрд┐рддреА reads. рд╕реВрдЪрдирд╛ рдлрд▓рдХрд╛рдЪреЗ 100 : 1 рдЖрд╣реЗ: рдПрдХ read-heavy system. Read-heavy рдореНрд╣рдгрддреЗ "cache рдХрд░рд╛ рдЖрдгрд┐ рдкреНрд░рддреА рдареЗрд╡рд╛". Write-heavy рдореНрд╣рдгрддреЗ "queue рдХрд░рд╛, batch рдХрд░рд╛ рдЖрдгрд┐ data рд╡рд┐рднрд╛рдЧрд╛".
- Peak factor тАФ рд╕рд░реНрд╡рд╛рдд рдЧрд░реНрджреАрдЪреЗ рдорд┐рдирд┐рдЯ рднрд╛рдЧрд┐рд▓реЗ рд╕рд░рд╛рд╕рд░реА. рд╕рдХрд╛рд│рдЪреНрдпрд╛ рд╕реВрдЪрдирд╛, рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕, рд╕рдгрд╛рдЪреНрдпрд╛ рд╢реБрднреЗрдЪреНрдЫрд╛: рдЗрдереЗ ├Ч3. рд░рдЪрдирд╛ peak рд╕рд╛рдареА рдХрд░рд╛, рд╕рд░рд╛рд╕рд░реАрд╕рд╛рдареА рдирд╛рд╣реА.
- Storage = рджрд┐рд╡рд╕рд╛рдЪреЗ writes ├Ч рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреЗ bytes ├Ч 365 ├Ч рд╡рд░реНрд╖реЗ ├Ч рдкреНрд░рддреА (replicas). рдпрд╛ рдкреНрд░рддреА рдореНрд╣рдгрдЬреЗ рдЦрд▒реНрдпрд╛ disks, рдЬреНрдпрд╛рдВрдЪреЗ рддреБрдореНрд╣реА рдкреИрд╕реЗ рджреЗрддрд╛.
- Bandwidth (egress) тАФ рддреБрдордЪреНрдпрд╛ servers рдордзреВрди рд╕реЗрдХрдВрджрд╛рд▓рд╛ рдмрд╛рд╣реЗрд░ рдЬрд╛рдгрд╛рд░реЗ bytes.
estimate()peak рд╡реЗрд│реА рдкреНрд░рддреНрдпреЗрдХ request рдорд╛рдЧреЗ рдПрдХ 2 KB рдЪреА рд╕реВрдЪрдирд╛ рдореЛрдЬрддреЗ тАФ рдкрд╣рд┐рд▓рд╛ рдЕрдВрджрд╛рдЬ. 20 рд╕реВрдЪрдирд╛рдВрдЪреЗ feed page рдЬрд╛рд╕реНрдд data рд╣рд▓рд╡рддреЗ; photos рд╕реБрджреНрдзрд╛. - Servers = peak ├╖ (рдПрдХ server рдЬреЗ рдХрд░рддреЛ ├Ч 60%). 60% рдореБрд│реЗ рдЕрдЪрд╛рдирдХ рд╡рд╛рдвреАрд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдПрдЦрд╛рджрд╛ server рдЧреЗрд▓реНрдпрд╛рд╕ headroom рд░рд╛рд╣рддреЗ. рдкреНрд░рддреНрдпреЗрдХ server рд▓рд╛ 500 req/s рд╣рд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪрд╛ рдЖрдХрдбрд╛ рдЖрд╣реЗ тАФ рдЦрд░рд╛ рдЖрдХрдбрд╛ load test рджреЗрддреЛ (Scaling рд╢рд╛рд│рд╛, рдзрдбрд╛ 02).
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдЖрдХрдбреЗ рдЖрдХрд╛рд░ рдард░рд╡рддрд╛рдд. рд╕реЗрдХрдВрджрд╛рд▓рд╛ 11.6 writes рдЦреВрдкрдЪ рдХрдореА рдЖрд╣реЗрдд: рдПрдХ database primary рддреЗ рд╕рд╣рдЬ рд╣рд╛рддрд╛рд│рддреЛ, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ sharding рд▓рд╛рдЧрдд рдирд╛рд╣реА. Peak рд╡реЗрд│реА рд╕реЗрдХрдВрджрд╛рд▓рд╛ 3,507 reads рд╣реЗ рдЦрд░реЗ рдХрд╛рдо рдЖрд╣реЗ, рдЖрдгрд┐ рддреНрдпрд╛рддрд▓реЗ 99% reads рдЖрд╣реЗрдд, рдореНрд╣рдгреВрди рддреБрдореНрд╣рд╛рд▓рд╛ cache рд╣рд╡рд╛рдЪ (рдзрдбрд╛ 05). 5 рд╡рд░реНрд╖рд╛рдВрдд 11 TB рдПрдХрд╛ database cluster рдордзреНрдпреЗ рдорд╛рд╡рддреЛ. рдЖрдХрдбреНрдпрд╛рдВрд╢рд┐рд╡рд╛рдп рд▓реЛрдХ рдЕрдВрджрд╛рдЬ рдмрд╛рдВрдзрддрд╛рдд тАФ рдЖрдгрд┐ рдЕрдВрджрд╛рдЬ рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдиреА рдЪреБрдХреВ рд╢рдХрддрд╛рдд: рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рджрд┐рд╡рд╢реА рдХреЛрд╕рд│рдгрд╛рд░реА рд░рдЪрдирд╛, рдХрд┐рдВрд╡рд╛ рдПрдХ server рд╕рд╣рдЬ рдЙрдЪрд▓реЗрд▓ рдЕрд╢рд╛ load рд╕рд╛рдареА 40 microservices рдЖрдгрд┐ sharded database.
рдЙрддреНрддрд░ рдореНрд╣рдгрдЬреЗ рдЖрдХрд╛рд░, рдЕрдВрдХ рдирд╡реНрд╣реЗ. рддреБрдореНрд╣реА 12 servers рдореНрд╣рдгрд╛рд▓рд╛рдд рдХреА 14, рд╣реЗ рдХреЛрдгреА рддрдкрд╛рд╕рдгрд╛рд░ рдирд╛рд╣реА. рддреБрдореНрд╣реА "writes рд▓рд╣рд╛рди, reads рдЬрдб" рд╣реЗ рдкрд╛рд╣рд┐рд▓реЗ рдХрд╛ рдЖрдгрд┐ reads рдЪреНрдпрд╛ рдкреБрдвреЗ cache рдареЗрд╡рд▓рд╛ рдХрд╛, рд╣реЗ рддреЗ рддрдкрд╛рд╕рддреАрд▓.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
design/blocks.py рдордзреАрд▓ estimate(daily_users, actions_per_user, read_write_ratio, bytes_per_write, peak_factor=3, per_server_rps=500, years=5, replicas=3):
- рджрд┐рд╡рд╕рд╛рдЪреЗ writes = users ├Ч рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреНрдпрд╛ рдХреГрддреА (5M ├Ч 0.2 = 1M рд╕реВрдЪрдирд╛)
- рджрд┐рд╡рд╕рд╛рдЪреЗ reads = writes ├Ч ratio (├Ч 100)
- рд╕рд░рд╛рд╕рд░реА req/s = (reads + writes) ├╖
DAY(86,400) - peak = рд╕рд░рд╛рд╕рд░реА ├Ч peak factor
- servers =
ceil(peak ├╖ (per_server_rps ├Ч 0.6)) - storage = рджрд┐рд╡рд╕рд╛рдЪреЗ writes ├Ч bytes ├Ч 365 ├Ч рд╡рд░реНрд╖реЗ ├Ч replicas
- egress = peak ├Ч рдкреНрд░рддреНрдпреЗрдХрд╛рдЪреЗ bytes
human() bytes рдирд╛ KB, MB, GB, TB рдордзреНрдпреЗ рдЫрд╛рдкрддреЗ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 design/demo.py capacity
python3 - <<'EOF'
import sys; sys.path.insert(0, "design"); from blocks import estimate, human, DAY
print(f"1M a day = {1_000_000 / DAY:.1f} per second ┬╖ 100M a day = {100_000_000 / DAY:,.0f} per second")
for users in (500_000, 5_000_000, 50_000_000):
e = estimate(users, 0.2, 100, 2_000)
print(f"{users:>10,} parents тЖТ peak {e['peak_rps']:>6,} req/s ┬╖ {e['servers']:>3} servers ┬╖ {e['storage_tb']:>6} TB")
for peak in (2, 3, 10):
print(f"peak ├Ч{peak:<2} тЖТ {estimate(5_000_000, 0.2, 100, 2_000, peak_factor=peak)['servers']:>2} servers")
for copies in (1, 3):
print(f"replicas={copies} тЖТ {estimate(5_000_000, 0.2, 100, 2_000, replicas=copies)['storage_tb']:>5} TB in 5 years")
print("one year of notices, one copy:", human(1_000_000 * 2_000 * 365))
EOF
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
capacity рдЫрд╛рдкрддреЗ:
тФАтФА 5M parents ┬╖ 1M notices a day across all schools ┬╖ 100 reads per notice ┬╖ 2 KB each ┬╖ peak ├Ч3 ┬╖ 5 years ┬╖ 3 copies
writes_per_s 11.6
reads_per_s 1157.4
avg_rps 1169
peak_rps 3507
servers 12
storage_tb 10.95
egress_mb_s 7.0
rules of thumb: a day тЙИ 86,400 s тЙИ 10^5 ┬╖ 1M/day тЙИ 12/s ┬╖ 2 KB ├Ч 1M = 2.0 GB
the answer is a SHAPE, not a digit: tiny writes, heavy reads, ~11 TB in 5 years тЖТ cache the reads; one database cluster is enough
рддреБрдордЪрд╛ snippet рдЫрд╛рдкрддреЛ:
1M a day = 11.6 per second ┬╖ 100M a day = 1,157 per second
500,000 parents тЖТ peak 351 req/s ┬╖ 2 servers ┬╖ 1.09 TB
5,000,000 parents тЖТ peak 3,507 req/s ┬╖ 12 servers ┬╖ 10.95 TB
50,000,000 parents тЖТ peak 35,069 req/s ┬╖ 117 servers ┬╖ 109.5 TB
peak ├Ч2 тЖТ 8 servers
peak ├Ч3 тЖТ 12 servers
peak ├Ч10 тЖТ 39 servers
replicas=1 тЖТ 3.65 TB in 5 years
replicas=3 тЖТ 10.95 TB in 5 years
one year of notices, one copy: 730.0 GB
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рджрд╣рд╛рдкрдЯ рдкрд╛рд▓рдХ рдореНрд╣рдгрдЬреЗ рд╕рдЧрд│реЗрдЪ рджрд╣рд╛рдкрдЯ тАФ рдЧрдгрд┐рдд рд╕реЛрдкреЗ рдЖрд╣реЗ, рдЖрдгрд┐ рддреЛрдЪ рдореБрджреНрджрд╛ рдЖрд╣реЗ. 50 million рдкрд╛рд▓рдХрд╛рдВрд╡рд░, 109.5 TB рдЖрдгрд┐ 117 servers рд╣рд╛ рд╡реЗрдЧрд│рд╛ рдЖрдХрд╛рд░ рдЖрд╣реЗ: рдЖрддрд╛ data рд╡рд┐рднрд╛рдЧрд╛рд╡рд╛ рд▓рд╛рдЧреВ рд╢рдХрддреЛ (Database рд╢рд╛рд│рд╛) рдЖрдгрд┐ reads cache рдХрд░рд╛рд╡реЗрдЪ рд▓рд╛рдЧрддрд╛рдд. ├Ч10 рдЪрд╛ peak (рдирд┐рдХрд╛рд▓рд╛рдЪрд╛ рджрд┐рд╡рд╕) 12 рдирд╡реНрд╣реЗ рддрд░ 39 servers рдорд╛рдЧрддреЛ. рдЖрдгрд┐ 3 рдкреНрд░рддреА disk рддрд┐рдкреНрдкрдЯ рдХрд░рддрд╛рдд: 3.65 TB рдЪреЗ 10.95 TB рд╣реЛрддрд╛рдд.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рд╕рд░рд╛рд╕рд░реАрд╕рд╛рдареА рд░рдЪрдирд╛ рдХрд░рдгреЗ рдЖрдгрд┐ peak рд╡рд┐рд╕рд░рдгреЗ (рд╕рдХрд╛рд│реА 8 рдЪреА рдЧрд░реНрджреА ├Ч3; рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рддреНрдпрд╛рд╣реВрди рдЬрд╛рд╕реНрдд)
- рдкреНрд░рддреА рд╡рд┐рд╕рд░рдгреЗ: replicas, backups рдЖрдгрд┐ indexes рд╕рдЧрд│реЗ disk рдШреЗрддрд╛рдд
- рдЖрдХрд╛рд░ рдирд╕рд▓реЗрд▓реЗ рдиреЗрдордХреЗ рдЕрдВрдХ: "рдЖрдкрд▓реНрдпрд╛рд▓рд╛ 11.69 servers рд▓рд╛рдЧрддреАрд▓" рдЖрдгрд┐ рдирд┐рд╖реНрдХрд░реНрд╖ рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА
- рдЧрдгрд┐рддрд╛рдд servers 100% рд╡рд░ рдЪрд╛рд▓рд╡рдгреЗ тАФ рдордЧ рдПрдХ server рдЧреЗрд▓рд╛ рдХреА рдмрд╛рдХреАрдЪреНрдпрд╛рдВрд╡рд░ рдЬрд╛рд╕реНрдд рднрд╛рд░ рдпреЗрддреЛ
- bits рдЖрдгрд┐ bytes рдЪреА рдЧрд▓реНрд▓рдд: 1 Gb/s (gigabits) рдореНрд╣рдгрдЬреЗ рдлрдХреНрдд 125 MB/s (megabytes)
- рдЙрджрд╛рд╣рд░рдгрд╛рдЪреНрдпрд╛ "рдкреНрд░рддреНрдпреЗрдХ server рд▓рд╛ 500 req/s" рд╡рд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдареЗрд╡рдгреЗ тАФ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ service рдЪрд╛ load test рдХрд░рд╛
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
рдкреНрд░рддреНрдпрдХреНрд╖ рдХрд╛рдорд╛рдд рдЖрдХрдбреЗ рдлрдХреНрдд рдЕрдВрджрд╛рдЬрд╛рдВрддреВрди рдирд╛рд╣реА, рддрд░ рдореЛрдЬрдорд╛рдкрд╛рдВрддреВрди рдпреЗрддрд╛рдд. On a real account тАФ рдЦрд░рд╛ peak factor load balancer рдЪреНрдпрд╛ request count рдордзреНрдпреЗ, рдорд┐рдирд┐рдЯрд╛-рдорд┐рдирд┐рдЯрд╛рд▓рд╛ рдЕрд╕рддреЛ; рд╕рд░реНрд╡рд╛рдд рдЧрд░реНрджреАрдЪреЗ рдорд┐рдирд┐рдЯ рджрд┐рд╡рд╕рд╛рдЪреНрдпрд╛ рд╕рд░рд╛рд╕рд░реАрдиреЗ рднрд╛рдЧрд╛:
aws cloudwatch get-metric-statistics --namespace AWS/ApplicationELB \
--metric-name RequestCount --statistics Sum --period 60 \
--dimensions Name=LoadBalancer,Value=app/notice-alb/50dc6c495c0c9188 \
--start-time 2026-09-21T00:00:00Z --end-time 2026-09-22T00:00:00Z
рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ row рдЪреЗ рдЦрд░реЗ bytes database рдордзреНрдпреЗ рдЕрд╕рддрд╛рдд тАФ рдЦрд▒реНрдпрд╛ data рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рддреАрд╡рд░ рддреЗ рдореЛрдЬрд╛:
-- PostgreSQL: average stored size of one notice row, and the table + index size
SELECT avg(pg_column_size(n.*)) AS bytes_per_row FROM notices n;
SELECT pg_size_pretty(pg_total_relation_size('notices'));
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдЕрдВрджрд╛рдЬ design doc рдордзреНрдпреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЧреГрд╣рд┐рддрдХрд╛рдВрд╕рд╣ рдареЗрд╡рд╛ ("рдкреНрд░рддреНрдпреЗрдХ рд╕реВрдЪрдиреЗрд▓рд╛ 100 reads, peak ├Ч3"). рдЦрд░рд╛ traffic рдЖрд▓рд╛ рдХреА рддреБрд▓рдирд╛ рдХрд░рд╛. рдЖрдард╡рдбрд╛ 2 рдордзреНрдпреЗ рд╕рд╛рдкрдбрд▓реЗрд▓реЗ рдЪреБрдХреАрдЪреЗ рдЧреГрд╣рд┐рддрдХ рд╕реНрд╡рд╕реНрдд рдЕрд╕рддреЗ; рдирд┐рдХрд╛рд▓рд╛рдЪреНрдпрд╛ рджрд┐рд╡рд╢реА рд╕рд╛рдкрдбрд▓реЗ, рддрд░ рддреЗ outage рдЕрд╕рддреЗ.
тПня╕П рдкреБрдвреЗ
рдЖрддрд╛ рдЖрдХрд╛рд░ рдХрд│рд▓рд╛. рдХреЛрдгреАрд╣реА code рд▓рд┐рд╣рд┐рдгреНрдпрд╛рдЖрдзреА, рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдХрд░рд╛рд░ (contract) рд▓рд┐рд╣рд┐рддреЗ: app рдХреЛрдгрддреЗ requests рдкрд╛рдард╡рддреЛ рдЖрдгрд┐ server рдХрд╛рдп рдЙрддреНрддрд░ рджреЗрддреЛ.
git checkout lesson-03-api-design