किक-गधा उच्च प्रदर्शन गोलांग माइक्रोसिस्ट्रिस लिखने के 7 टिप्स

यह गो माइक्रोसवर्क डिजाइन और विकास के लिए एक कैसे-परिचय है। यह लेख आपको सीधे गो संसार की सर्वोत्तम प्रथाओं की ओर ले जाएगा और हाथ से पहले आपको गोचरों को दिखाएगा। मैं सभी स्रोतों को नीचे छोड़ दूँगा।

  1. गो के डिफ़ॉल्ट HTTP क्लाइंट का उपयोग न करें
  2. इन चौखटे और बाहरी पुस्तकालयों पर विचार करें (मानक)
  3. Makefiles से डरो मत
  4. पर्यावरण को स्थापित करने के लिए अपना समय बचाने के लिए गो मॉड्यूल का उपयोग करें
  5. ठीक से लॉग इन करें (लॉगरस)
  6. दर्द के बिना यूनिट परीक्षण लिखें
  7. दस्तावेज़ जल्दी (स्वैगर)

1. गो के डिफ़ॉल्ट HTTP क्लाइंट का उपयोग न करें

गो कार्यक्रमों को लिखना जो HTTP पर सेवाओं से बात करना आसान और मजेदार है। हालाँकि, एक ऐसी गड़बड़ी है जो गिरना आसान है और आपके प्रोग्राम को बहुत जल्दी दुर्घटनाग्रस्त कर सकता है: डिफ़ॉल्ट HTTP क्लाइंट।

गो का http पैकेज डिफ़ॉल्ट रूप से टाइमआउट का अनुरोध निर्दिष्ट नहीं करता है, जिससे सेवाएं आपके गोरोइंट्स को हाइजैक करने की अनुमति देती हैं। बाहरी सेवाओं से कनेक्ट करते समय हमेशा एक कस्टम http.Client निर्दिष्ट करें।

जब आप http.Get (url) का उपयोग करते हैं, तो आप http.DefaultClient, एक पैकेज चर का उपयोग कर रहे हैं जो क्लाइंट के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन को परिभाषित करता है। इसके लिए घोषणा है:

var DefaultClient = & ग्राहक {}

अन्य बातों के अलावा, http.Client एक टाइमआउट को कॉन्फ़िगर करता है जो शॉर्ट-सर्किट लंबे समय तक चलने वाले कनेक्शन है। इस मान के लिए डिफ़ॉल्ट 0 है, जिसे "कोई समय नहीं" के रूप में व्याख्या की गई है। यह पैकेज के लिए एक समझदार डिफ़ॉल्ट हो सकता है, लेकिन यह एक बुरा नुकसान है और उपरोक्त उदाहरण में हमारे आवेदन के गिरने का कारण है। जैसा कि यह पता चला है, Spacely Sprockets 'एपीआई आउटेज ने कनेक्शन को लटका देने का प्रयास किया (यह हमेशा ऐसा नहीं होता है, लेकिन यह हमारे उदाहरण में होता है)। वे तब तक लटके रहेंगे जब तक खराबी का सर्वर इंतजार नहीं करता। चूँकि उपयोगकर्ता अनुरोधों को पूरा करने के लिए एपीआई कॉल किए जा रहे थे, इस कारण गोरोइंटिन उपयोगकर्ता अनुरोधों को पूरा करने के लिए काम कर रहे थे। एक बार जब पर्याप्त उपयोगकर्ता sprockets पृष्ठ पर पहुंच जाते हैं, तो ऐप खत्म हो जाता है, सबसे अधिक संभावना संसाधन सीमाओं तक पहुंचने के कारण होती है।

समाधान

