ბიბლიოთეკა
00/07 · ~38 წთ
GUIDEDECK · როცა აპლიკაცია შემდეგ მოთხოვნას ვერ დაელოდება

WebSockets და
რეალური დრო,
push და არა polling.

38-წუთიანი სამუშაო სესია იმაზე, თუ როგორ მიეწოდოს მონაცემები იმ წამსვე, როცა ისინი იცვლება — WebSocket-ის handshake და ფრეიმები, კავშირის სასიცოცხლო ციკლი, რომელსაც თავად უნდა მართავდეთ (heartbeat, ხელახლა დაკავშირება), pub/sub და presence პატერნები, რომლებზეც რეალური დროის აპლიკაციები დგას, როგორ გავმასშტაბდეთ ბევრ სერვერზე ბექფლეინით და როდის არის უფრო მსუბუქი ტრანსპორტი (SSE, long-polling, WebRTC) სწორი არჩევანი — იმ რეალურ ბიბლიოთეკებთან და მართულ სერვისებთან ერთად, რომლებსაც მართლა გამოიყენებთ.

~38 წთბექენდი / ფულ-სტეკიპროტოკოლი
გადაახვიეთ
01 · რატომ რეალური დრო და რატომ არა პოლინგი 4 წთ

ვები pull-ისთვის აიგო;
რეალური დრო კი push-ია.

ჩვეულებრივი HTTP მოთხოვნა/პასუხია: კლიენტი ეკითხება, სერვერი პასუხობს, კავშირი იხურება. ეს იდეალურია გვერდის ჩასატვირთად — და არასწორია ყველაფრისთვის, რაც თავისით იცვლება. ჩატი, ცოცხალი დაშბორდები, მრავალმოთამაშიანი კურსორები, შეკვეთის თვალყურის დევნება, შეტყობინებები: ჯერ სერვერმა იცის, ამიტომ სერვერმა უნდა ილაპარაკოს პირველმა.

რეალური დრო აქ ნიშნავს სერვერის ინიციატივით გამოგზავნილ, დაბალი შეყოვნების განახლებებს: სერვერი მონაცემებს იმ წამსვე აგზავნის, როცა ისინი იცვლება, იმის ნაცვლად, რომ კლიენტი ისევ და ისევ ეკითხებოდეს. ზღვარი არის „ცოცხლად აღიქმება“ — ჩვეულებრივ რამდენიმე ასეულ მილიწამზე ნაკლები ბოლოდან ბოლომდე.

პოლინგი: რეალური დროის იმიტაცია მოთხოვნა/პასუხზე

მოკლე პოლინგი — ისევ და ისევ კითხვა
// re-ask on a timer, hope something changed setInterval(async () => { const r = await fetch('/api/messages') render(await r.json()) }, 3000) // ✕ up to 3s late · ✕ mostly empty replies // ✕ N clients = N× constant request load
WebSocket — ერთი კავშირი, სერვერი აგზავნის
// open once; receive the moment data changes const ws = new WebSocket('wss://api.app/feed') ws.onmessage = (e) => render(JSON.parse(e.data)) // ✓ instant · ✓ no wasted round-trips // ✓ full-duplex: client can send too
SHORT POLLING ∅ ∅ ∅ ∅ data 4 wasted trips, then late by up to one interval PUSH (WebSocket) open data ▸ pushed

პოლინგის საშუალო შეყოვნება ინტერვალის ნახევარია და პასუხების უმეტესობა ცარიელია. push კი ერთხელ მოდის — ზუსტად მაშინ, როცა გასაგზავნი რამ არის.

