Meteor 3.5 డెవలపర్లకు కేవలం ఒకే ఒక ఎన్విరాన్మెంట్ వేరియబుల్ (environment variable) ద్వారా SockJS కి బదులుగా uWebSockets.js ని ఉపయోగించుకునే వెసులుబాటును కల్పిస్తుంది. ఇది మెథడ్ కాల్స్ (method calls) పై ఎక్కువగా ఆధారపడే యాప్ల కోసం CPU, RAM మరియు గార్బేజ్-కలెక్షన్ (garbage-collection) ఖర్చులను గణనీయంగా తగ్గిస్తుందని హామీ ఇస్తోంది.
ఈ మార్పు ఎందుకు ముఖ్యం
ప్రారంభం నుండి, Meteor ప్రతి DDP (Distributed Data Protocol) సందేశాన్ని SockJS ద్వారా పంపిస్తోంది. SockJS అనేది అన్ని చోట్లా పనిచేసే ఒక JavaScript ఫాల్బ్యాక్ (fallback), కానీ ఇది వేగం కోసం రూపొందించబడలేదు. ఈ కొత్త వెర్షన్ ట్రాన్స్పోర్ట్ లేయర్ను (transport layer) విడదీసి (decouples), DDP నిబంధనలకు అనుగుణంగా ఉండే ఏ WebSocket ఇంప్లిమెంటేషన్నైనా అనుమతించేలా ఒక ప్లగ్-ఇన్ పాయింట్ను అందిస్తోంది. లాంచ్ చేసేటప్పుడు DDP_TRANSPORT=uws అని సెట్ చేయడం ద్వారా, డిఫాల్ట్ను uWebSockets.js తో మార్చవచ్చు. ఇది అధిక త్రూపుట్ (high throughput) కోసం ప్రసిద్ధి చెందిన C/C++ ఆధారిత సర్వర్.
పనితీరు అంశం
ఈ వెర్షన్తో పాటు అందించిన బెంచ్మార్క్లు (Benchmarks) ఈ క్రింది వాటిని చూపుతున్నాయి:
- CPU వినియోగం 9% తగ్గింది
- RAM వినియోగం 11% తగ్గింది
- గార్బేజ్-కలెక్షన్ (Garbage-collection) పాజ్ సమయం 26% తగ్గింది
- మైక్రో-బెంచ్మార్క్లలో త్రూపుట్ (Throughput) 1.6 రెట్లు పెరిగింది
ఒక అప్లికేషన్ అనేక RPC-శైలి మెథడ్ కాల్స్ చేసినప్పుడు ఈ ప్రయోజనాలు కనిపిస్తాయి. అప్లికేషన్ యొక్క బిజినెస్ లాజిక్ ఆప్టిమైజ్ అయిన తర్వాతే ట్రాన్స్పోర్ట్ ఒక అడ్డంకిగా (bottleneck) మారుతుంది, కాబట్టి ఈ మార్పు నేరుగా సర్వర్ ఖర్చులను తగ్గించగలదు.
ఈరోజే దీన్ని ఎలా ప్రయత్నించాలి
దీని కోసం ప్రత్యేకమైన బైనరీ అవసరం లేదు—కేవలం Meteor 3.5 ఉంటే సరిపోతుంది. యాప్ను ఈ క్రింది విధంగా రన్ చేయండి:
DDP_TRANSPORT=uws meteor run
uWebSockets.js సర్వర్ దాని స్వంత పోర్ట్ (డిఫాల్ట్ 5001) పై వింటెన్స్ (listens) చేస్తుంది. ఒకే హోస్ట్ను బహుళ Meteor ఇన్స్టెన్స్లు ఉపయోగిస్తున్నప్పుడు, పోర్ట్ ఘర్షణలను (collisions) నివారించడానికి METEOR_SETTINGS ద్వారా ప్రతిదానికి ఒక ప్రత్యేకమైన uws.port కేటాయించాలి.
ఎవరికి ప్రయోజనం ఉంటుంది, మరియు ఎవరికి పెద్దగా తేడా కనిపించకపోవచ్చు
- RPC-భారీ వర్క్లోడ్లు (RPC-heavy workloads) – ప్రతి రిక్వెస్ట్కు అనేక మెథడ్స్ను కాల్ చేసే సర్వీసులు CPU సైకిల్స్ మరియు మెమరీని ఆదా చేయగలవు, దీనివల్ల స్కేలింగ్ ఒత్తిడి తగ్గుతుంది.
- Pub/Sub-కేంద్రీకృత యాప్లు (Pub/Sub-centric apps) – పబ్లిష్/సబ్స్క్రైబ్ ప్యాటర్న్స్లో వచ్చే లేటెన్సీ (latency) ఎక్కువగా డేటా-డిఫ్ (data-diff) గణనల వల్ల వస్తుంది, ట్రాన్స్పోర్ట్ వల్ల కాదు, కాబట్టి వేగంలో పెరుగుదల స్వల్పంగా ఉంటుంది.
ఈ మార్పు అనేది ఆప్ట్-ఇన్ (opt-in); అంటే మీరు కావాలనుకుంటేనే మార్చుకోవాలి. నేటివ్ WebSockets అందుబాటులో లేని వాతావరణాలతో అనుకూలతను కాపాడటానికి SockJS డిఫాల్ట్గా ఉంటుంది.
లాభనష్టాలు మరియు జాగ్రత్తలు
ట్రాన్స్పోర్ట్ను మార్చడం వల్ల ఒక చిన్న ఆపరేషనల్ స్టెప్ పెరుగుతుంది: అదనపు పోర్ట్ను నిర్వహించడం మరియు అది ఇతర సర్వీసులతో ఘర్షణ పడకుండా చూసుకోవడం. uWebSockets.js అనేది ఒక నేటివ్ మాడ్యూల్ కావడంతో, దీనికి బైనరీ డిపెండెన్సీల (binary dependencies) సాధారణ పరిగణనలు ఉంటాయి—డిప్లాయ్మెంట్ హోస్ట్లో బిల్డ్ టూల్స్ ఉండాలి మరియు లైబ్రరీకి సంబంధించిన భవిష్యత్తు అప్డేట్లను యాప్ కోడ్బేస్తో పరీక్షించాల్సి ఉంటుంది.
Meteor ట్రాన్స్పోర్ట్ లేయర్ యొక్క తదుపరి అడుగులు
ఒక స్పష్టమైన బౌండరీని (boundary) అందించడం ద్వారా, ప్రత్యేక భద్రతా అవసరాల కోసం, కస్టమ్ ప్రోటోకాల్ ఎక్స్టెన్షన్ల కోసం లేదా మరింత పనితీరు మెరుగుదల కోసం ప్రత్యామ్నాయ ట్రాన్స్పోర్ట్లతో ప్రయోగాలు చేయమని Meteor ఇప్పుడు కమ్యూనిటీని ఆహ్వానిస్తోంది. థర్డ్-పార్టీ ఇంప్లిమెంటేషన్లు ఎంత వేగంగా వస్తాయనే దానిని బట్టి, ఈ ప్లగ్గబుల్ మోడల్ Meteor ఆర్కిటెక్చర్లో శాశ్వత భాగం అవుతుందో లేదో తెలుస్తుంది.
ముఖ్య అంశం: Meteor 3.5 యొక్క ప్లగ్గబుల్ DDP ట్రాన్స్పోర్ట్, పాత SockJS స్టాక్ను కేవలం ఒకే ఒక కమాండ్తో uWebSockets.jsతో భర్తీ చేయడానికి అనుమతిస్తుంది. ఇది RPC-తీవ్రత కలిగిన అప్లికేషన్లకు 1.6 రెట్లు ఎక్కువ త్రూపుట్ను మరియు గణనీయమైన వనరుల ఆదాను అందిస్తుంది, అదే సమయంలో వేగం అవసరం లేని వర్క్లోడ్ల కోసం ప్రస్తుత సెటప్ను యథాతథంగా ఉంచుతుంది.