अनुरोध जीवनचक्र पर बारीक-बारीक नियंत्रण रखना हमेशा सबसे अच्छा होता है, आप इसके अलावा एक कस्टम net.Transport और net.Dialer निर्दिष्ट कर सकते हैं। ट्रांसपोर्ट क्लाइंट द्वारा अंतर्निहित टीसीपी कनेक्शन का प्रबंधन करने के लिए उपयोग की जाने वाली एक संरचना है और यह डायलर एक ऐसी संरचना है जो कनेक्शन की स्थापना का प्रबंधन करती है। गो के नेट पैकेज में डिफ़ॉल्ट ट्रांसपोर्ट और डायलर भी है। यहाँ कस्टम लोगों का उपयोग करने का एक उदाहरण है:

tr: = & http.Transport {DialContext: (& net.Dialer {Timeout: n * time.Second, KeepAlive: n * time.Second,})। DialContext, TLSHANDSkeTimeoutout: n * time.Second, ExpectContinueTimeout: n * time.econd , रिस्पांसहैडरटाइमआउट: n * time.Second,
        MaxIdleConns: n, MaxConnsPerHost: n,}
cli: = & http.Client {परिवहन: tr, टाइमआउट: n * time.Second,}

2. इन चौखटे और बाहरी पुस्तकालयों पर विचार करें

यदि आप एक गो डेवलपर से पूछते हैं कि आप किस वेब फ्रेमवर्क या लाइब्रेरी का उपयोग कर सकते हैं, तो विशिष्ट उत्तर मानक पुस्तकालयों से जुड़ा होता है। विडंबना यह है कि, "गोलंग फ्रेमवर्क" के लिए शीर्ष Google खोज परिणाम इस बारे में है कि आपको उनका उपयोग क्यों नहीं करना चाहिए।

HTTP सर्वर का निर्माण एक फ्रेमवर्क के साथ सबसे आसान है।

मुझे एक नामांकित पैरामीटर के लिए जिन, इको, बीगो, गोरिल्ला मक्स, गोजी के खिलाफ बेंचमार्क मिले और नीचे परिणाम हैं। जिन में सबसे तेज राउटर है, इसके बाद दूसरा इको करीब है।

JSON Serialization और Deserialization

एक बार एक एपीआई अनुरोध राउटर के माध्यम से मारा जाता है और एक नियंत्रक या हैंडलर पर पारित किया जाता है, अगला चरण प्रतिक्रिया को वापस करते समय अनुरोध जेएसएन या एनकोड को डिकोड करना है।

गो के पास वास्तव में अच्छा एन्कोडिंग पैकेज है जो कई स्वरूपों जैसे कि जोंस, एक्सएमएल, सीएसवी का समर्थन करता है, लेकिन विकल्प पर एक त्वरित नज़र आपको बहुत सारे पुस्तकालय दिखाती है। यहाँ JSONiter के मानक बेंचमार्क, EasyJson की मानक एन्कोडिंग / Json पैकेज के खिलाफ तुलना और नीचे परिणाम हैं।

नीचे JSON डिकोडिंग के लिए परिणाम है।

अब यदि आपका अनुरोध डिकोड हो गया है, तो अगला कदम आपके व्यावसायिक तर्क को लागू कर सकता है और कुछ डेटाबेस संचालन कर सकता है।

जबकि sqlx आपके द्वारा CRUD बनाने के लिए लिखी जाने वाली विशिष्ट संख्या को कम कर देता है, फिर भी आप दोहराव वाले कोड को कई बार लिखते हैं। ORM का उपयोग करने से इसे कम करने और अपने व्यावसायिक तर्क पर ध्यान केंद्रित करने में मदद मिल सकती है।

यहाँ डेटाबेस का एक मानदंड है, डेटाबेस + sqlx, gorm, क्वेरी के लिए go-pg और नीचे परिणाम हैं। आश्चर्यजनक रूप से, गो-पीजी, एक ORM मानक पैकेज या यहां तक ​​कि sqlx की तुलना में तेज़ी से प्रदर्शन किया। GORM जबकि पारिस्थितिकी तंत्र में बहुत प्रसिद्ध अपेक्षाकृत धीमी है।

एक postgres DB से 200K रिकॉर्ड को छोड़कर

ये बेंचमार्क आपको फ्रेमवर्क के अपने सेट को चुनने में मदद करेंगे।