რა ჯდება პოლინგი სინამდვილეში

  • შეყოვნება — საშუალოდ თქვენი ინტერვალის ნახევარი; შეამოკლებთ და ფუჭი სამუშაო გაიზრდება.
  • ფუჭი სამუშაო — პასუხების უმეტესობა 304/ცარიელია, მაგრამ მაინც ჯდება შემოვლა და ბაზაზე მიმართვა.
  • სერვერის დატვირთვა — იზრდება როგორც კლიენტები × სიხშირე, მაშინაც კი, როცა არაფერი იცვლება.
  • ბატარეა და ტრაფიკი — მუდმივი მოთხოვნები მობილურ მოწყობილობებს წურავს.

თითქოს  ყოველ წუთს რეკავთ სამზარეულოში და კითხულობთ, ვახშამი მზად არის თუ არა — იმის ნაცვლად, რომ მზარეულმა თავად დაგირეკოთ, როგორც კი მზად იქნება.

02 · handshake და გადაცემის ფორმატი 6 წთ

WebSocket სიცოცხლეს იწყებს როგორც
HTTP მოთხოვნა — მერე კი პროტოკოლს იცვლის.

WebSocket-ს ცარიელ ადგილას ვერ გახსნით. ის იწყება ჩვეულებრივი HTTP GET-ით, რომელსაც Upgrade ჰედერი მოაქვს; თუ სერვერი დათანხმდა, იგივე TCP კავშირი წყვეტს HTTP-ზე საუბარს და WebSocket-ის პროტოკოლზე გადადის — სრულ დუპლექსში, სადაც ორივე მხარეს ნებისმიერ დროს შეუძლია გაგზავნა.

WebSocket-ის პროტოკოლი (RFC 6455) ერთ TCP სოკეტზე ერთ ხანგრძლივ, ორმხრივ კავშირს გაძლევთ. URL-ები ws://-ს იყენებს, ან TLS-ზე — wss://-ს; პროდაქშენში ყოველთვის ამჯობინეთ wss (დაშიფრულია და ბევრად უფრო სავარაუდოა, რომ პროქსებს გაუძლოს).
// კლიენტი ითხოვს პროტოკოლის შეცვლას GET /feed HTTP/1.1 Host: api.app Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13 // სერვერი თანხმდება — და სოკეტი უკვე ღიაა HTTP/1.1 101 Switching Protocols Upgrade: websocket Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

101-ის შემდეგ: ფრეიმები და არა მოთხოვნები

  • მონაცემები პატარა ფრეიმებით მოძრაობს და თითოეულს თავისი opcode აქვს: text, binary, ping, pong ან close.
  • ფრეიმები პაწაწინაა — 2-ბაიტიანი ჰედერი მოკლე შეტყობინებებისთვის, არც URL, არც ქუქიები, არც ჰედერების ხელახლა გაგზავნა. სწორედ ამიტომაა ისინი იაფი.
  • ბრაუზერი→სერვერი ფრეიმები მასკირებულია (უსაფრთხოების წესი); ამას ხელით არასდროს აკეთებთ.
  • დიდი შეტყობინება შეიძლება დაიფრაგმენტოს რამდენიმე ფრეიმად და ისევ აიკრიფოს — თქვენ მაინც ერთ onmessage-ს იღებთ.
FIN + opcode
mask + სიგრძე
mask კოდი
დატვირთვა
ჰედერის ორიოდე ბაიტი
მონაცემები

ფრეიმი ძირითადად დატვირთვაა: ორიოდე ბაიტი ჰედერი და შემდეგ თქვენი ბაიტები. შეტყობინებაზე HTTP-ის ზედნადები არ არის.

03 · კავშირის სასიცოცხლო ციკლი 6 წთ

სოკეტს აქვს სასიცოცხლო ციკლი —
და ის აუცილებლად გაწყდება.

ხანგრძლივი კავშირი იმდენადვე ტვირთია, რამდენადაც ფუნქციონალი: ლეპტოპები იძინებენ, Wi-Fi კრთება, ტელეფონები ქსელს იცვლიან და პროქსები ჩუმად წყვეტენ უქმ კავშირებს. რეალური დროის კოდი ძირითადად სწორედ ამის გადატანაზეა — მკვდარი სოკეტის სწრაფად შემჩნევასა და ქსელში სუფთად დაბრუნებაზე.

