ЁЯФА рдзрдбрд╛ 11 тАФ REST рдЪреНрдпрд╛ рдкрд▓реАрдХрдбреЗ: рдЬреЗрд╡реНрд╣рд╛ рдХрд╛рдЙрдВрдЯрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд░рдд рдХреЙрд▓ рдХрд░рддреЛ
ЁЯУН рддреБрдореНрд╣реА рдЗрдереЗ рдЖрд╣рд╛рдд: 12 рдкреИрдХреА рдзрдбрд╛ 11 ┬╖ рдорд╛рдЧреАрд▓: lesson-10-rate-limits-caching ┬╖ рдкреБрдвреАрд▓: lesson-12-testing-docs-gateway
ЁЯУж рдпрд╛ рдмреНрд░рдБрдЪрдордзреНрдпреЗ рдХрд╛рдп рдЖрд╣реЗ
рдзрдбреЗ 01тАУ10, рдЖрдгрд┐ рддреНрдпрд╛рд╕реЛрдмрдд рдХрд╛рдЙрдВрдЯрд░рдЪреЗ рдЗрддрд░ рдЖрдХрд╛рд░ тАФ GraphQL, gRPC, webhooks, events тАФ рдЖрдгрд┐ рддреНрдпрд╛рддрд▓рд╛ рдПрдХ рдирд┐рд╡рдбрдгреНрдпрд╛рдЪрд╛ рдирд┐рдпрдо. рдЦрд▒реНрдпрд╛ files:
- api/webhook_receiver.py тАФ рдЬрд┐рдереЗ рдХрд╛рдЙрдВрдЯрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд░рдд рдХреЙрд▓ рдХрд░рддреЛ, рдЬреЗрдорддреЗрдо рдбрдЭрдирднрд░ рдУрд│реА
- api/api_types.py тАФ рддреЗрдЪ рдкрд╛рдЪ рд╡рд┐рджреНрдпрд╛рд░реНрдереА REST, JSON-RPC, GraphQL, long polling, SSE рдЖрдгрд┐ рдПрдХрд╛ рдЦрд▒реНрдпрд╛ WebSocket рдордзреВрди рджрд┐рд▓реЗ рдЬрд╛рддрд╛рдд
- api/types_client.py тАФ рд╕рд╣рд╛рд╣реА рд╡рд╛рдкрд░реВрди рдкрд╛рд╣рдгрд╛рд░рд╛ рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХ byte рдЫрд╛рдкрдгрд╛рд░рд╛ рдПрдХрдЪ client
ЁЯФА рд╕рдВрдкреВрд░реНрдг рдирдХрд╛рд╢рд╛: рд╣рд╛ рдзрдбрд╛ рдиреЗрд╣рдореА рднреЗрдЯрдгрд╛рд░реЗ рдЪрд╛рд░ рдЖрдХрд╛рд░ рд╢рд┐рдХрд╡рддреЛ. рдЗрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ тАФ SOAP, tRPC, OData, WebRTC, queues, event streams, batch files, рдЖрдгрд┐ network рд▓рд╛ рдХрдзреАрдЪ рди рд╢рд┐рд╡рдгрд╛рд░реЗ APIs (libraries, system calls, database drivers) тАФ рдореНрд╣рдгрдЬреЗ рдзрдбрд╛ 15 тАФ рдкреНрд░рддреНрдпреЗрдХ API рдкреНрд░рдХрд╛рд░: рдПрдХ рдореБрдЦреНрдп рддрдХреНрддрд╛, рдЪрд╛рд░ рдХреБрдЯреБрдВрдмреЗ рдЖрдгрд┐ рдПрдХ рдирд┐рд░реНрдгрдп-рдорд╛рд░реНрдЧрджрд░реНрд╢рди.
ЁЯзТ 5 рд╡рд░реНрд╖рд╛рдВрдЪреНрдпрд╛ рдореБрд▓рд╛рд▓рд╛ рд╕рдордЬрд╛рд╡рд▓реНрдпрд╛рд╕рд╛рд░рдЦреЗ
REST рд╣рд╛ рдХрд╛рдЙрдВрдЯрд░рдЪрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗ: рдирд╛рд╡реЗ рджрд┐рд▓реЗрд▓реЗ drawers, рдард░рд▓реЗрд▓реНрдпрд╛ slips. рдЖрдгрдЦреА рддреАрди рдкреНрд░рдХрд╛рд░ рдЖрд╣реЗрдд, рдЖрдгрд┐ рдкреНрд░рддреНрдпреЗрдХрд╛рдорд╛рдЧреЗ рдЦрд░реЗ рдХрд╛рд░рдг рдЖрд╣реЗ:
- GraphQL ЁЯзй тАФ рдПрдХ рдЦрд┐рдбрдХреА, рдЬрд┐рдереЗ рддреБрдореНрд╣рд╛рд▓рд╛ рдиреЗрдордХреЗ рдХреЛрдгрддреЗ рдбрдмреЗ рд╣рд╡реЗрдд рддреЗ рд▓рд┐рд╣рд┐рддрд╛ ("рд╡рд┐рджреНрдпрд╛рд░реНрдереА 2: рдлрдХреНрдд рдирд╛рд╡ рдЖрдгрд┐ grade, рдЖрдгрд┐ рддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд░реНрдЧрд╛рдЪреА рд╢рд┐рдХреНрд╖рд┐рдХрд╛"). рдПрдХрд╛ screen рд▓рд╛ рдкрд╛рдЪ drawers рдордзрд▓реЗ рддреБрдХрдбреЗ рд╣рд╡реЗ рдЕрд╕рддреАрд▓ рддреЗрд╡реНрд╣рд╛ рдЙрддреНрддрдо; рдкрдг office рд▓рд╛ рдкреНрд░рддреНрдпреЗрдХ slip рд╡рд░ рдЬрд╛рд╕реНрдд рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛рд╡рд╛ рд▓рд╛рдЧрддреЛ.
- gRPC тЪб тАФ рджреЛрди offices рдордзрд▓реА рдЬрд▓рдж рдЕрдВрддрд░реНрдЧрдд рдЦрд┐рдбрдХреА: typed forms
(
.proto), binary, streaming. рдЗрдорд╛рд░рддреАрдЪреНрдпрд╛ рдЖрдд machines рдЪреЗ machines рд╢реА рдмреЛрд▓рдгреЗ, рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рдЙрдВрдЯрд░ рдирд╡реНрд╣реЗ. - Webhooks ЁЯУг тАФ рддреБрдореНрд╣реА рдХрд╛рдЙрдВрдЯрд░рд╡рд░ рддреБрдордЪрд╛ рдлреЛрди рдирдВрдмрд░ рдареЗрд╡рддрд╛
("рд╡рд┐рджреНрдпрд╛рд░реНрдереА рджрд╛рдЦрд▓ рдЭрд╛рд▓рд╛ рдХреА рдорд▓рд╛ рдХреЙрд▓ рдХрд░рд╛"). рддреЗ рдШрдбрд▓реЗ рдХреА office
рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЙрд▓ рдХрд░рддреЗ (рддреБрдордЪреНрдпрд╛ URL рд╡рд░
POST), рддреБрдореНрд╣реА рджрд░ рдкрд╛рдЪ рд╕реЗрдХрдВрджрд╛рд▓рд╛ рд╡рд┐рдЪрд╛рд░рдд рдмрд╕рдгреНрдпрд╛рдРрд╡рдЬреА. - Events / queues ЁЯУм тАФ рдХрд╛рд╣реА рдШрдбрд▓реЗ рдХреА рджрд░ рд╡реЗрд│реА office рдПрдХрд╛ рдХрдкреНрдкреНрдпрд╛рдд рдЪрд┐рдареНрдареА рдЯрд╛рдХрддреЗ; рдХреЛрдгреАрд╣реА рддреЛ рдХрдкреНрдкрд╛ рдирдВрддрд░, рдХреНрд░рдорд╛рдиреЗ рд╡рд╛рдЪреВ рд╢рдХрддреЛ. рдореЛрдареНрдпрд╛ рдкреНрд░рдорд╛рдгрд╛рд╡рд░ "рдШрдбрд▓реЗ рдХреА рдорд▓рд╛ рд╕рд╛рдВрдЧрд╛" рд╕рд╛рдареА, replay рд╕рд╣.
рдирд┐рд╡рдб рдореНрд╣рдгрдЬреЗ рдлреЕрд╢рди рдирд╡реНрд╣реЗ: рдЖрдХрд╛рд░ caller рдиреБрд╕рд╛рд░ рдард░рддреЛ.
ЁЯЧ║я╕П рдЖрдХреГрддреА
flowchart LR
rest["ЁЯЧДя╕П REST<br/>nouns + verbs, cacheable тАФ public, simple"]
gql["ЁЯзй GraphQL<br/>ask for exactly these fields тАФ one UI, many shapes"]
grpc["тЪб gRPC<br/>typed, binary, streaming тАФ service тЖФ service"]
hook["ЁЯУг webhooks<br/>the counter calls you back on events"]
ev["ЁЯУм events / queues<br/>'tell me when', replayable"]
caller["ЁЯзн the shape follows the caller"] --> rest & gql & grpc & hook & ev
тЭУ рдХрд╛рдп
- GraphQL: рдПрдХ endpoint (
POST /graphql), рдПрдХ query рднрд╛рд╖рд╛, рдПрдХ typed schema, рдиреЗрдордХреЗ-рддреЗрд╡рдвреЗрдЪ-fields рдЕрд╕рд▓реЗрд▓реА рдЙрддреНрддрд░реЗ. рдХрд┐рдВрдордд: caching рдЕрд╡рдШрдб рд╣реЛрддреЗ (рдкреНрд░рддреНрдпреЗрдХ resource рд▓рд╛ рд╡реЗрдЧрд│реА URL рдирд╛рд╣реА), рдЖрдгрд┐ рдмреЗрдмрдВрдж queries рдирд╛ depth/cost рдорд░реНрдпрд╛рджрд╛ рд▓рд╛рдЧрддрд╛рдд. - gRPC: HTTP/2 + Protocol Buffers; рдкреНрд░рддреНрдпреЗрдХ рднрд╛рд╖реЗрдд рддрдпрд╛рд░ рд╣реЛрдгрд╛рд░реЗ clients; рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдиреА streaming. рдХрд┐рдВрдордд: browser рдордзреНрдпреЗ рдереЗрдЯ рдЪрд╛рд▓рдд рдирд╛рд╣реА (proxy рд▓рд╛рдЧрддреЛ), curl рдиреЗ рдЪрд╛рд▓рд╡рддрд╛ рдпреЗрдд рдирд╛рд╣реА, рддрд╛рд░реЗрд╡рд░ binary.
- Webhooks: consumer рдПрдХ URL рдиреЛрдВрджрд╡рддреЛ; producer рддреНрдпрд╛рд╡рд░ events
POSTрдХрд░рддреЛ. Consumer рдкреЛрд╣реЛрдЪрдгреНрдпрд╛рдЬреЛрдЧрд╛ рдЕрд╕рд▓рд╛ рдкрд╛рд╣рд┐рдЬреЗ, рддреНрдпрд╛рдиреЗ signature рддрдкрд╛рд╕рд▓реА рдкрд╛рд╣рд┐рдЬреЗ, рдЬрд▓рдж рдЙрддреНрддрд░ (2xx) рджрд┐рд▓реЗ рдкрд╛рд╣рд┐рдЬреЗ рдЖрдгрд┐ retries рдЖрдгрд┐ duplicates рд╕рд╣рди рдХреЗрд▓реЗ рдкрд╛рд╣рд┐рдЬреЗрдд (handling idempotent рдХрд░рд╛ тАФ рдкреБрдиреНрд╣рд╛ рдзрдбрд╛ 07). - Events: рдПрдХ log рдХрд┐рдВрд╡рд╛ queue (Kafka, SQS, RabbitMQ); consumers рдЖрдкрд╛рдкрд▓реНрдпрд╛ рдЧрддреАрдиреЗ pull рдХрд░рддрд╛рдд, рдХреНрд░рдо рдЖрдгрд┐ replay рд╕рд╣. Server-sent events (SSE) рдЖрдгрд┐ WebSockets browsers рдХрдбреЗ stream рдХрд░рддрд╛рдд.
- Polling рдЪреА рдЬрд╛рдЧрд╛ рд╣реЗ рд╕рдЧрд│реЗ рдШреЗрддрд╛рдд: рджрд░ N рд╕реЗрдХрдВрджрд╛рд▓рд╛ "рдХрд╛рд╣реА рдирд╡реАрди?" тАФ рд╣рдЬрд╛рд░реЛ рд░рд┐рдХрд╛рдореА рдЙрддреНрддрд░реЗ, рдЖрдгрд┐ рддрд░реАрд╣реА рдЙрд╢реАрд░. Long polling рд╣рд╛ рдкреНрд░рд╛рдорд╛рдгрд┐рдХ рдордзрд▓рд╛ рдорд╛рд░реНрдЧ: рдПрдХ request, рдЬреА рдмрд╛рддрдореА рдпреЗрдИрдкрд░реНрдпрдВрдд server рдзрд░реВрди рдареЗрд╡рддреЛ.
- SSE (
text/event-stream) рд╣рд╛ рдПрдХрджрд┐рд╢реА stream: server рдПрдХрд╛ рдЙрдШрдбреНрдпрд╛ connection рд╡рд░реВрдиid/event/dataframes рдкрд╛рдард╡рддреЛ, рдЖрдгрд┐ browsersLast-Event-IDрд╡рд╛рдкрд░реВрди рд╕реНрд╡рддрдГрд╣реВрди рдкреБрдиреНрд╣рд╛ рдЬреЛрдбрддрд╛рдд. WebSocket рдПрдХрд╛ HTTP request рдЪреЗ (101 Switching Protocols) рдПрдХрд╛ socket рдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░ рдХрд░рддреЗ, рдЬреЛ рджреЛрдиреНрд╣реА рдмрд╛рдЬреВ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛рдд тАФ chat, cursors, live dashboards. - рдпрд╛рдЪ рдХреБрдЯреБрдВрдмрд╛рдд рдЖрдгрдЦреА (рдкреНрд░рддреНрдпреЗрдХ API рдкреНрд░рдХрд╛рд░ рдзрдбрд╛ 15 рдкрд╛рд╣рд╛): SOAP/XML-RPC тАФ banking рдордзреНрдпреЗ рднреЗрдЯрдгрд╛рд░рд╛ рдиреЛрдЯрд░реА рдХреЗрд▓реЗрд▓рд╛ рд▓рд┐рдлрд╛рдлрд╛; tRPC тАФ рдПрдХрд╛ TypeScript codebase рдордзрд▓реЗ typed calls; OData тАФ query рднрд╛рд╖рд╛ рдЕрд╕рд▓реЗрд▓реЗ REST; WebRTC тАФ media рд╕рд╛рдареА peer to peer; batch file drops (SFTP, CSV) тАФ payroll рдЖрдгрд┐ banking рдЖрдЬрд╣реА рд▓рд╛рдЦреЛ rows рдЕрд╢рд╛рдЪ рд╣рд▓рд╡рддрд╛рдд; рдЖрдгрд┐ network рдирд╕рд▓реЗрд▓реЗ APIs: libraries/SDKs, system calls, database drivers.
ЁЯдФ рдХрд╛
рдХрд╛рд░рдг рдЯреАрдореНрд╕ рдлреЕрд╢рди рдкрд╛рд╣реВрди рдЖрдХрд╛рд░ рдирд┐рд╡рдбрддрд╛рдд рдЖрдгрд┐ рд╡рд░реНрд╖рд╛рдиреБрд╡рд░реНрд╖реЗ рддреНрдпрд╛рдЪреА рдХрд┐рдВрдордд рдореЛрдЬрддрд╛рдд: рджреЛрди endpoints рдЕрд╕рд▓реЗрд▓реНрдпрд╛ service рд╕рд╛рдареА GraphQL API, browsers рдирд╛ call рдХрд░рд╛рдпрдЪрд╛ рдЕрд╕рд▓реЗрд▓реНрдпрд╛ public API рд╕рд╛рдареА gRPC, рдЬрд┐рдереЗ webhook рдлрдХреНрдд рдПрдХрд╛ рдиреЛрдВрджрдгреАрдЪреНрдпрд╛ рдЕрдВрддрд░рд╛рд╡рд░ рд╣реЛрддрд╛ рддрд┐рдереЗ polling. рдЪрд╛рд░ рдЖрдХрд╛рд░ рдЖрдгрд┐ рдПрдХ рдирд┐рдпрдо рдорд╛рд╣реАрдд рдЕрд╕рд▓рд╛, рдХреА рдирд┐рд╡рдб рдмрд╣реБрддреЗрдХ рд╡реЗрд│рд╛ рдЙрдШрдб рдЕрд╕рддреЗ.
ЁЯФз рдХрд╕реЗ (рдпрд╛ repo рдордзреНрдпреЗ)
POST /v1/webhooks {"url": тАж} рдПрдХ URL рдиреЛрдВрджрд╡рддреЛ; school_api.py рдордзрд▓рд╛ notify()
рдпрд╢рд╕реНрд╡реА рдкреНрд░рд╡реЗрд╢рд╛рдирдВрддрд░ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдВрджрд╡рд▓реЗрд▓реНрдпрд╛ URL рд╡рд░ student.created event POST рдХрд░рддреЛ
тАФ рдЖрдгрд┐ рдЕрдкрдпрд╢ рдЧрд┐рд│реВрди рдЯрд╛рдХрддреЛ, рдХрд╛рд░рдг рдмрдВрдж рдкрдбрд▓реЗрд▓реНрдпрд╛ webhook рдореБрд│реЗ рдХрд╛рдЙрдВрдЯрд░ рдХрдзреАрдЪ
рдмрд┐рдШрдбрддрд╛ рдХрд╛рдорд╛ рдирдпреЗ. api/webhook_receiver.py рд╣реА рджреБрд╕рд░реА рдмрд╛рдЬреВ рдЖрд╣реЗ: рдЬреЗ рдпреЗрддреЗ рддреЗ
рдЫрд╛рдкрдгрд╛рд░рд╛ 15 рдУрд│реАрдВрдЪрд╛ server.
ЁЯзк рдХрд░реВрди рдкрд╛рд╣рд╛
# A) six shapes, one dataset тАФ REST ┬╖ JSON-RPC ┬╖ GraphQL ┬╖ long polling ┬╖ SSE ┬╖ WebSocket
python3 api/api_types.py & # :8081
python3 api/types_client.py # every byte of all six, printed
# read the differences: whole resource vs chosen fields vs an error inside a 200 vs a held request vs a stream vs a socket
# B) the webhook, from both sides:
python3 api/webhook_receiver.py & # terminal 3: your phone rings here on :9090
B=http://127.0.0.1:8080/v1; K='X-API-Key: hall-pass-123'; J='Content-Type: application/json'
curl -s -X POST $B/webhooks -H "$J" -d '{"url":"http://127.0.0.1:9090/hook"}'
curl -s -X POST $B/students -H "$K" -H "$J" -d '{"name":"Zoya","class":"3B"}' > /dev/null
# terminal 3 prints: ЁЯУг webhook received: {'event': 'student.created', 'student': {...}}
kill %1 # now the receiver is dead тАФ
curl -s -X POST $B/students -H "$K" -H "$J" -d '{"name":"Yash","class":"3A"}' | head -c 80 # still 201: the counter survives
тЬЕ рддрдкрд╛рд╕рд╛ тАФ рддреБрдореНрд╣рд╛рд▓рд╛ рдХрд╛рдп рджрд┐рд╕рд╛рдпрд▓рд╛ рд╣рд╡реЗ
types_client.py рдирд╛рд╡реЗ рджрд┐рд▓реЗрд▓реЗ рд╕рд╣рд╛ рд╡рд┐рднрд╛рдЧ рдЫрд╛рдкрддреЛ рдЖрдгрд┐ тЬЕ six shapes, one dataset рдиреЗ рд╕рдВрдкрддреЛ: REST рдкреВрд░реНрдг resources рдкрд░рдд рджреЗрддреЗ, JSON-RPC error рдПрдХрд╛ 200 рдЪреНрдпрд╛ рдЖрдд рдкрд░рдд рджреЗрддреЗ, GraphQL рдлрдХреНрдд рддреБрдореНрд╣реА рд╕рд╛рдВрдЧрд┐рддрд▓реЗрд▓реЗ fields рджреЗрддреЗ, long polling ~0.4 s рдЙрд╢рд┐рд░рд╛ рдПрдХрд╛ event рд╕рд╣ рдЙрддреНрддрд░ рджреЗрддреЗ, SSE id:/event:/data: frames рдЫрд╛рдкрддреЗ (рдЖрдгрд┐ рддреБрдореНрд╣реА Last-Event-ID: 0 рдкрд╛рдард╡рд▓реНрдпрд╛рд╡рд░ рдЗрддрд┐рд╣рд╛рд╕ replay рдХрд░рддреЗ), рдЖрдгрд┐ WebSocket рджреЛрдиреНрд╣реА рджрд┐рд╢рд╛рдВрдиреА echo рдХрд░рдгреНрдпрд╛рдЖрдзреА 101 Switching Protocols рджрд╛рдЦрд╡рддреЗ.
Receiver рдирд╡реНрдпрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереНрдпрд╛рд╕рд╣ рдПрдХ ЁЯУг webhook received рдУрд│ рдЫрд╛рдкрддреЛ; рддреБрдореНрд╣реА рддреЛ рдмрдВрдж рдХреЗрд▓реНрдпрд╛рд╡рд░рд╣реА рдкреБрдврдЪрд╛ рдкреНрд░рд╡реЗрд╢ 201 рдЪ рджреЗрддреЛ рдЖрдгрд┐ server рдЪреНрдпрд╛ log рдордзреНрдпреЗ webhook тАж failed рджрд┐рд╕рддреЗ тАФ рдЕрдкрдпрд╢реА callback рдореБрд│реЗ рдХрд╛рдЙрдВрдЯрд░ рдХрдзреАрдЪ рдмрд┐рдШрдбрдд рдирд╛рд╣реА.
ЁЯПБ рддреБрдореНрд╣реА рдЖрддреНрддрд╛рдЪ рдХрд╛рдп рд╕рд┐рджреНрдз рдХреЗрд▓реЗ
рдХрд╛рдЙрдВрдЯрд░ рддреБрдореНрд╣рд╛рд▓рд╛ рдкрд░рдд рдХреЙрд▓ рдХрд░реВ рд╢рдХрддреЛ, рдЖрдгрд┐ webhooks рдЪреЗ рджреЛрди рдирд┐рдпрдо рддреБрдореНрд╣реА рджреЛрдиреНрд╣реА рдмрд╛рдЬреВрдВрдиреА рдкрд╛рд╣рд┐рд▓реЗ: producer рдХрдзреАрдЪ consumer рд╕рд╛рдареА рдЕрдбрдХреВрди рд░рд╛рд╣рдд рдирд╛рд╣реА, рдЖрдгрд┐ consumer рдиреЗ retries рдЪреА рдЕрдкреЗрдХреНрд╖рд╛ рдареЗрд╡рд▓реАрдЪ рдкрд╛рд╣рд┐рдЬреЗ.
тЪая╕П рдиреЗрд╣рдореАрдЪреНрдпрд╛ рдЪреБрдХрд╛
- signature рд╢рд┐рд╡рд╛рдп webhooks тАФ рдХреЛрдгреАрд╣реА рддреБрдордЪреНрдпрд╛ URL рд╡рд░ рдЦреЛрдЯреЗ events
POSTрдХрд░реВ рд╢рдХрддреЛ 2xxрдЙрддреНрддрд░ рджреЗрдгреНрдпрд╛рдЖрдзреА рдХрд╛рдо рдХрд░рдгрд╛рд░рд╛ webhook handler тАФ рдЖрдзреА рдЬрд▓рдж рдЙрддреНрддрд░ рджреНрдпрд╛, рдХрд╛рдо рдирдВрддрд░ рдХрд░рд╛ (queue)- exactly-once delivery рдЧреГрд╣реАрдд рдзрд░рдгреЗ тАФ event id рд╡рд░реВрди duplicates рдХрд╛рдврд╛
- query depth/cost рдорд░реНрдпрд╛рджрд╛ рдирд╕рд▓реЗрд▓реЗ GraphQL тАФ рдПрдХрдЪ query denial of service рдард░реВ рд╢рдХрддреЗ
- рдереЗрдЯ browsers рдХрдбреЗ gRPC тАФ рд╢реЗрд╡рдЯреА рддреБрдореНрд╣рд╛рд▓рд╛ REST proxy рд▓рд┐рд╣рд╛рд╡рд╛рдЪ рд▓рд╛рдЧреЗрд▓
ЁЯПн рдкреНрд░рддреНрдпрдХреНрд╖ рд╡рд╛рдкрд░рд╛рдд рд╣реЗ рдХрд╛ рдорд╣рддреНрддреНрд╡рд╛рдЪреЗ: payments, CI systems рдЖрдгрд┐ chat platforms рд╕рдЧрд│реЗ рдирд┐рдХрд╛рд▓ webhook рдиреЗ рдкреЛрд╣реЛрдЪрд╡рддрд╛рдд; рдЕрдВрддрд░реНрдЧрдд microservices gRPC рдмреЛрд▓рддрд╛рдд; screens endpoints рдкреЗрдХреНрд╖рд╛ рдореЛрдареЗ рдЭрд╛рд▓реЗ рдХреА product UIs GraphQL рд╕реНрд╡реАрдХрд╛рд░рддрд╛рдд. рднрд╛рдЧреАрджрд╛рд░ рдХреЛрдгрддрд╛ рдЖрдХрд╛рд░ рд╡рд╛рдкрд░рддреЛ тАФ рдЖрдгрд┐ рдХрд╛ тАФ рд╣реЗ рдУрд│рдЦрдгреЗ рд╣реЗ рд░реЛрдЬрдЪреЗ рдХреМрд╢рд▓реНрдп рдЖрд╣реЗ.
тПня╕П рдкреБрдвреЗ
рд╢реЗрд╡рдЯрдЪрд╛ рдЯрдкреНрдкрд╛: contract tests, рдХреЕрдЯрд▓реЙрдЧрдордзреВрди docs, рдЖрдгрд┐ рд╢рд╛рд│реЗрдЪреЗ рдЧреЗрдЯ (API gateway) рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рдЙрдВрдЯрд░рд╕рдореЛрд░.
git checkout lesson-12-testing-docs-gateway