- Serverless आसान दिखता है, लेकिन वास्तव में जटिलता, सीमाएँ और ऊँची लागत पैदा करने वाली संरचना है
- Container portability, state बनाए रखना, और स्पष्ट control देते हैं और अधिकांश use cases के लिए अधिक उपयुक्त हैं
- Serverless की cost structure अपारदर्शी और अप्रत्याशित होती है, और components के बीच अनावश्यक जटिलता पैदा करती है
- Serverless की scalability और सरलता सीमित use cases के लिए ही उपयुक्त है
- वास्तविक production environment में container-आधारित deployment अधिक सरल, scalable और cost-efficient होता है
Serverless Is a Scam. Just Use a Container.
Serverless क्या है?
- Serverless वह तरीका है जिसमें code को individual function units में deploy किया जाता है, और cloud platform execution व scaling को अपने-आप संभालता है
- लेकिन व्यवहार में, इसमें निम्न समस्याएँ मौजूद हैं
- execution time limit (उदाहरण: AWS Lambda में 15 मिनट की सीमा)
- state बनाए नहीं रख सकते (हर execution पर initialization)
- cold start समस्या
- debug न कर पाने वाला environment
- platform-specific settings और configuration
- YAML का अत्यधिक उपयोग
- यह सरल दिखता है, लेकिन जटिल कार्यों के लिए उपयुक्त नहीं है
Container: सरल, शक्तिशाली, और अच्छे अर्थ में नीरस
- Container के निम्न फायदे हैं
- तेज़ startup
- किसी भी environment में चल सकता है
- state बनाए रख सकता है (
Docker volume का उपयोग)
- execution time limit नहीं
- debugging, local development, और production environment में switch करना आसान
- उदाहरण code:
docker run -v my-data:/data my-app
- परिणामस्वरूप stateful workloads को कहीं भी एकसमान तरीके से चलाया जा सकता है
- vendor lock-in नहीं, hidden cost नहीं, और architecture में अनावश्यक बदलाव नहीं
Serverless pricing: उपयोगकर्ता को भ्रमित करने वाला
- Serverless की लागत बहुत जटिल तरीके से बनाई जाती है
- प्रति invocation लागत
- memory usage
- execution time
- transferred data की मात्रा
- region के अनुसार अंतर
- secret key access cost आदि
- भ्रम पैदा करने वाले terms के उदाहरण:
- Provisioned Concurrency Units
- GB-seconds
- Requests Tier 1/2/3
- अप्रत्याशित billing structure के कारण अनपेक्षित bill आ सकता है
- तुलना: $5 VPS में अनुमानित flat fee पर सभी resources का control संभव है
“Serverless scalable है” के दावे पर आपत्ति
- Serverless तकनीकी रूप से scalable है, लेकिन व्यवहार में अधिकांश apps को इसकी आवश्यकता नहीं होती
- अधिकांश applications को वास्तव में इन चीज़ों की ज़रूरत होती है
- predictability
- monitorability
- उचित resource limits
- development और staging environments
- Container-आधारित setup में scaling भी सरल है
replicas: 5
- या load balancer का उपयोग करके horizontal scaling की जा सकती है
Stateless design कृत्रिम समस्याएँ बनाता है
- Serverless हर हाल में stateless design थोपता है
- cache, session, temporary files, persistent connection संभव नहीं
- परिणामस्वरूप इन चीज़ों की आवश्यकता पड़ती है
- external database
- distributed cache
- file storage
- event bus
- state machine
- अंततः एक “सरल” serverless app में 6 से अधिक SaaS dependencies हो जाती हैं
- इसके विपरीत, container में यह संभव है
- in-memory cache
- disk writes
- session बनाए रखना
- असीमित runtime
“मैं server manage नहीं करना चाहता” का जवाब
- server management के बिना container-आधारित platform इस्तेमाल करने के तरीके मौजूद हैं
- Sliplane, Railway, Coolify जैसे platforms का उपयोग
- या सिर्फ VPS पर Docker + systemd से भी काम हो सकता है
- Git-आधारित deployment, rollback, logging, metrics जैसी operational convenience उपलब्ध रहती है
- पूरे system पर समझ और control बना रहता है
“Serverless सस्ता है” के दावे पर आपत्ति
- बहुत कम invocation frequency पर यह सस्ता हो सकता है
- लेकिन नीचे की स्थितियों में लागत तेज़ी से बढ़ती है
- जब traffic एक स्तर से ऊपर चला जाए
- जब अधिक memory की ज़रूरत हो
- जब वास्तविक computation ज़्यादा हो
- जब data transfer अधिक हो
- Serverless में platform सब कुछ छिपा देता है, इसलिए optimization कठिन होती है
- जबकि container में
- सस्ते hardware पर भी लगातार चलाया जा सकता है
- cache और storage के साथ जोड़ा जा सकता है
- benchmarking और tuning आसान है
- millisecond-आधारित billing नहीं
Serverless वास्तव में कब उपयुक्त है
- यह निम्न प्रकार के intermittent और stateless tasks के लिए उपयुक्त है
- event-driven functions (उदाहरण: image resizing)
- कम ही चलने वाले jobs या webhook
- internal tools
- POC
- जब तेज़ scale up/down की ज़रूरत हो
- लेकिन वास्तविक applications में यह सीमाओं से टकराता है, और
- समय, लागत और जटिलता के रूप में बड़ी कीमत चुकानी पड़ती है
Container बेहतर विकल्प क्यों हैं
- Container निम्न चीज़ें प्रदान करते हैं
- portability
- control
- simplicity
- transparency
- flexibility
- single या multi-container deployment, scaling, state management, background jobs, और DB integration सब संभव है
- code दोबारा लिखे बिना platform migration भी संभव है
सारांश (TL;DR)
- सिद्धांत में Serverless आकर्षक लगता है
- वास्तविकता में यह है:
- अपारदर्शी
- महँगा
- अत्यधिक जटिल
- ज़रूरत से ज़्यादा प्रचारित
> शुरू करने से पहले खुद से पूछें:
> “क्या इसे बस container के रूप में नहीं बनाया जा सकता?”
- अगर जवाब ‘हाँ’ है, तो container से शुरुआत करना बेहतर विकल्प है
आगे क्या करें
- Serverless के कारण हुए अनपेक्षित खर्च या अक्षम workflow के अपने अनुभव साझा करने की सलाह
- सरल समस्याओं को अनावश्यक रूप से जटिल न बनाएँ
19 टिप्पणियां
xfaas भी है..
cf workersभी हैं। लगता है यह एक पक्षपाती लेख है।जब मैं GPU किराये पर लेते समय उसे थोड़ी देर के लिए serverless function के रूप में चलाने के बारे में सोच रहा था,
क्या वह container में भी संभव है?
पुरानी PHP web hosting सेवाओं में, अगर PHP निकालकर उसकी जगह vendor lock-in से भरा हुआ JS डाल दें....
तो मुझे यह सोचना बंद नहीं होता कि इसे प्रमुख serverless FaaS प्लेटफ़ॉर्म्स से अलग पहचानना मुश्किल होगा।
बेशक, PHP और JS/TS को मुख्य रूप से इस्तेमाल करने वाला एक self-proclaimed
똥1믈리에होने के नाते मैं इसे संतोषजनक ढंग से इस्तेमाल कर रहा हूँ,लेकिन फिर भी मुझे ठीक-ठीक समझ नहीं आता कि इतने लोग इसे स्वादिष्ट क्यों मानते हैं।
मेरी निजी राय में vendor की serverless service का उपयोग करना जोखिमभरा है, लेकिन containers का उपयोग करके कंपनी द्वारा खुद serverless environment उपलब्ध कराना अच्छा लगता है। अगर serverless को service नहीं बल्कि एक concept के रूप में इस्तेमाल किया जाए, तो यह अच्छा हो सकता है।
कुछ समय पहले vercel की Edge rendering को छोड़ देने वाले ट्वीट और वीडियो[1], और serverless server (haha)[2] पर लिखा गया लेख काफ़ी चर्चा में थे। मुझे लगता है कि मेरी राय भी उस समय आए लेखों जैसी ही है.
यह मेरी व्यक्तिगत राय है, लेकिन frontend developer के नज़रिए से देखें तो user के request के साथ serverless function जोड़ना अभी भी काफ़ी दूर की बात है (जब तक कि आप जो application बना रहे हैं वह MVP न हो).
[1] https://youtu.be/lAGE-k1Zfrg
[2] https://vercel.com/blog/…
[2-1] https://bobaekang.com/blog/…
बेशक, जैसा कि इस पोस्ट पर भी लिखा गया है, यह कुछ ज़्यादा ही attention खींचने के लिए लिखा गया लेख लगता है :(
कंटेनर-आधारित environment (ECS Fargate केंद्रित, Kubernetes cluster) और serverless environment (AWS) — दोनों का अनुभव होने के नाते, यह बात मुझे उतनी प्रभावशाली नहीं लगी।
कंटेनर-आधारित environment के फ़ायदों के रूप में जो बातें गिनाई गई हैं, वे फ़ायदे होने के साथ-साथ एक ही समय में नुकसान भी बन सकती हैं।
'सीधे control किया जा सकता है और state रखा जा सकता है' कहकर जिन बातों का ज़िक्र किया गया है, वे सब management point बन जाती हैं, इसलिए क्या operational complexity बढ़ जाती है।
मुझे लगता है कि छोटे संगठनों में, और खासकर उन संगठनों में जहाँ specialized server management team नहीं है, मैं serverless की ज़ोरदार सिफारिश करूँगा।
हाँ, cost calculation का जटिल होना या उसका अनुमान लगाना मुश्किल होना, और vendor lock-in की समस्या — इस बात से मैं सहमत हूँ।
डेवलपर experience और observability की बात करने वाले कुछ लोग हैं, तो उसमें यह जोड़ना चाहूँगा,
अगर शुरुआती integration environment अच्छी तरह सेट कर दिया जाए, तो container-आधारित तरीके से कम नहीं, बल्कि शायद उससे भी ज़्यादा native के करीब developer experience हासिल किया जा सकता है। (इसके लिए तरह-तरह के tools भी हैं.)
जहाँ तक observability की बात है, अगर उसे गहराई से करना हो तो serverless हो या container-based, दोनों में ही यह कोई आसान समस्या नहीं है। log centralization, तरह-तरह के metrics visualization, APM, CPU/memory usage visualization, और उसके आधार पर scaling strategy बनाना वगैरह...
अगर बात उस स्तर तक नहीं पहुँची है, तो cloud vendor द्वारा मूल रूप से दिए जाने वाले metrics/log integration काफ़ी शक्तिशाली होते हैं, इसलिए दोनों लगभग बराबर ही हैं.
थोड़ा आक्रामक ढंग से कहूँ तो, मैं पूछना चाहूँगा, 'आपने serverless को ठीक-ठाक स्तर तक वास्तव में कितना करके देखा है?' 😅
मुझे भी लगता है कि क्या केवल कुछ ज़रूरी endpoints को ही Lambda पर चलाना बेहतर नहीं होगा। वैसे शुरुआत से ही मुझे serverless development का अनुभव नहीं है, इसलिए मैं पक्के तौर पर कुछ कह नहीं सकता, लेकिन ऐसा ज़रूर लगता है कि कुछ खास मामलों में यह अच्छा हो सकता है।
क्या यह लेख उस कंपनी ने लिखा है जो एक container hosting platform कंपनी है, इसलिए शायद इसे पक्षपाती नज़रिये से लिखा गया होगा, हा हा
पहले भी फ्रंटएंड पक्ष में nextjs(vercel) को लेकर चिंता जताने वाले netlify (प्रतिस्पर्धी) डेवलपर की पोस्ट पर शक करने वाले लोग थे। टिप्पणियाँ देखें तो वह पक्षपाती नहीं लगती।
मैं फ्रंटएंड तरफ का हूँ... इसलिए इस क्षेत्र से ज़्यादा नज़दीकी नहीं है, लेकिन
serverless(서버있음)वाला मीम काफ़ी बार देखा है hahaNative की तुलना में development experience काफ़ी कमजोर होना बहुत बड़ा pain point है, और software खुद infrastructure provider पर निर्भर हो जाता है, इसलिए एक बार सेट हो जाने के बाद उससे बाहर निकलना मुश्किल हो जाता है। Reference स्पष्ट रूप से कम हैं, और observability भी बहुत कमजोर है.
Cloudflare शायद दूसरी कंपनियों की तुलना में serverless को बेहतर तरीके से करने की कोशिश कर रहा है। Database भी serverless, key-value storage भी serverless, यहाँ तक कि message queue भी serverless है...
(बेशक, ऐसा होते-होते यह भी लगता है कि हम platform पर पूरी तरह निर्भर और बंधे जा रहे हैं)
फिर भी, अगर debugging, observability और development experience में सुधार नहीं होता, तो यह अब भी वहीं का वहीं रहेगा।
Cloud Run चलाइए
Serverless के साथ service चलाना गलत tool चुनने जैसा है.
ऐसी कुछ specific problems होती हैं जहाँ serverless की ज़रूरत पड़ती है. रुक-रुककर इस्तेमाल होने वाले use cases के लिए यह उपयुक्त है.
क्या serverless container services पर भी यही राय लागू होगी?
मौजूदा serverless services (
lambdaजैसी) की समस्याओं की वजह से AWS ने Fargate बनाया और उसे और आसान बनाने के लिए App Runner तक बना दिया 🤔यहाँ तक कि Google Cloud का
Cloud Runभी है, जो scale to zero वाला कमाल का serverless container service हैइनमें से मुझे व्यक्तिगत तौर पर
Cloud Runका developer experience सबसे अच्छा लगासर्वरलेस (सर्वर है)
Hacker News राय
शुरुआत से ही यह Serverless नहीं, बल्कि Serverlease था।
हाहाहाहा