ბრაუზერი ოთხ მოვლენას გაძლევთ — open, message, close, error. ის ორი კი, რომლებზეც აპლიკაციის საიმედოობის შეგრძნება დგას, თქვენ თვითონ უნდა დაამატოთ: heartbeat (მკვდარი არხის შესამჩნევად) და ხელახლა დაკავშირება backoff-ით (რომ სერვერს ჯოგად არ დაერიოთ).

ბედნიერი გზა ერთი ნახტომია; ნამდვილი სამუშაო კი ციკლია — დახურული → ხელახალი კავშირი → (backoff-ის პაუზის შემდეგ) → ვუკავშირდები.

heartbeat — მკვდარი არხის შემჩნევა

// ping on a timer; expect a pong back
setInterval(() => ws.send('{"t":"ping"}'), 15_000)

// no pong within a few seconds?
// the socket is half-open — treat it as dead
// and trigger a reconnect.

ხელახლა დაკავშირება — შეიცადეთ, ჯოგად ნუ დაერევით

let wait = 1_000
ws.onclose = () => {
  setTimeout(connect, wait)
  // exponential backoff, capped + jittered
  wait = Math.min(wait * 2, 30_000)
}
რატომ არის ორივე მნიშვნელოვანი: heartbeat-ის გარეშე „ნახევრად ღია“ სოკეტი ცოცხალი ჩანს, მაგრამ ჩუმად კარგავს შეტყობინებებს; backoff-ის გარეშე კი ყველა კლიენტი, რომელიც ავარიის შემდეგ ერთდროულად უკავშირდება, საკუთარი ხელით მოწყობილი DDoS ხდება იმ წამსვე, როცა სერვერი ფეხზე დადგება.
04 · პატერნები, რომლებზეც რეალური დრო დგას 6 წთ

ერთი მოვლენა, ბევრი მსმენელი.

რეალური დროის აპლიკაციები ძალიან იშვიათად არის ერთი-ერთთან. მთავარი ფორმა არის publish/subscribe: კლიენტები ერთვებიან დასახელებულ არხზე და როცა რამე ხდება, სერვერი ამას ყველა გამომწერს ავრცელებს — ისე, რომ გამომცემმა არც კი იცის, ვინ უსმენს.

Pub/sub — გამომცემი აგზავნის არხში (იგივე ოთახი / თემა); ამ არხის ყოველი გამომწერი იღებს მას. Presence ზემოდან დამატებული აღრიცხვაა: ვინ არის ამჟამად არხში, პლუს შემოსვლა/გასვლის (და „ბეჭდავს…“) მოვლენები.

ერთხელ გამოაქვეყნეთ არხში; სერვერი მას ყველა მიმდინარე გამომწერს ავრცელებს. გამომცემი მიმღებებს არასდროს ასახელებს.

არხები / ოთახები

მიმართეთ ქვეჯგუფს

დააჯგუფეთ სოკეტები სახელის ქვეშ (room:42, user:7), რომ გავრცელება ზუსტად სწორ კლიენტებამდე მივიდეს — და არა ყველასთან, ვინც დაკავშირებულია.

presence

ვინ არის აქ ახლა

აღრიცხეთ არხის წევრობა და გამოსცემით შემოსვლა/გასვლა. ამაზე დგას „3 ადამიანი ონლაინ“, ავატარები და ცოცხალი „ბეჭდავს…“ ინდიკატორები.

უკუწნევა

ნელი კლიენტები არსებობს

მომხმარებელი, რომელიც ვერ ეწევა, არჩევანის წინაშე გაყენებთ: დააბუფეროთ (მეხსიერების რისკი), ჩააგდოთ (დანაკარგი) ან გათიშოთ. გადაწყვიტეთ გააზრებულად, თითოეული არხისთვის.