3. Makefiles से डरो मत

विकास के दौरान, मुझे मैन्युअल रूप से "गो बिल्ड", "गो टेस्ट" को बार-बार निष्पादित करने के लिए उपयोग किया जाता था। यह एक बुरी आदत थी जिस पर मैं इस्तीफा देता हूं। यह इतना दर्दनाक नहीं है यदि आप बिना किसी आर्गन के सरल कमांड का उपयोग करते हैं। लेकिन अधिक जटिल कार्यों के मामले में, स्वाभाविक रूप से, यह एक दर्द होने वाला है। ऐसे कुछ विकल्प हैं जिन पर आप विचार कर सकते हैं। आप के लिए काम करने के लिए एक बैश स्क्रिप्ट का उपयोग कर सकते हैं। या बेहतर, कम से कम मेरे लिए, आप एक मेकफाइल लिख सकते हैं। मेक टूल इस कारण से है और मेकफाइल में आप अपने सभी सामान्य कार्यों को एक साथ रख सकते हैं।

मेरा Makefile आम तौर पर कुछ इस तरह दिखता है:

बिल्ड: ## बिल्ड गो बिल्ड -o बिन / बाइनरी_नाम cmd / main.go
रन: ## सर्वर बिन / बाइनरी_नाम चलाएं
मदद: @grep -E '^ [a-zA-Z _-] +:। *? ##? # $$' $ (MAKEFILE_LIST) | awk 'BEGIN {FS = ":। *? ##"}; {Printf "\ 033 [36m% -30 s \ 033 [0m% s \ n", $ $ 1, $ $ 2} '
.DEFAULT_GOAL: = सहायता

आप इसे इस तरह निष्पादित करेंगे:

> रन बनाना
> निर्माण करें
> make // सभी कमांड को कमेंट्स के साथ सूचीबद्ध करेगा

Makefile संभावनाओं के बारे में अधिक जानकारी: https://sohlich.github.io/post/go_makefile/

4. गो मॉड्यूल का उपयोग करें

स्रोत: https://blog.golang.org/use-go-modules

सर्वोत्तम विवरण के लिए कृपया गो लेख के बारे में स्रोत लेख देखें।

यदि संभव हो तो आपको मॉड्यूल के रूप में अपनी परियोजना को अन्य परियोजनाओं के लिए आयात करना चाहिए।

यह बहुत समय बचाता है और आप पाएंगे कि आपके कोड का पुन: उपयोग बहुत जल्दी कहां होगा।

5. ठीक से लॉग इन करें

सिफारिश है https://github.com/sirupsen/logrus। जबकि यह सबसे लोकप्रिय में से एक है, यह भी सुविधा संपन्न है।

6. दर्द के बिना इकाई परीक्षण लिखें

आपको उस 100% कोड का पीछा नहीं करना चाहिए। बस सबसे महत्वपूर्ण भागों को कवर करें। मानक परीक्षण पुस्तकालय ठीक काम करता है।

अपने http हैंडलर्स के परीक्षण के लिए आप "नेट / http / रिश्वतखोर" लाइब्रेरी का उल्लेख कर सकते हैं।

7. अपने microservice दस्तावेज़

प्रलेखन के लिए यह स्वैगर का उपयोग करना बहुत आसान है।

https://github.com/swaggo/swag का उपयोग किया गया है और उदाहरणों के साथ सभ्य प्रलेखन प्रदान करने में सक्षम है।

मुझे आशा है कि यह आपकी मदद करता है! अगर किसी चीज में सुधार की जरूरत हो या आप अलग तरीके से सोचें तो पहुंचें। पढ़ने के लिए धन्यवाद, ध्यान रखना!

संबंधित आलेख

https://medium.com/@nate510/don-t-use-go-s-default-http-client-4804cb19f779

https://hackernoon.com/the-myth-about-golang-frameworks-and-external-libraries-93cb4b7da50f

https://sohlich.github.io/post/go_makefile/

https://blog.golang.org/using-go-modules