ЁЯзй рдзрдбрд╛ 09 тАФ Monolith vs microservices: modular рдиреЗ рд╕реБрд░реБрд╡рд╛рдд рдХрд░рд╛, рдХрд╛рд░рдг рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛рдЪ рд╡рд┐рднрд╛рдЧрд╛
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 18 рдкреИрдХреА рдзрдбрд╛ 09 ┬╖ рдорд╛рдЧреАрд▓: lesson-08-events ┬╖ рдкреБрдвреАрд▓: lesson-10-consistency
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ08, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рдЪрдиреЗрд╕рдореЛрд░ рдпреЗрдгрд╛рд░рд╛ рдкреНрд░рд╢реНрди: рдПрдХ deploy рд╣реЛрдгрд╛рд░рд╛ program рдХреА
рдЕрдиреЗрдХ services? рд╕реБрд░реБрд╡рд╛рдд modular monolith рдиреЗ рдХрд░рд╛. рдкреНрд░рддреНрдпреЗрдХ network hop latency рд╡рд╛рдврд╡рддреЛ рдЖрдгрд┐
availability рдЪрд╛ рдЧреБрдгрд╛рдХрд╛рд░ рдХрд░рддреЛ (0.999^n). Distributed monolith рдордзреНрдпреЗ рд╕рдЧрд│рд╛ рдЦрд░реНрдЪ рдЕрд╕рддреЛ рдЖрдгрд┐
рдлрд╛рдпрджрд╛ рдХрд╛рд╣реАрдЪ рдирд╕рддреЛ. Teams, scaling рдХрд┐рдВрд╡рд╛ failure isolation рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдорд╛рдЧрддреАрд▓
рддреЗрд╡реНрд╣рд╛рдЪ рд╡рд┐рднрд╛рдЧрд╛ тАФ рдЖрдгрд┐ Conway's law рд▓рдХреНрд╖рд╛рдд рдареЗрд╡рд╛. design/designs.py рдордзреАрд▓
call_chain() рдЧрдгрд┐рдд рдХрд░рддреЛ; design/demo.py рдордзреАрд▓ services() рддреЗ рдЫрд╛рдкрддреЛ.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
рд╢рд╛рд│реЗрдЪреНрдпрд╛ рдХрд╛рд░реНрдпрд╛рд▓рдпрд╛рдд рдЪрд╛рд░ рдЯреЗрдмрд▓рд╛рдВрдЪреА рдПрдХ рдЦреЛрд▓реА рдЖрд╣реЗ: рд╕реВрдЪрдирд╛, рдкрд╛рд▓рдХ, SMS рдЖрдгрд┐ рдЕрд╣рд╡рд╛рд▓. рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдмрд▓рд╛рдЪреЗ рд╕реНрд╡рддрдГрдЪреЗ рдбреНрд░реЙрд╡рд░ рдЖрдгрд┐ рд╕реНрд╡рддрдГрдЪрд╛ рдХрд╛рд░рдХреВрди рдЖрд╣реЗ, рдЖрдгрд┐ рддреЗ рдХрд╛рдЧрдж рдЦреЛрд▓реАрддрд▓реНрдпрд╛ рдЦреЛрд▓реАрдд рд╣рд╛рддрд╛рдиреЗ рджреЗрддрд╛рдд. рддреНрдпрд╛рд▓рд╛ рдПрдХ рд╕реЗрдХрдВрдж рд▓рд╛рдЧрддреЛ. рдХрд╛рд░реНрдпрд╛рд▓рдп рд╣рд▓рд▓реЗ рдХреА рдкреВрд░реНрдг рдЦреЛрд▓реА рдПрдХрддреНрд░ рд╣рд▓рддреЗ. рд╣реЗрдЪ modular monolith: рдПрдХ рдЗрдорд╛рд░рдд, рд╕реНрдкрд╖реНрдЯ рдЯреЗрдмрд▓реЗ.
рдХреЛрдгреАрддрд░реА рдореНрд╣рдгрддреЗ: "рдкреНрд░рддреНрдпреЗрдХ рдЯреЗрдмрд▓ рд╢рд╣рд░рд╛рдд рд╡реЗрдЧрд╡реЗрдЧрд│реНрдпрд╛ рдЗрдорд╛рд░рддреАрдд рдареЗрд╡реВ тАФ рддреЗ рдЬрд╛рд╕реНрдд рдЖрдзреБрдирд┐рдХ рдЖрд╣реЗ." рдЖрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдЧрдж рд╕рд╛рдпрдХрд▓рдиреЗ ЁЯЪ▓ рдЬрд╛рддреЛ. рдкреНрд░рддреНрдпреЗрдХ рдлреЗрд░реАрд▓рд╛ 20 рдорд┐рдирд┐рдЯреЗ рд▓рд╛рдЧрддрд╛рдд, рдЖрдгрд┐ рдХрд╛рд╣реА рджрд┐рд╡рд╢реА рд╕рд╛рдпрдХрд▓ рдмрд┐рдШрдбрддреЗ. рдЪрд╛рд░ рдЯреЗрдмрд▓рд╛рдВрдЪреА рдЧрд░рдЬ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдкрд╛рд▓рдХрд╛рдЪреНрдпрд╛ рдкреНрд░рд╢реНрдирд╛рд▓рд╛ рдЖрддрд╛ рдЪрд╛рд░ рд╕рд╛рдпрдХрд▓ рдлреЗрд▒реНрдпрд╛ рд▓рд╛рдЧрддрд╛рдд, рдЖрдгрд┐ рдХреЛрдгрддреАрд╣реА рд╕рд╛рдпрдХрд▓ рдмрд┐рдШрдбрд▓реА рддрд░ рдкрд╛рд▓рдХрд╛рд▓рд╛ рдЙрддреНрддрд░ рдорд┐рд│рдд рдирд╛рд╣реА.
рд╡реЗрдЧрд│реА рдЗрдорд╛рд░рдд рдХрдзреА рдлрд╛рдпрджреНрдпрд╛рдЪреА? рдЬреЗрд╡реНрд╣рд╛ рдПрдЦрд╛рджреНрдпрд╛ рдЯреЗрдмрд▓рд╛рдЪреА рд╕реНрд╡рддрдГрдЪреА team рдЕрд╕рддреЗ рдЬрд┐рд▓рд╛ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╡реЗрд│реЗрдд рдХрд╛рдо рдХрд░рд╛рдпрдЪреЗ рдЕрд╕рддреЗ, рдЬреЗрд╡реНрд╣рд╛ рдПрдХрд╛ рдЯреЗрдмрд▓рд╛рд▓рд╛ рдмрд╛рдХреАрдЪреНрдпрд╛рдВрдкреЗрдХреНрд╖рд╛ рджрд╣рд╛рдкрдЯ рдЬрд╛рд╕реНрдд рдЬрд╛рдЧрд╛ рд▓рд╛рдЧрддреЗ, рдХрд┐рдВрд╡рд╛ рдЬреЗрд╡реНрд╣рд╛ рддреНрдпрд╛ рдЯреЗрдмрд▓рд╛рд▓рд╛ рд▓рд╛рдЧрд▓реЗрд▓реНрдпрд╛ рдЖрдЧреАрдиреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рд▓рдп рдмрдВрдж рд╣реЛрддрд╛ рдХрд╛рдорд╛ рдирдпреЗ. рддреНрдпрд╛рдЖрдзреА рдирд╛рд╣реА.
рдЖрдгрд┐ рджреАрдкрд┐рдХрд╛рдЪрд╛ рдПрдХ рдЗрд╢рд╛рд░рд╛: рдЪрд╛рд░рд╣реА рдЗрдорд╛рд░рддреАрдВрдирд╛ рддрд░реАрд╣реА рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрд│реА рдПрдХрд╛рдЪ рджрд┐рд╡рд╢реА рд╣рд▓рд╛рд╡реЗ рд▓рд╛рдЧрдд рдЕрд╕реЗрд▓, рддрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡реЗрдЧрд│реНрдпрд╛ рдЗрдорд╛рд░рддреА рдорд┐рд│рд╛рд▓реНрдпрд╛рдЪ рдирд╛рд╣реАрдд. рддреБрдореНрд╣рд╛рд▓рд╛ рдордзреЛрдордз рд╕рд╛рдпрдХрд▓реА рдЕрд╕рд▓реЗрд▓реЗ рдПрдХрдЪ рдХрд╛рд░реНрдпрд╛рд▓рдп рдорд┐рд│рд╛рд▓реЗ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
subgraph mono["ЁЯПв modular monolith тАФ one deploy"]
n["notices"] --- p["parents"]
p --- s["sms"]
s --- r["reports"]
end
subgraph micro["ЁЯПЩя╕П microservices тАФ a network hop per call"]
g["gateway"] -->|"20 ms ┬╖ 99.9%"| a["svc 1"]
a -->|"20 ms ┬╖ 99.9%"| b["svc 2"]
b -->|"20 ms ┬╖ 99.9%"| c["svc тАж 8"]
end
m["1 hop тЖТ 20 ms ┬╖ 99.90%<br/>3 hops тЖТ 60 ms ┬╖ 99.70%<br/>8 hops тЖТ 160 ms ┬╖ 99.20%"]
micro --> m
ЁЯЧ║я╕П рдХрд╛рдврд▓реЗрд▓реА рдЖрд╡реГрддреНрддреА + рдПрдХ lab: https://school-edh.pages.dev/system-design/lesson-diagrams.html#l09
тЭУ рдХрд╛рдп
- Monolith тАФ рдПрдХ program, рдПрдХ unit рдореНрд╣рдгреВрди deploy рдХреЗрд▓реЗрд▓рд╛. рднрд╛рдЧрд╛рдВрдордзреАрд▓ calls рдореНрд╣рдгрдЬреЗ function calls (nanoseconds, рдХрдзреАрдЪ рд╣рд░рд╡рдд рдирд╛рд╣реАрдд). рдПрдХ database transaction рд╕рдЧрд│реЗ рд╡реНрдпрд╛рдкреВ рд╢рдХрддреЛ.
- Modular monolith тАФ рдЖрдд рдкрдХреНрдХреНрдпрд╛ рд╕реАрдорд╛ рдЕрд╕рд▓реЗрд▓рд╛ monolith: рдкреНрд░рддреНрдпреЗрдХ module рддреНрдпрд╛рдЪреНрдпрд╛ tables рдЪрд╛ рдорд╛рд▓рдХ рдЕрд╕рддреЛ рдЖрдгрд┐ рдПрдХ рдЫреЛрдЯрд╛ interface рдЙрдШрдб рдХрд░рддреЛ; рдЗрддрд░ modules рддреНрдпрд╛рдЪреНрдпрд╛ рдЖрддрд▓реНрдпрд╛ рднрд╛рдЧрд╛рдд рд╣рд╛рдд рдШрд╛рд▓реВ рд╢рдХрдд рдирд╛рд╣реАрдд. Network рд╢рд┐рд╡рд╛рдп services рдЪреНрдпрд╛ design рдЪрд╛ рдмрд╣реБрддреЗрдХ рдлрд╛рдпрджрд╛ рдорд┐рд│рддреЛ.
- Microservices тАФ рдЕрдиреЗрдХ рдЫреЛрдЯреЗ programs, рдкреНрд░рддреНрдпреЗрдХ рдПрдХрдЯрд╛ deploy рд╣реЛрдгрд╛рд░рд╛, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ data рдЪрд╛ рдорд╛рд▓рдХ, network рд╡рд░реВрди рдмреЛрд▓рдгрд╛рд░реЗ (HTTP, gRPC, events).
- рдПрдХрд╛ hop рдЪреА рдХрд┐рдВрдордд тАФ network рдУрд▓рд╛рдВрдбрдгрд╛рд░рд╛ рдкреНрд░рддреНрдпреЗрдХ call рдпрд╛рдд рднрд░ рдШрд╛рд▓рддреЛ:
- latency тАФ рдЗрдереЗ рдкреНрд░рддреНрдпреЗрдХреА 20 ms; рдУрд│реАрддреАрд▓ hops рдмреЗрд░реАрдЬ рд╣реЛрддрд╛рдд: 8 hops = 160 ms, рдореНрд╣рдгрдЬреЗ 200 ms budget рдЪрд╛ рдмрд╣реБрддреЗрдХ рднрд╛рдЧ (рдзрдбрд╛ 01),
- availability тАФ рдкреНрд░рддреНрдпреЗрдХ hop рдЪрд╛рд▓рд▓рд╛ рддрд░рдЪ request рдЪрд╛рд▓рддреЛ, рдореНрд╣рдгреВрди availabilities рдЪрд╛ рдЧреБрдгрд╛рдХрд╛рд░ рд╣реЛрддреЛ: 0.999^n. 99.9% рд╡рд╛рд▓реНрдпрд╛ рдЖрда services рдорд┐рд│реВрди 99.20% рджреЗрддрд╛рдд тАФ рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ 43 рдРрд╡рдЬреА рд╕реБрдорд╛рд░реЗ 344 рдорд┐рдирд┐рдЯреЗ рдЕрдкрдпрд╢,
- рд╢рд┐рд╡рд╛рдп serialisation, retries, timeouts, services рдордзреАрд▓ auth, tracing, versioned contracts, рдЖрдгрд┐ рдЖрддрд╛ рдПрдХрд╛рдЪ transaction рдордзреНрдпреЗ рдирд╕рд▓реЗрд▓рд╛ data (рдзрдбрд╛ 11).
- Distributed monolith тАФ рдЕрд╢рд╛ services рдЬреНрдпрд╛ рдПрдХрддреНрд░рдЪ deploy рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрддрд╛рдд, рдПрдХрдЪ database рд╡рд╛рдЯреВрди рдШреЗрддрд╛рдд, рдХрд┐рдВрд╡рд╛ рд▓рд╛рдВрдм synchronous рд╕рд╛рдЦрд│реНрдпрд╛рдВрдд рдПрдХрдореЗрдХрд╛рдВрдирд╛ call рдХрд░рддрд╛рдд. Network рдЪрд╛ рд╕рдЧрд│рд╛ рдЦрд░реНрдЪ, рд╕реНрд╡рд╛рддрдВрддреНрд░реНрдп рдХрд╛рд╣реАрдЪ рдирд╛рд╣реА.
- Module рдХрдзреА рд╡реЗрдЧрд│рд╛ рдХрд╛рдврд╛рдпрдЪрд╛ (рдХрд┐рдорд╛рди рдПрдХ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг):
- teams тАФ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ рд╡реЗрд│рд╛рдкрддреНрд░рдХрд╛рдиреЗ release рдХрд░рд╛рдпрдЪреА рдЧрд░рдЬ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рд╡реЗрдЧрд│реНрдпрд╛ teams,
- scaling тАФ рдПрдХрд╛ рднрд╛рдЧрд╛рд▓рд╛ рдЦреВрдк рд╡реЗрдЧрд│реА resources рд▓рд╛рдЧрддрд╛рдд (SMS workers 200 рдкрд░реНрдпрдВрдд scale рд╣реЛрддрд╛рдд; API рдирд╛рд╣реА),
- failure isolation тАФ рддрд┐рдерд▓рд╛ crash рдХрд┐рдВрд╡рд╛ overload рдмрд╛рдХреАрдЪреЗ рдЦрд╛рд▓реА рдЖрдгрддрд╛ рдХрд╛рдорд╛ рдирдпреЗ,
- рддрд╕реЗрдЪ: рд╡реЗрдЧрд│реА technology рдХрд┐рдВрд╡рд╛ рдХрдбрдХ security рд╕реАрдорд╛ (payments, рдореБрд▓рд╛рдВрдЪрд╛ data).
- Conway's law тАФ "рд╕рдВрд╕реНрдерд╛ рдЕрд╢рд╛ systems design рдХрд░рддрд╛рдд рдЬреНрдпрд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛ рд╕рдВрд╡рд╛рджрд╛рдЪреНрдпрд╛ рд░рдЪрдиреЗрдЪреА рдирдХреНрдХрд▓ рдХрд░рддрд╛рдд." рдПрдХрд╛ team рдордзреАрд▓ рдЪрд╛рд░ рд▓реЛрдХ рдПрдХ system рдЪрд╛рдВрдЧрд▓реА рдмрд╛рдВрдзрддрд╛рдд. Service рдЪреНрдпрд╛ рд╕реАрдорд╛ team рдЪреНрдпрд╛ рд╕реАрдорд╛рдВрдиреБрд╕рд╛рд░ рдЬрд╛рддрд╛рдд, рддреБрдореНрд╣реА рдард░рд╡рд╛ рдХрд┐рдВрд╡рд╛ рди рдард░рд╡рд╛ тАФ рдореНрд╣рдгреВрди рджреЛрдиреНрд╣реА рдПрдХрддреНрд░ рдЖрдЦрд╛.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдХрд╛рдЧрдж (рдзрдбрд╛ 01) рд╕рд╛рдВрдЧрддреЛ 4 рдЬрдгрд╛рдВрдЪреА team, 3 рдорд╣рд┐рдиреНрдпрд╛рдВрдд launch, 99.9% available, p99 < 200 ms. рдмрд╛рд░рд╛ services latency budget рдЦрд╛рдКрди рдЯрд╛рдХрддреАрд▓, availability рдЙрджреНрджрд┐рд╖реНрдЯрд╛рдЪреНрдпрд╛ рдЦрд╛рд▓реА рдврдХрд▓рддреАрд▓, рдЖрдгрд┐ рдЪрд╛рд░ рд▓реЛрдХрд╛рдВрдирд╛ рдмрд╛рд░рд╛ pipelines, рдмрд╛рд░рд╛ dashboards рдЖрдгрд┐ рдЪрд╛рд▓рд╡рд╛рдпрд▓рд╛ рдПрдХ platform рджреЗрддреАрд▓. Modular monolith рдкреНрд░рддреНрдпреЗрдХ рдЖрдХрдбрд╛ рдкреВрд░реНрдг рдХрд░рддреЛ. рдкрдг рдПрдХрд╛ рднрд╛рдЧрд╛рдХрдбреЗ рдЖрдзреАрдЪ рд╡реЗрдЧрд│реЗ рд░рд╛рд╣рдгреНрдпрд╛рдЪреЗ рдХрд╛рд░рдг рдЖрд╣реЗ: SMS workers (рдзрдбрд╛ 07) рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ scale рд╣реЛрддрд╛рдд рдЖрдгрд┐ рддреНрдпрд╛рдВрдиреА API рдордВрдж рдХрд░рддрд╛ рдХрд╛рдорд╛ рдирдпреЗ. рд╣реЗ рдХрд╛рд░рдгрд╛рд╕рд╣рд┐рдд рд╡рд┐рднрд╛рдЧрдгреЗ рдЖрд╣реЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
design/designs.py рдордзреАрд▓ call_chain(hops, ms_each, availability_each)
latency_ms = hops ├Ч ms_each рдЖрдгрд┐ availability = availability_each ** hops рдкрд░рдд рдХрд░рддреЛ тАФ рдПрдХрд╛ рдУрд│реАрдд
call рдХреЗрд▓реЗрд▓реНрдпрд╛ services, рдкреНрд░рддреНрдпреЗрдХ рдЖрд╡рд╢реНрдпрдХ. design/demo.py рдордзреАрд▓ services()
20 ms рдЖрдгрд┐ 99.9% рд▓рд╛ 1, 3 рдЖрдгрд┐ 8 hops рдЫрд╛рдкрддреЛ. Snippet 99.99% services рдкрдг рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рддреЛ рдЖрдгрд┐
рдкреНрд░рддреНрдпреЗрдХ availability 30 рджрд┐рд╡рд╕рд╛рдВрддреАрд▓ рдмрдВрдж рдорд┐рдирд┐рдЯрд╛рдВрдд рдмрджрд▓рддреЛ.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
python3 design/demo.py services
python3 - <<'EOF'
import sys; sys.path.insert(0, "design"); from designs import call_chain
for a in (0.999, 0.9999):
for hops in (1, 5, 10, 20):
c = call_chain(hops, 20, a)
print(f"each {a:.2%} ┬╖ {hops:>2} hops тЖТ {c['latency_ms']:>3} ms ┬╖ {c['availability']:.3%} ┬╖ down {(1 - c['availability']) * 30 * 24 * 60:6.1f} min / 30 days")
EOF
python3 design/test_design.py
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
services рд╣реЗ рдЫрд╛рдкрддреЛ:
тФАтФА one request that calls services in a line (each 20 ms, each 99.9% available)
1 hops тЖТ 20 ms, availability 99.90%
3 hops тЖТ 60 ms, availability 99.70%
8 hops тЖТ 160 ms, availability 99.20%
start as a MODULAR MONOLITH: one deploy, clear modules; split a service out when a team or a scaling need asks
a 'distributed monolith' = many services that must deploy together тАФ all the cost, none of the benefit
рддреБрдордЪрд╛ snippet рд╣реЗ рдЫрд╛рдкрддреЛ:
each 99.90% ┬╖ 1 hops тЖТ 20 ms ┬╖ 99.900% ┬╖ down 43.2 min / 30 days
each 99.90% ┬╖ 5 hops тЖТ 100 ms ┬╖ 99.501% ┬╖ down 215.6 min / 30 days
each 99.90% ┬╖ 10 hops тЖТ 200 ms ┬╖ 99.004% ┬╖ down 430.1 min / 30 days
each 99.90% ┬╖ 20 hops тЖТ 400 ms ┬╖ 98.019% ┬╖ down 855.8 min / 30 days
each 99.99% ┬╖ 1 hops тЖТ 20 ms ┬╖ 99.990% ┬╖ down 4.3 min / 30 days
each 99.99% ┬╖ 5 hops тЖТ 100 ms ┬╖ 99.950% ┬╖ down 21.6 min / 30 days
each 99.99% ┬╖ 10 hops тЖТ 200 ms ┬╖ 99.900% ┬╖ down 43.2 min / 30 days
each 99.99% ┬╖ 20 hops тЖТ 400 ms ┬╖ 99.800% ┬╖ down 86.3 min / 30 days
Tests рд╢реЗрд╡рдЯреА 18/18 passed рджрд╛рдЦрд╡рддрд╛рдд.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдУрд│реАрддреАрд▓ 99.9% рдЪреНрдпрд╛ рджрд╣рд╛ services рдПрдХрд╛ service рдкреЗрдХреНрд╖рд╛ рд╕реБрдорд╛рд░реЗ рджрд╣рд╛рдкрдЯ рдЬрд╛рд╕реНрдд рд╡реЗрд│ рдмрдВрдж рдЕрд╕рддрд╛рдд (рдорд╣рд┐рдиреНрдпрд╛рд▓рд╛ 430 vs 43 рдорд┐рдирд┐рдЯреЗ), рдЖрдгрд┐ рддреНрдпрд╛ рд╕рдВрдкреВрд░реНрдг 200 ms read budget рдлрдХреНрдд hops рд╡рд░рдЪ рдЦрд░реНрдЪ рдХрд░рддрд╛рдд. 10-hop request 99.9% рд╡рд░ рдареЗрд╡рд╛рдпрдЪрд╛ рддрд░ рдкреНрд░рддреНрдпреЗрдХ service рд▓рд╛ 99.99% рдЧрд╛рдард╛рд╡реЗ рд▓рд╛рдЧреЗрд▓ тАФ рдкреНрд░рддреНрдпреЗрдХрд╛рд╕рд╛рдареА рджрд╣рд╛рдкрдЯ рдХрдареАрдг. Hops рдлреБрдХрдЯ рдирд╕рддрд╛рдд; рдХрд╛рд░рдг рдХрд┐рдорддреАрдЗрддрдХреЗ рдореЛрд▓рд╛рдЪреЗ рдЕрд╕реЗрд▓ рддрд┐рдереЗрдЪ рд╡рд┐рднрд╛рдЧрд╛.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- рдЪрд╛рд░ рдЬрдгрд╛рдВрдЪреНрдпрд╛ team рд╕рд╛рдареА, рдкрд╣рд┐рд▓реНрдпрд╛рдЪ рджрд┐рд╡рд╢реА, "scale рд╕рд╛рдареА рддрдпрд╛рд░ рд░рд╛рд╣рд╛рдпрд▓рд╛" microservices
- рдПрдХрдЪ database рд╡рд╛рдЯреВрди рдШреЗрдгрд╛рд▒реНрдпрд╛ services тАФ рдХреЛрдгрддрд╛рд╣реА schema рдмрджрд▓ рддреНрдпрд╛ рд╕рдЧрд│реНрдпрд╛ рдореЛрдбрддреЛ
- рд▓рд╛рдВрдм synchronous рд╕рд╛рдЦрд│реНрдпрд╛ (A, B рд▓рд╛ call рдХрд░рддреЛ, B C рд▓рд╛, C D рд▓рд╛) тАФ caller рд▓рд╛ рдЙрддреНрддрд░ рдЖрддреНрддрд╛ рдирдХреЛ рдЕрд╕реЗрд▓ рддрд┐рдереЗ events (рдзрдбрд╛ 08) рд╡рд╛рдкрд░рд╛
- business capability рдРрд╡рдЬреА technical layer рдиреБрд╕рд╛рд░ рд╡рд┐рднрд╛рдЧрдгреЗ (рдПрдХ "database service", рдПрдХ "validation service")
- module рд╕реАрдорд╛ рдирд╕рд▓реЗрд▓рд╛ monolith тАФ рдордЧ рддреЛ рдХрдзреАрдЪ рд╡рд┐рднрд╛рдЧрддрд╛ рдпреЗрдд рдирд╛рд╣реА
- рдПрдХрддреНрд░рдЪ release рдХрд░рд╛рд╡реНрдпрд╛ рд▓рд╛рдЧрдгрд╛рд▒реНрдпрд╛ services тАФ distributed monolith
- Conway's law рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖: service рдЪрд╛ рдирдХрд╛рд╢рд╛ рдЖрдгрд┐ team рдЪрд╛ рдирдХрд╛рд╢рд╛ рдЬреБрд│рдд рдирд╛рд╣реАрдд, рдЖрдгрд┐ teams рдЬрд┐рдВрдХрддрд╛рдд
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд
Modular monolith рдореНрд╣рдгрдЬреЗ рдПрдХ folder рд░рдЪрдирд╛ рдЖрдгрд┐ рддрдкрд╛рд╕рд▓рд╛ рдЬрд╛рдгрд╛рд░рд╛ рдПрдХ рдирд┐рдпрдо. Python рдордзреНрдпреЗ рд╕реВрдЪрдирд╛ рдлрд▓рдХ:
notice_board/
тФЬтФАтФА notices/ api.py (public) ┬╖ _db.py ┬╖ _models.py # owns tables: notices, outbox
тФЬтФАтФА parents/ api.py (public) ┬╖ _db.py # owns tables: parents, children
тФЬтФАтФА sms/ api.py (public) ┬╖ worker.py # owns table: sms_sent тАФ the first to split out
тФФтФАтФА reports/ api.py (public)
рдирд┐рдпрдо, CI рдордзреНрдпреЗ import-linter рдиреЗ рддрдкрд╛рд╕рд▓реЗрд▓рд╛ (modules рдлрдХреНрдд рдПрдХрдореЗрдХрд╛рдВрдЪреНрдпрд╛
api рдордзреВрдирдЪ рдмреЛрд▓рддрд╛рдд):
# .importlinter
[importlinter]
root_package = notice_board
[importlinter:contract:modules]
name = modules are independent except through api
type = independence
modules =
notice_board.notices
notice_board.parents
notice_board.sms
notice_board.reports
ignore_imports =
notice_board.* -> notice_board.*.api
рдЦрд▒реНрдпрд╛ account рд╡рд░ тАФ SMS module рдХрдбреЗ рд╕реНрд╡рддрдГрдЪреНрдпрд╛ deploy рдЪреЗ рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдг рдЕрд╕реЗрд▓ рддреЗрд╡реНрд╣рд╛, рддреЛ рдзрдбрд╛ 07 рдордзреАрд▓ queue рд╡рд╛рдЪрдгрд╛рд░реА рд╕реНрд╡рддрдГрдЪреА ECS service (рдХрд┐рдВрд╡рд╛ Lambda) рдмрдирддреЛ, рд╕реНрд╡рддрдВрддреНрд░рдкрдгреЗ scale рд╣реЛрдгрд╛рд░реА:
aws ecs create-service --cluster notice-board --service-name sms-worker \
--task-definition sms-worker:1 --desired-count 2 --launch-type FARGATE \
--network-configuration 'awsvpcConfiguration={subnets=[subnet-0a1b2c3d],securityGroups=[sg-0123abcd]}'
рдЕрдзрд┐рдХ рдЦреЛрд▓рд╛рдд: Kubernetes рд╢рд╛рд│рд╛ рдЕрдиреЗрдХ services рдЪрд╛рд▓рд╡рддреЗ; API Gateway рд╢рд╛рд│рд╛ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рдореЛрд░ рдПрдХ рдореБрдЦреНрдп рджрд░рд╡рд╛рдЬрд╛ рдареЗрд╡рддреЗ.
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: рдкреНрд░рддреНрдпреЗрдХ service рдХрд╛ рдЖрд╣реЗ рддреЗ ADR (рдзрдбрд╛ 16) рдореНрд╣рдгреВрди рд▓рд┐рд╣реВрди рдареЗрд╡рд╛: "sms-worker рд╡реЗрдЧрд│реА рдЖрд╣реЗ рдХрд╛рд░рдг рддреА 200 workers рдкрд░реНрдпрдВрдд scale рд╣реЛрддреЗ рдЖрдгрд┐ рддрд┐рдЪреНрдпрд╛ provider рдЪреЗ outages posting рд╡рд░ рдкрд░рд┐рдгрд╛рдо рдХрд░рддрд╛ рдХрд╛рдорд╛ рдирдпреЗрдд." рд▓рд┐рдЦрд┐рдд рдХрд╛рд░рдг рдирд╕рд▓реЗрд▓реА service рдкрд░рдд рдЬреЛрдбрдгреНрдпрд╛рд╕рд╛рдареА рдЙрдореЗрджрд╡рд╛рд░ рдЕрд╕рддреЗ.
тПня╕П рдкреБрдвреЗ
Services рдЖрдгрд┐ replicas рдореНрд╣рдгрдЬреЗ data рдЪреНрдпрд╛ рдкреНрд░рддреА рдПрдХрд╛рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рдард┐рдХрд╛рдгреА. рд╢рд┐рдХреНрд╖рд┐рдХреЗрдиреЗ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рд╡рд░ рд▓рдЧреЗрдЪ рдкрд╛рд▓рдХрд╛рдиреЗ рд╡рд╛рдЪрд▓реЗ, рддрд░ рддрд┐рд▓рд╛ рдХреЛрдгрддреА рдкреНрд░рдд рджрд┐рд╕рддреЗ? рдирд┐рдпреЛрдЬрди рдХрд╛рд░реНрдпрд╛рд▓рдп рдард░рд╡рддреЗ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдд рдХрд┐рддреА consistent рдЕрд╕рд╛рдпрд▓рд╛ рд╣рд╡реА.
git checkout lesson-10-consistency