// server (Socket.IO rooms)
socket.join('room:42')
io.to('room:42').emit('message', payload)
// only sockets that joined room:42 receive it
05 · მასშტაბირება მრავალ სერვერზე 6 წთ

ბევრი სერვერი, ერთი საუბარი.

ერთ პროცესს ათიათასობით სოკეტის დაჭერა შეუძლია, მაგრამ ადრე თუ გვიან ერთზე მეტს გაუშვებთ. სწორედ მაშინ ტყდება გულუბრყვილო გავრცელება: ერთი ჩატის ორი მომხმარებელი შეიძლება სხვადასხვა სერვერზე იყოს დაკავშირებული და ერთზე გამოქვეყნებული შეტყობინება მეორემდე ვერასდროს მივა.

რეალური დროის მასშტაბირების მთავარი პრობლემა: სერვერ A-ზე გამოქვეყნებული შეტყობინება უნდა მივიდეს გამომწერამდე, რომელიც სერვერ B-ზეა დაკავშირებული. გამოსავალი არის ბექფლეინი — საერთო pub/sub მაგისტრალი (Redis, NATS, Kafka), რომელიც ყოველ შეტყობინებას თქვენს ნოუდებს შორის გადასცემს, ისე რომ ისინი ერთივით მოქმედებენ.

სერვერ A-ზე მისული შეტყობინება Redis-ში ქვეყნდება, ის კი მას სერვერ B-ს აწვდის — ასე რომ B-ს კლიენტებიც ხედავენ. ყოველი ნოუდი აქვეყნებს და ერთდროულად გამომწერიცაა.

1
მიბმული სესიები
სოკეტი მდგომარეობიანია — დაიტოვეთ თითოეული კლიენტი თავის სერვერზე.
+
  • WebSocket ერთ პროცესში ცხოვრობს; დატვირთვის ბალანსერმა კლიენტი უნდა მიაბას იმ სერვერს, რომელსაც დაუკავშირდა (IP ჰეშით ან ქუქით).
  • მიბმის გარეშე ხელახალი დაკავშირება შეიძლება სესიის შუაში სხვა ნოუდზე მოხვდეს და მეხსიერებაში არსებული მდგომარეობა დაკარგოს.
2
ბექფლეინი
საერთო მაგისტრალი, რომ ნებისმიერმა ნოუდმა ნებისმიერ კლიენტს მიაღწიოს.
+
  • Redis pub/sub — ყველაზე მარტივი და ყველაზე გავრცელებული; შესანიშნავია გავრცელებისთვის, შენახვის გარეშე.
  • NATS — მსუბუქი, ძალიან სწრაფი, სწორედ ამისთვის აგებული.
  • Kafka — როცა მდგრადობა/ხელახალი გათამაშებაც გჭირდებათ, მაღალი საოპერაციო ღირებულების ფასად.
3
კავშირების ლიმიტები
თითოეული სოკეტი ფაილის დესკრიპტორსა და მეხსიერებას ჯდება.
+
  • მოარგეთ ოპერაციული სისტემის ლიმიტები (ფაილის დესკრიპტორები) და დაგეგმეთ მეხსიერება თითო კავშირზე.
  • უქმი კავშირებიც ჯდება — heartbeat-ები და გონივრული ტაიმაუტები რაოდენობას პატიოსნად ინარჩუნებს.
4
presence მასშტაბში
წევრობა უნდა იყოს საერთო და არა თითო ნოუდის.
+
  • „ვინ არის ონლაინ“ ერთი პროცესის მეხსიერებაში ვეღარ იცხოვრებს, როცა ბევრი გყავთ — შეინახეთ ის საერთო საცავში (Redis).
  • ეს ერთ-ერთი მთავარი მიზეზია, რის გამოც გუნდები რეალური დროის მართულ სერვისს ირჩევენ და თავად აღარ აშენებენ.

