24 पॉइंट द्वारा GN⁺ 2024-09-30 | 2 टिप्पणियां | WhatsApp पर शेयर करें

Go 1.22 से standard library में बेहतर routing support मिलता है

  • पहले routing को मैन्युअली संभालना पड़ता था, लेकिन अब mux.HandleFunc का उपयोग करके routing को आसानी से किया जा सकता है
  • login middleware जोड़कर security को बेहतर बनाया जा सकता है

built-in router में सावधानी: trailing slash के कारण redirect

  • अगर /records/ path बनाया जाए, तो /records request /records/ पर redirect हो जाती है
  • इससे POST request की body हट सकती है और request GET में बदल सकती है
  • इसका समाधान यह है कि POST /records/ की जगह POST /records जैसे API endpoint का उपयोग किया जाए

sqlc से database query code का automatic generation

  • ORM सीखे बिना SQL query लिखने के लिए sqlc नाम का tool मिला
  • SQL query लिखने पर वह अपने-आप Go code में बदल जाती है
  • ORM के documentation को देखे बिना भी ज़रूरी SQL queries आसानी से लिखी जा सकती हैं

sqlite optimization tips

  • database के लिए write-only object का उपयोग करें और db.SetMaxOpenConns(1) सेट करें
  • read speed बढ़ाने के लिए write और read के लिए अलग-अलग DB objects का उपयोग करें
  • जिन दो tables के बीच JOIN की ज़रूरत नहीं है, उन्हें अलग-अलग databases में रखकर स्वतंत्र रूप से connect किया जा सकता है

Go 1.19 में GC memory limit सेट करना

  • 256MB या 512MB जैसी अपेक्षाकृत कम memory वाले VM पर सभी Go projects चलाने पर application के बार-बार OOM से बंद होने की समस्या हुई
  • garbage collector की default setting के कारण current heap size के 2 गुना तक memory allocation की अनुमति मिलती है
  • Go 1.19 में ऐसा तरीका जोड़ा गया कि application किसी खास memory usage तक पहुँचने पर GC चलाने का निर्देश दिया जा सके
  • GC memory limit को 250MB पर सेट करने के बाद OOM shutdown की आवृत्ति कम हो गई export GOMEMLIMIT=250MiB

Go से वेबसाइट बनाने के कारण

  • single static binary के रूप में deployment आसान है
  • production में उपयोग लायक built-in webserver है, इसलिए WSGI वगैरह configure करने की ज़रूरत नहीं होती
  • Go का toolchain install और use करना आसान है
  • HTTP response भेजना सरल है, इसलिए project maintenance आसान रहती है
  • standard library में net/http शामिल है, इसलिए अतिरिक्त library install किए बिना वेबसाइट बनाई जा सकती है
  • system-level काम भी आसानी से किए जा सकते हैं
  • ऐसा लगता है कि सब कुछ project को आसानी से संभालने योग्य बनाने के लिए बनाया गया है

वे समस्याएँ जो अभी तक हल नहीं हुईं

  • कुछ चीज़ें हैं जो Go में अभी तक ज़्यादा नहीं की गईं
    • HTML template rendering
    • असली login system implement करना
    • CSRF implement करना
  • आम तौर पर security-sensitive features को implement करने का तरीका अच्छी तरह नहीं पता, इसलिए login/CSRF जैसी चीज़ों की ज़रूरत वाले projects शुरू नहीं किए जाते

Go के नए features देखना अच्छा लगता है

  • इस लेख में बताए गए Go के दो features (GOMEMLIMIT और routing) पिछले कुछ वर्षों में नए जोड़े गए हैं
  • लगता है कि नए Go versions के release notes पर और ध्यान देना चाहिए

2 टिप्पणियां

 
secret3056 2024-09-30

sqlc वाकई बहुत बढ़िया है

 
GN⁺ 2024-09-30
Hacker News राय
  • Go भाषा में आप किसी प्रोजेक्ट पर 5 दिन काम करके उसे 2 साल तक छोड़ देने के बाद भी बिना दिक्कत फिर से coding शुरू कर सकते हैं
  • Go भाषा को कुछ साल पहले सीखना शुरू किया था, लेकिन इसमें ज़्यादा बदलाव नहीं आया, इसलिए लंबे समय बाद भी यह अब भी उपयोगी है
  • Go के web development पोस्ट में embed package का ज़िक्र न होना खलता है
    • static resources को single binary में bundle करना बहुत सुविधाजनक है
  • database transactions को fail होने के लिए design किया गया है, इसलिए हमेशा retry loop इस्तेमाल करना चाहिए
    • transaction loop में Context जोड़ना अच्छा है ताकि उसे cancel किया जा सके
  • sqlc में कुछ बड़े limitations और छोटी असुविधाएँ हैं, इसलिए इस्तेमाल करने से पहले issue list देख लेना बेहतर है
    • यह dynamic queries, one-to-many relationships, embedded CTE, composite types आदि को support नहीं करता
    • साधारण requirements के लिए ठीक है, लेकिन जटिल कामों में manual approach इस्तेमाल करनी चाहिए
  • Go को container के अंदर चलाते समय CPU throttling से बचने के लिए GOMAXPROCS को सही तरीके से सेट करना चाहिए
  • GOMEMLIMIT इस्तेमाल करने से GC को लेकर चिंता कम हो सकती है
    • Kubernetes या Docker इस्तेमाल करते समय इसे अपने-आप सेट किया जा सकता है
  • html/template अजीब है और इसमें कई समस्याएँ हैं, इसलिए इसका इस्तेमाल न करना बेहतर है
    • इसकी जगह Templ को पसंद किया जाता है
  • routing का ज़िक्र अच्छा लगा
    • लंबे समय तक mux का आदी रहा, लेकिन नए release features पर ध्यान नहीं दिया था
  • नई नौकरी में एक महीने तक Go इस्तेमाल किया, लेकिन पसंद नहीं आया
    • लगता है Go ने पिछले 20 साल के language development से कुछ नहीं सीखा
    • nil की समस्या की वजह से आसान काम भी जटिल हो जाते हैं
  • SQLite इस्तेमाल करते समय single-thread writer pool और अलग read pool इस्तेमाल करना अच्छा है
    • BEGIN CONCURRENT का इस्तेमाल करके concurrency बेहतर की जा सकती है
  • Go की सादगी और framework dependency न होने वाली बात बहुत पसंद है
    • standard library और भरोसेमंद third-party libraries से ही शानदार चीज़ें बनाई जा सकती हैं
    • web app या CLI tool बनाते समय Go उपयुक्त है
    • explicit error handling पसंद है
    • Go का बड़ा प्रशंसक हूँ