ამის უმეტესობა — მიბმა, ბექფლეინი, presence, კავშირების ლიმიტები — ზუსტად ის არის, რასაც რეალური დროის მართული სერვისი თქვენს ნაცვლად აგვარებს. ააშენეთ თავად, როცა კონტროლი გჭირდებათ; იყიდეთ, როცა ურჩევნიათ, რომ პროდუქტი გაუშვათ.

06 · როდის არ გამოვიყენოთ WebSocket 5 წთ

WebSocket ყოველთვის არ არის პასუხი.

სრულ დუპლექსიანი სოკეტი ძლიერია, მაგრამ მისი მართვა მძიმეა. სამი სხვა ტრანსპორტი რეალური დროის ბევრ საჭიროებას გაცილებით ნაკლები საოპერაციო წონით ფარავს — და ერთი მათგანი (SSE) სწორი ნაგულისხმევია ყველაზე გავრცელებული შემთხვევისთვის: სერვერი→კლიენტი ნაკადებისთვის.

შეარჩიეთ ტრანსპორტი თქვენი მონაცემების მიმართულებისა და ფორმის მიხედვით და არა მოდის მიხედვით. ორმხრივი და ხშირი → WebSocket. ცალმხრივი სერვერი→კლიენტი → SSE. მედია ან peer-to-peer → WebRTC. მტრულ პროქსს მიღმა გაჭედილი → დაბრუნდით long-polling-ზე.

Server-Sent Events — ცალმხრივი, ჩვეულებრივ HTTP-ზე

const es = new EventSource('/api/stream')
es.onmessage = (e) => render(e.data)
// auto-reconnect is built in. text only.
დადებითი
უკიდურესად მარტივია, ჩვეულებრივ HTTP-ზე დადის და მოვლენის იდენტიფიკატორით ავტომატურად უკავშირდება ხელახლა.
უარყოფითი
მხოლოდ სერვერი→კლიენტი, მხოლოდ ტექსტი; ძველი HTTP/1 დომენზე ერთდროული კავშირების რაოდენობას ზღუდავს.

გამოიყენეთ, როცა: შეტყობინებები, ცოცხალი ანგარიში, პროგრესი, ლოგებისა და AI ტოკენების ნაკადები — ყველაფერი, რაც კლიენტს მხოლოდ მისაღებად სჭირდება.

long-polling — უნივერსალური სარეზერვო გზა

კლიენტი აგზავნის მოთხოვნას, რომელსაც სერვერი ღიად იჭერს, სანამ მონაცემი არ გაჩნდება (ან ტაიმაუტი არ დადგება), შემდეგ კი მაშინვე ხელახლა ითხოვს. ეს push-ს მხოლოდ ჩვეულებრივი HTTP-ით ბაძავს.

დადებითი
ფაქტობრივად ყველგან მუშაობს — სპეციალური პროტოკოლი არ სჭირდება, ძველ პროქსებსა და ფაირვოლებში თავისუფლად გადის.
უარყოფითი
უფრო მაღალი შეყოვნება და ზედნადები ყოველი მოთხოვნის ხელახლა დამყარებისგან; ეს თავსებადობის სარეზერვო გზაა და არა მიზანი.

გამოიყენეთ, როცა: მხარდაჭერის მინიმალური ზღვარი გჭირდებათ; Socket.IO-ს მსგავსი ბიბლიოთეკები მას ავტომატურად იყენებენ, როცა WebSockets დაბლოკილია.

WebRTC — peer-to-peer მედია და მონაცემები

პირდაპირი ბრაუზერიდან ბრაუზერამდე არხები აუდიოსთვის, ვიდეოსთვის და დაბალი შეყოვნების მონაცემებისთვის — სერვერი ძირითადად მხოლოდ ეხმარება მხარეებს, რომ ერთმანეთი იპოვონ (სიგნალინგი).

დადებითი
ყველაზე დაბალი შეყოვნება და P2P (ტრაფიკი თქვენს სერვერს გვერდს უვლის); სპეციალურად მედიისთვისაა აგებული.
უარყოფითი
რთულია — სჭირდება სიგნალინგი და STUN/TURN სერვერები, რომ NAT-ებსა და ფაირვოლებს გაარღვიოს.

გამოიყენეთ, როცა: ვიდეო- და ხმოვანი ზარები, ეკრანის გაზიარება ან P2P თამაშები, სადაც ყოველი მილიწამი ითვლება.

დაიწყეთ საჭიროებიდან: „ცოცხალი“ ფუნქციების უმეტესობა ცალმხრივია და SSE საკმარისია; WebSocket-ს მაშინ მიმართეთ, როცა კლიენტმაც უნდა ილაპარაკოს.

07 · ინსტრუმენტები, აგება vs ყიდვა და შეჯამება 5 წთ

ინსტრუმენტები, რომლებსაც მართლა მიმართავთ.

RFC 6455-ს ხელით იშვიათად წერთ. ნამდვილი არჩევანი არის აგება თუ ყიდვა: ბიბლიოთეკა, რომელსაც თავად უშვებთ, თუ მართული სერვისი, რომელიც რთულ ნაწილებს (მასშტაბირება, presence, გლობალური მიწოდება) ითავსებს. აი წამყვანი ვარიანტები, თითოეული ერთი პატიოსანი დადებითი და უარყოფითი მხარით.

ბიბლიოთეკა ან სერვერი, რომელსაც თავად ჰოსტავთ, კონტროლს გაძლევთ და შეტყობინებაზე ანგარიშს არ გიწერთ, სამაგიეროდ მასშტაბირება, ხელახლა დაკავშირება და presence თქვენზეა. მართული სერვისი ამ ყველაფერს გამოყენების საფასურად იბარებს. აირჩიეთ იმის მიხედვით, რამდენად ბირთვულია თქვენთვის რეალური დრო — და რამდენი საოპერაციო ტვირთის ტარება გსურთ.

ბიბლიოთეკები და თვითჰოსტინგიანი სერვერები

ws (Node)

მინიმალური WebSocket ბიბლიოთეკა

პაწაწინა, სტანდარტისადმი სუფთა WebSocket-ის იმპლემენტაცია Node-ისთვის. იღებთ ნედლ ფრეიმებს და მეტს არაფერს.

  • დადებითი — პატარა, სწრაფი, ჯადოქრობის გარეშე; იდეალურია, როცა ზუსტად WebSockets გინდათ.
  • უარყოფითი — ოთახები, ხელახლა დაკავშირება, სარეზერვო გზები და მასშტაბირება ყველა თქვენ უნდა ააგოთ.
Socket.IO

რეალური დრო ყველაფრით აღჭურვილი

უფრო მაღალი დონის შრე ოთახებით, ავტომატური ხელახლა დაკავშირებით, long-poll სარეზერვო გზითა და Redis ადაპტერით მასშტაბირებისთვის.

  • დადებითი — უზარმაზარი ეკოსისტემა; ოთახები, ხელახლა დაკავშირება და სარეზერვო გზები კოლოფიდანვე.
  • უარყოფითი — საკუთარი გადაცემის პროტოკოლი (და არა ნედლი WS) და ჩვეულებრივ ფრეიმებზე მძიმეა.
Centrifugo / Soketi

თვითჰოსტინგიანი რეალური დროის სერვერები

დამოუკიდებელი, ენისგან დამოუკიდებელი pub/sub სერვერები (Soketi Pusher-ის პროტოკოლთან თავსებადია), რომლებსაც აპლიკაციის გვერდით უშვებთ.

  • დადებითი — მასშტაბირდება და presence-ს კოლოფიდანვე აკეთებს; თქვენი აპლიკაცია მხოლოდ აქვეყნებს.
  • უარყოფითი — კიდევ ერთი სერვისი დასადეპლოებელი, სამონიტორინგო და სამართავი.

მართული რეალური დრო

Ably

მართული pub/sub, გლობალური edge

ჰოსტირებული არხები presence-ით, შეტყობინებების ისტორიითა და მიწოდების გარანტიებით გლობალურ ქსელზე.

  • დადებითი — ძლიერი საიმედოობა და SLA-ები, presence და ისტორია ჩაშენებულია.
  • უარყოფითი — გამოყენების ღირებულება მასშტაბთან ერთად იზრდება; მესამე მხარეზე დამოკიდებულება.
Pusher

მარტივი ჰოსტირებული არხები

ერთ-ერთი პირველი ჰოსტირებული pub/sub სერვისი — სწრაფად ეწყობა გავრცელებისა და presence-ისთვის.

  • დადებითი — სწრაფად ინტეგრირდება, მომწიფებული SDK-ები, გულუხვია პატარა აპლიკაციებისთვის.
  • უარყოფითი — კავშირებისა და შეტყობინებების ლიმიტები და ღირებულება ზრდასთან ერთად მატულობს.
Supabase Realtime

რეალური დრო მონაცემთა ბაზაზე მიბმული

ღიაკოდიანი სერვისი, რომელიც Postgres-ის სტრიქონების ცვლილებებს ნაკადად გადმოსცემს, პლუს გავრცელებისა და presence-ის არხები.

  • დადებითი — მონაცემთა ბაზასთან ინტეგრირებული (პირდაპირ უსმენთ მონაცემების ცვლილებას); ღიაკოდიანი.
  • უარყოფითი — საუკეთესოა Supabase/Postgres-ის მოდელის შიგნით; დამოუკიდებელ მაგისტრალად ნაკლებად გამოდგება.

როგორ ავირჩიოთ: ws — როცა სუფთა WebSockets გინდათ და მასშტაბირებას თავად იტვირთავთ; Socket.IO — სრული ნაკრებისთვის ერთ აპლიკაციაში; Centrifugo/Soketi — რომ მასშტაბირებადი მაგისტრალი თვითონ დაჰოსტოთ; Ably/Pusher/Supabase — როცა გირჩევნიათ, გადაიხადოთ და მასშტაბირება, presence და გლობალური მიწოდება სხვის საზრუნავად აქციოთ.

1push სჯობს პოლინგს — როცა ამას იმსახურებს. რეალური დრო ხშირი, შეყოვნებისადმი მგრძნობიარე განახლებებისთვის გამოიყენეთ; იშვიათი შემოწმებისთვის პოლინგიც კარგია.
2კავშირი აუცილებლად გაწყდება. heartbeat მკვდარი სოკეტის შესამჩნევად და ხელახლა დაკავშირება backoff-ით არჩევითი არ არის.
3რეალური დრო არის pub/sub. არხები/ოთახები და presence ადრევე დაამოდელეთ — თითქმის ყველაფერი ერთი-მრავალთანაა.
4მასშტაბირებას ბექფლეინი სჭირდება. როგორც კი ორ სერვერს გაუშვებთ, დაამატეთ Redis/NATS, რომ ნებისმიერმა ნოუდმა ნებისმიერ კლიენტს მიაღწიოს.
5აირჩიეთ ყველაზე მსუბუქი ტრანსპორტი. SSE ცალმხრივი ფიდებისთვის, WebRTC მედიისა და P2P-სთვის, long-poll სარეზერვოდ — WebSocket კი მაშინ, როცა მართლა ორმხრივობა გჭირდებათ.
ცოდნის შემოწმება

დაგამახსოვრდათ?

ხუთი სწრაფი კითხვა რეალური დროის ტრანსპორტებზე, WebSocket-ის handshake-ზე, სასიცოცხლო ციკლსა და მასშტაბირებაზე — მყისიერი პასუხი, ავტორიზაციის გარეშე.

შეაფასეთ ეს დასტა
იყავით პირველი

ნავიგაცია ← → ღილაკებით ან სქროლით · უკან ბიბლიოთეკაში