क्यों आप शायद माइक्रोस्कोप का उपयोग नहीं करना चाहिए (अभी) (हिन्दी (Hindi))

क्यों आप शायद माइक्रोस्कोप का उपयोग नहीं करना चाहिए (अभी)

Monday, 29 December 2025

//

32 minute read

माइक्रोफ़ॉर्म्स डिफ़ॉल्ट "अनुचित तंत्र" रचना बन गए हैं.

यदि आप परिपक्व होना चाहते हैं, तो आप सेवा के बारे में बात करते हैं, अवसरों के बारे में, वितरित बसों, और "इनस्टेबलता." यदि आप विज्ञापन को तैयार देखना चाहते हैं, तो आप बक्से खींच लेते हैं जब तक कि आरेख एक सफेदबोर्ड में एक कप की तरह दिखता है।

लेकिन यहाँ सही सबसे अच्छा व्यवहार वाला है

माइक्रोस्कोप एक अनुप्रयोग डिजाइन को उन्नत नहीं कर रहे हैं. वे एक संगठनीय स्केलिंग योजना हैं.

अगर आप पहले से ही संगठनीय दर्द नहीं है वे हल करते हैं, उन्हें लेने से आप भविष्य की प्रतिलिपि नहीं बना देते हैं. यह आप वर्तमान टूटी हुई वस्तुओं को प्रस्तुत करता है.

यह एक स्वाभाविक तर्क नहीं है. यह एक इंजीनियरिंग व्यापार समाप्त है, और सभी व्यापार समाप्त की तरह, यह केवल समझ लेता है जब आप कर समझते हैं और आप वापस आ रहे हैं.

मैं एक दोषी के रूप में किया गया है "पुष्टि" के रूप में किसी के रूप में किया गया है बिना पूरी तरह से आंतरिक शरीर को सूचित करने के लिए. यह आसान है शब्दावली में पकड़ा जाना और भूल जाना है कि असली चुनौती टीमों और सिस्टमों के पार जटिलता का पालन कर रहा है.

अंत में यह सॉफ्टवेयर इंजीनियरिंग के सबसे पुराने नमूने पर आता है: क्विकएस - इसे सरल रखना, बेवकूफ.

माइक्रोस्कोप से पौराणिक कथा

माइक्रोस्कोप को डिफ़ॉल्ट रचना के रूप में बेच दिया जाता है क्योंकि कहानी स्पष्ट है:

  • छोटा सेवाएँ "शुद्ध" हैं
  • संग्रहित तंत्र "Tibone" हैं
  • ऑटोनोम "फ्री" है
  • आप "ठीक" शुरू कर सकते हैं क्योंकि आप "ठीक" शुरू कर सकते हैं

यह framing पीछे है.

माइक्रोफ़ॉर्म्स मुख्य रूप से कोड संरचना के बारे में नहीं हैं. वे बारे में हैं जो बिना बात किए क्या बदल सकते हैं, और कितनी बार कर सकते हैं.

अगर आपके पास नहीं है:

  • अनेक टीमों ने स्वतंत्र रूप से नियंत्रण किया
  • भिन्न प्राथमिकताओं को
  • कोरिड बोतल्स
  • फूट
  • वास्तविक मालिक सीमाएँ

... तो आप एक संगठनीय समस्या हल नहीं कर रहे हैं. आप एक खरीद रहे हैं.

यह सच है कि दुनिया - भर में हर तरह के बक्सों का इस्तेमाल नहीं किया जा सकता ।

आरेख जो चेतावनी लेबल होना चाहिए

आपने इस आरेख को देखा है.

एक सावधानी से रचा गया माइक्रोफ़ॉर्मेट आरेख

यह " नकल करने के लिए उदाहरण डिजाइन" नहीं है. यह एक चेतावनी लेबल है.

वे अकसर माइक्रोस्कोप को आरेखों के रूप में सिखाते हैं क्योंकि आरेखीय ज़िम्मेदारी सिखाने से ज़्यादा आसान होता है ।

महत्वपूर्ण रीग्रेटिंग यह है: कि आरेख एक लक्ष्य स्थिति नहीं है. यह एक है लागत सतह.

हर बॉक्स एक वादा है:

  • चलाने के लिए बंद
  • प्रबंधन करने के लिए तैनाती
  • संस्करण के लिए अनुबंध
  • एक विफलता मोड अब आप अपने आप
  • एक कॉल कहानी आप अनदेखा नहीं कर सकते हैं पर एक

तीर प्रभावशाली दिखते हैं ।

क्योंकि प्रत्येक तीर है:

  • हाल ही में@ info: whatsthis
  • आंशिक असफलता
  • रिलीज
  • टाइमआउट्स
  • संदर्भ प्रचयन का पता लगायें
  • "टेली में काम" झूठ

आप एक मंच बनाने के लिए कर रहे हैं ।

माइक्रोस्कोप का छिपा क़ीमती मॉडल

सभी गढ़ियों के फैसलों की तरह, माइक्रोस्कोप एक साथ आते हैं जटिलता कर रहा है (देखें) कोड के साथ खेल रहेः जटिलताएं कर सकते हैंफर्क यह है कि यह कर का परिसर हर सेवा सीमा, हर व्यवस्था, और हर विफलता पद्धति के पार.

वे आम तौर पर "सबसे अच्छा अभ्यास" के रूप में प्रसिद्ध हैं।

संकेतक पर ऑपरेशन

हर सेवा चाहता है:

  • इसका खुद का निर्माण
  • इसके स्वयं तैनाती कॉन्फ़िगरेशन
  • इसकी स्वयं ध्यान और सतर्कता
  • इसके खुद का लॉगिंग, तूफान, रनबुक
  • इसके अपने स्वयं के सुरक्षा अधिकारी (गुप्त, प्राधिकार, समायोजन)

एक टीम इस आराम से नहीं कर सकते हैं, यह माइक्रोफ़ॉर्म्स नहीं है. यह है अतिरिक्त चरणों के साथ एक वितरित.

बीच - बीच में संतुलन और विफलता

एक सीधी - सी बात है ।

माइक्रोस्कोप में, एक "फोन" के बीच एक समझौता है:

  • नेटवर्क
  • तराजू लोड करें (l)
  • टीएलएस
  • अ- मध्य- एलबम
  • सीरियलाइज़ेशन
  • टाइमआउट्स
  • रिलीज
  • यु. पू.

विफलता मोड्स गुणाः

  • एक INBGERGES ढेर ऊपर दिये गये ढेर को धीमा कर देता है
  • बोझ हलका करने से आप खुद को नीचा दिखा सकते हैं
  • एक एकल Sugows तीन सेवाओं का अपमान करता है "बहुत बुरी तरह"

आप डिबग बग अब और नहीं डिबग करें. आप डिबग करें तंत्र कहता है.

सीरियलीकरण कर सकता है किसी को भी के बारे में बात नहीं करता

यहाँ एक लागत है कि लगभग कभी एक माइक्रोस्कोप में चर्चा नहीं की है: सीरियलीकरण तथा द आकशीकरण (एसडी) ऊपरी.

सेवा सीमा का मतलब है:

// Monolith: direct object reference
var user = _userService.GetUser(userId);  // < 1μs
var tier = user.Tier;                      // Memory access

// Microservices: serialize → network → deserialize
var json = JsonSerializer.Serialize(user);        // ~50μs for a complex object
var bytes = Encoding.UTF8.GetBytes(json);         // ~10μs
// ... send over network ...
var responseJson = await response.Content.ReadAsStringAsync();  // ~20μs
var user = JsonSerializer.Deserialize<User>(responseJson);      // ~70μs
var tier = user.Tier;                                           // Finally

पर कॉल करें, कि शुद्ध सीपीयू के ~1400s है... इससे पहले कि नेटवर्क में शामिल हो जाता है।

अब कि एक फोन श्रृंखला के पार गुणा:

  • अनुक्रम सेवा द हवाई जहाज़ निवेदन (15046s)
  • सेवा सीरियल उपयोक्ता सेवा निवेदन (15046s)
  • उपयोक्ता सेवा डी हवाई जहाज़िंग निवेदन (50 फिल्टरs)
  • उपयोक्ता सेवा सीरियल प्रतिक्रिया (150 वचन)
  • अनुक्रम सेवा द हवाईण उपयोगकर्ता प्रतिक्रिया (15040s)
  • सेवा सीरियलेशन निवेदन (150 उनपर)
  • और फिर पर

5 शून्य श्रृंखला में, आप घटा रहे हैं ~1.5m सिर्फ SDe पर - और यह आशावादी JSON सीरियलीकरण है. यदि आप XML, प्रोटोकॉल का उपयोग कर रहे हैं प्रतिबिंब के साथ, या procras में, कि 2-10x के द्वारा कि गुणा कर रहे हैं.

जी हाँ, आप जैसे तकनीकों से इसे कम कर सकते हैं .नेट में JSON स्रोत पीढ़ी:

[JsonSerializable(typeof(User))]
internal partial class UserJsonContext : JsonSerializerContext { }

// ~30-40% faster than reflection-based serialization
var json = JsonSerializer.Serialize(user, UserJsonContext.Default.User);

लेकिन आप अभी भी सीरियलीकरण कर रहे हैं. आप सिर्फ कर थोड़ा सामग्री बना दिया है. एक एकल के रूप में, कर शून्य है.

एक वास्तविक उदाहरण: सरगंत विपत्ति

मैं एक बार प्रोफाइल इस संरचना के साथ एक पता खोज प्रणाली (सभी कुल के बर्तन में):

ASP.NET API → Go Service (fan-out) → ASP.NET Search Service → Elasticsearch

सेवा में बहुत से डाटा स्रोत तथा एकgrogid परिणाम को नियंत्रित किया जा रहा है. प्रत्येक निवेदन का अर्थ था बहुत से सीरियल सीमा के पार.

एक सामान्य पता खोज के लिए कमी:

  • प्रमाणीकरण संवाद
  • नेटवर्क: UNERTE( क्लस्टर लोड करके फ़ाइलें)
  • जाओ सेवा: डेज़ीआयरेशन निवेदन (40format)
  • जाओ सेवा: बहुत से बैकएण्ड्स (60× निक्सs) के लिए प्रायोगिक अनुरोध
  • नेटवर्क: गोफिक अप्रयोगात्मक खोज (एसटीएएस)
  • खोज सेवा: डेज़ीआयरेशन निवेदन (90 पाकर)
  • खोज सेवा: एल- सर्च क्वैरी बनाएं, सीरियल- खोज (20+2)
  • नेटवर्क: सर्च एल- सर्च (विध)
  • एलई- सर्च: डेंट- लॉकिंग क्वैरी, सीरियल परिणाम (जैसे कि खोज ~5ms, सेपर्ड खोज ~200s)
  • नेटवर्क: अल- सर्च खोज (विध)
  • खोज सेवा: ASSS (300s), डोमेन मॉडल को मैप करता है, सीरियल आकार (180)
  • नेटवर्क: खोज
  • जाओ सेवा: सभी बैकएण्ड्स से डेफ्लिंग प्रतिक्रिया (150 × N), agipt, सीरियल (8040s)
  • नेटवर्क: गोफिक अप्रयोगात्मक अ. (विष्टि)
  • एनईएस. NENT API: अंतिम स्वतः चालू प्रतिक्रिया (120format)

3-बैक- आउट प्रशंसकों के लिए:

  • कुल सेवर्ड थैंडर: एल- सर्च प्रारंभ होने से पहले ~2ms
  • कंटेनरों के बीच नेटवर्क कवर: ~ 2-3ms
  • वास्तविक खोज + व्यावसायिक तर्क: ~6ms

हम सरड पर लगभग उतनी ही समय बिताते थे जितना कि हम वास्तविक खोज पर थे ।

कीमत अपने आप के लिए जा सेवा नहीं थी - प्रशंसक के लिए प्रयोग के लिए अर्थ बनाया गया था. कीमत था सेवा सीमाएँहर बरतन के किनारे का मतलब था, सीधे - सीधे नेटवर्क पर निशान लगाना ।

एक एकल ही प्रशंसक तर्क में:

  • एक ही एल- ग्राफ खोज
  • एक सेमग्रेजी तर्क
  • शून्य सेपरेशन सेवरडी (सिर्फ विधि कॉल)
  • ~40% कम से कम कुल राशि

यह खर्च:

  • वस्तु जटिलता के साथ स्केल (अनुभिक वस्तुओं, संग्रह, पॉलीफ़ाइसिस)
  • काल गहराई से मिश्रितता
  • प्रत्येक निवेदन पर लिखे सीपीयू इसे रद्द नहीं कर सकता है)
  • GC दबाव को बढ़ाता है ( स्ट्रिंग/हाट ऐक्सिनक्स से स्थिर करता है)
  • जब आप प्रत्येक सेकंड के सैकड़ों निवेदन कर रहे हैं तो तेज जोड़ता है

एक एकलता में, यह लागत शून्य है. वस्तु पहले से ही स्मृति में है.

परफ़ॉर्मेंस कथा: म्यूज़ वी.

यहाँ एक आम बिक्री के राइस है: "मिरो सुधार प्रदर्शन."

यह पीछे है.

माइक्रोफ़ॉर्मेट होते हैं धीमा एक ही संसाधनों की गणना के लिए हम क्या मतलब के बारे में सटीक हो सकता है:

स्ट्राइकhaiti. kgm (q) प्रति सेकेंड को सीपीयू को कोर में रखता है:

  • मोनोलीथ: उच्च - शून्य सेवरे, शून्य नेटवर्क हॉप, प्रत्यक्ष विधि कॉल
  • माइक्रोफ़ॉर्मेट: कम - से - से - से - से - कम ऊपरी, नेटवर्क में देर हो चुकी है, तार - तार

स्केल्स (घर जोड़ने के द्वारा अधिक कुल निवेदन संभालता है):

  • मोनोलीथ: खड़े स्केलिंग द्वारा सीमित करें (ब्लिक मशीनों)
  • माइक्रोफ़ॉर्मेट: बोतल की सेवाओं के लिए आड़ा - जोड़ें और अधिक उदाहरण दीजिए

माइक्रोफ़ॉर्म्स आपको देने देते हैं मापक स्वतंत्र.. अपनी सूची सेवा 10x संसाधनों की आवश्यकता है लेकिन अपनी उपयोगकर्ता सेवा नहीं करता है, आप उन्हें अलग से स्केल कर सकते हैं। यह मूल्यवान है जब आप इसकी जरूरत है.

लेकिन यह एक प्रदर्शन अनुकूल नहीं है. स्केलिंग रणनीतिऔर यह कर के साथ आता है.

आधुनिक मोनोथें भी स्केल कर सकते हैं

तर्क "प्रयोगियों पैमाने बेहतर है" 2010 में और अधिक समझ बनाया जब सर्वर 4-8 कोर था.

आधुनिक सर्वरों में 3228 कोर होते हैं. एक भी मशीन पूरी तरह से मौजूदा ऑपरेशनों को पार कर सकता है.

उदाहरण के लिए, जैसे - जैसे आप पैटर्न इस्तेमाल करते हैं, वैसे - वैसे इसे इस्तेमाल कीजिए । एफीरल मार्टिस, आप कर सकते हैं:

// Process thousands of concurrent operations in a monolith
services.AddEphemeralWorkCoordinator<TranslationRequest>(
    async (request, ct) => await TranslateAsync(request, ct),
    new EphemeralOptions { MaxConcurrency = Environment.ProcessorCount * 4 });

// Bounded, observable, efficient concurrent processing
// No network overhead, no SerDe, no container orchestration
// Can handle 10k+ req/sec on a single machine

यह आपको देता है:

  • समानांतरता: काम से सारा कोर भर जाता है
  • ऑब्सर्वेटरी: ट्रैक स्थगित/ अक्रिय ऑपरेशन
  • यु. पू.: सीमाबद्ध कतार, स्मृति समाप्त होने से रोकती है
  • शून्य कंचा: कोई सीरियलीकरण नहीं, कोई नेटवर्क, कोई वितरित बग नहीं

जब आप करें एक मशीन से अधिक स्केल करने की जरूरत है, आप कर सकते हैं:

  1. लोड करने के बाद बहुत से उदाहरणों को चलाएं (लंबपूर्ण स्केलिंग)
  2. अतुल्यकालिक कार्य वितरण के लिए एक डाक पैटर्न इस्तेमाल करें
  3. कुंजी द्वारा पार्टीशन (पंक्ति, क्षेत्र, आदि)

आप अभी भी एक एकल लाइन चल रहे हैं. आप सिर्फ इसे कई बार तैनात किया है.

बिंदु: "अनुप्रयोग" के लिए माइक्रोस्कोप में विभाजित मत करें जब अलग हो जाए विशिष्ट अवयव के स्वतंत्र स्केलिंग बस ऑपरेशन के ऊपर की ओर ले जाता है.

कॉलरिएन्ट लोड

माइक्रोस्कोप जटिलता को कम नहीं करते, वे इसे जला देते हैं.

"मौजूदा सेवा" को अभी भी संदर्भ की आवश्यकता है:

  • यह कौन कहता है?
  • "सही" क्या मतलब है?
  • जब यह नीचे है क्या होता है?
  • रोलबैक योजना क्या है?
  • ग्राफ क्या है?

लोग इसे कम महत्त्व देते हैं क्योंकि आरेख इसे छुपाता है.

संस्करण और ध्यान लगाना

हर सीमा एक अनुबंध हो जाता है.
हर अनुबंध हो जाता है:

  • संस्करणिंग नियम
  • सुसंगतता की गारंटी
  • स्कीमा सेटिंग
  • Camoded अप आप आप नहीं किया था महसूस किया

आप "सिर्फ एक साथ सब कुछ तैनात कर सकते हैं।"

यही कारण है कि पंचलाइन है: अगर आप एक साथ सब कुछ तैनात करते हैं, आप एक एकली का निर्माण किया है। बस एक बुरा एक।

मान से पहले औज़ारिंग

शुरू में जो खर्च होता है, वह हमेशा एक जैसा होता है:

  • सेवा खोज
  • गुप्त प्रबंधन
  • यु. पू.
  • मध्यीकृत लॉगिंग
  • मेट्रिक्स तथा चेतावनी
  • सीआई/सीडी टैम्प्लेट्स
  • स्थानीय dev कहानी जो दर्दनाक नहीं है
  • डिपेंडेंसी प्रबंधन
  • बिना रोये सब कुछ चलाने का रास्ता

इस जहाजों उत्पाद मूल्य में से कोई भी.

और अधिकांश टीम यह करते हैं इससे पहले कि वे उत्पाद जटिलता के लायक साबित कर दिया है।

यह सबसे बड़ी गलती है: आप मूल्य भुगतान से पहले रस्म कर भुगतान करते हैंजैसे हर दिन के खड़े जो संरेखण के बिना बेकार समय बरबाद करते हैं, माइक्रोस्कोप औपचारिक रचना बन सकते हैं: सुंदर पर नज़र रखना, महँगी रखना, और वास्तव में समस्या से कनेक्ट करना जो आप हल कर रहे हैं.

इन खर्चों को एक साथ ले लो, ये गायब नहीं हैं - वे परिसर. और वे सेट करते हैं कि क्या पहले माइक्रोस्कोप की जरूरत है या नहीं.

लोग क्या भूल जाते हैं: मनुष्यों और दल

विश्‍व - दर्शन

अन्य इंजीनियरों को प्रभावित करने के लिए नहीं.
आरेख संतुष्ट करने के लिए नहीं.
आप नहीं है एक मंच टीम को उचित ठहराने के लिए नहीं है.

टीम आकार और तैनाती मामले पैटर्न कैटलॉग से अधिक से अधिक है.

  • यदि एक टीम पूरी सड़कमैप को अपनाती है, तो आम तौर पर वह ज़्यादा तेज़ और सुरक्षित होती है ।
  • यदि आप अभी भी तंत्र के अंत की समझ में आता है, माइक्रोस्कोप उस स्पष्टता को कम करेगा.
  • अगर आपके पास पक्की ज़मीन की सीमाएँ नहीं हैं, तो माइक्रोस्कोप से काम आ सकता है एपीआई के माध्यम से - जो कि धीमी गति से उपलब्ध है.

यह भौतिक है।

आप इसे पसंद करेंगे या नहीं ।

माइक्रोफ़ॉर्म्स ऑटोनोम नहीं बना सकते हैं. वे इसकी जरूरत है.

परागकणक की अनुमति

अधिकांश व्यवस्थाओं को एक औपचारिकता के रूप में शुरू करना चाहिए ।

ए मह्त्वपूर्ण संदेशmoltiptip for checkbox है:

  • एक तैनाती इकाई
  • एक बंद करें
  • डिबग करने के लिए एक जगह
  • एक व्यक्‍ति स्थिति के प्रति सतत दृष्टिकोण
  • लेकिन वास्तविक आंतरिक सीमाओं के साथ

इसका अर्थ है:

  • सुस्पष्ट निर्भरता के साथ डोमेन मॉड्यूल
  • कोड में मालिक साफ करें
  • कोई "सभी संदर्भ" नहीं
  • कोड बेस के अंदर लागू होता है

बिंदु हमेशा के लिए एकल रहने के लिए नहीं है। बिंदु करने के लिए है इससे पहले कि आप उन्हें दूर कर दें, उसकी सीमाओं का लाभ उठाइए.

एक एकल एकल बल जिन्हें आप हल करने के लिए कौशल का ढोंग करना सीख सकते हैं:

  • डोमेन मॉडलिंग (सही सीमाएँ, फ़ोल्डर सीमाएँ नहीं)
  • चिंता से अलग ("हमने सेवा नहीं की)
  • जांच यूटिलिटीज़
  • अनुशासन बदलें
  • पता है कि आपके तंत्र असल में क्या करता है

अगर आप एक स्वच्छ momolly नहीं बना सकते हैं, माइक्रोफ़ॉर्म्स आपको बचा नहीं सकते. वे सिर्फ गड़बड़ बांट देंगे.

अच्छा किनारा डिज़ाइन: उस पैटर्न जो बाद में स्केल करता है

सही एकल डिज़ाइन आपको देता है माइक्रोफ़ॉर्मेट फ़ैसले के लिए टालें बिना अपने आप को अंदर कर सकते हैं.

आउटबॉक्स पैटर्न: वितरण बिना वितरण

एक सबसे बढ़िया उदाहरण है गई- डाक पैटर्न - सुसंगतता और अतुल्यकालिक प्रक्रिया प्राप्त करने का एक तरीका अंदर बाद में वितरण के लिए एक शुद्ध मार्ग के साथ।

के बजाय:

// Tightly coupled synchronous code
public async Task PlaceOrder(Order order)
{
    await _orderRepo.Save(order);
    await _emailService.SendConfirmation(order);  // Blocks on external service
    await _inventoryService.Reserve(order.Items); // Blocks on another service
}

आप लिखते हैं:

// Outbox pattern: write events to a table
public async Task PlaceOrder(Order order)
{
    await using var transaction = await _db.Database.BeginTransactionAsync();
    
    // Save order
    await _orderRepo.Save(order);
    
    // Write events to outbox table (same transaction)
    _db.OutboxMessages.Add(new OutboxMessage
    {
        EventType = "OrderPlaced",
        Payload = JsonSerializer.Serialize(order),
        CreatedAt = DateTime.UtcNow
    });
    
    await _db.SaveChangesAsync();
    await transaction.CommitAsync();
    
    // Background worker picks up outbox events and publishes them
}

यह आपको क्या देता है:

  • लेन देन संगतता: घटनाएँ और आंकड़ा एक साथ या नहीं
  • बिगड़ना: ई- मेल/ इनफेक तर्क मिकांस्क चलाता है, ब्लॉक अनुक्रम बनाने का आदेश नहीं है
  • सुधार यूटिलिटीज़: घटनाएँ तब भी बनी रहती हैं, जब बाहरी व्यवस्थाओं को मिटाया जा रहा हो
  • साफ करने का पथ: बाद में, बाहरी डाक प्रबंधक को केपका/ रब्बीएमQ के बिना बदला क्रमात्मक तर्क के लिए बदलें

वह खण्डकंकर नमूना परियोजना उत्पादन में इस पैटर्न को प्रदर्शित करें:

// Mostlylucid.SegmentCommerce/Services/Queue/PostgresOutbox.cs
public class PostgresOutbox
{
    public async Task PublishAsync<T>(string eventType, T payload)
    {
        var message = new OutboxMessage
        {
            EventType = eventType,
            Payload = JsonSerializer.Serialize(payload),
            CreatedAt = DateTime.UtcNow
        };
        
        _db.OutboxMessages.Add(message);
        // Caller commits transaction
    }
}

// Background service
public class OutboxProcessor : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            var pending = await _db.OutboxMessages
                .Where(m => !m.Processed)
                .OrderBy(m => m.CreatedAt)
                .Take(100)
                .ToListAsync();
                
            foreach (var message in pending)
            {
                await ProcessMessage(message);
                message.Processed = true;
            }
            
            await _db.SaveChangesAsync();
            await Task.Delay(1000, stoppingToken);
        }
    }
}

यह आज के एक सेब में दौड़ता है. जब आप पैमाने पर की जरूरत है:

  1. पृष्ठभूमि कर्मचारी को संदेश बस उपभोक्ता के साथ बदलें
  2. बाहरी घटनाओं को केफका/कुटएम में भेजे गए@ info: whatsthis
  3. अनुक्रम स्थिति कोड परिवर्तन नहीं करता है

आप वितरण कर कर के बिना माइक्रोफ़ॉर्म्स को तैयार किया है.

कुछ और आदर्श जो ज़रूरी हैं

  • सीक्यूआर (हल): अलग पढ़ने/ लिखें मॉडल यहां तक कि वे एक DB साझा करते हैं
  • **घटना ईगलिंग (प्रयोग)**सिर्फ न्यूक्लासिक निगमों के लिए
  • फ्लैग्स: रिहा होने से देवरी तैनाती
  • पृष्ठभूमि कार्य: ब्लॉक निवेदन नहीं, प्रक्रिया अतुल्यकालिक रूप से

इनमें से किसी को भी वितरण की ज़रूरत नहीं है ।

जब माइक्रोस्कोप असल में समझ लेते हैं

इसलिए यह ज़रूरी नहीं कि हम अपने शरीर के अंगों के बारे में सोचें ।

महत्वपूर्ण सवाल यह नहीं है "क्या हम माइक्रोस्कोप का उपयोग करें?" यह है: क्या इसके फायदे ऑपरेशन के कर से भी बढ़कर हैं?

जैसे कि चयनित व्यक्ति के बीच में छोटा स्थानीय मॉडल और फ्रन्टर, यह समझ के बारे में है जहाँ जटिल रूप से काम आता है और कौन - से असफल तरीक़े आप प्रदान कर सकते हैं ।

अच्छा ट्रिगर

  • टीम झगड़ा सहायक है: टोली एक दूसरे को साप्ताहिक ब्लॉक
  • स्वतंत्र रक्षकों आवश्यक हैं: घर की साफ - सफाई, हर डोमेन में अलग - अलग होती है
  • स्केल असमान है: एक उपतंत्र को 10x संसाधन और अकेलेपन की ज़रूरत होती है
  • अलग - अलग बातों से दूर रहने से चूकना: एक घटक बाकी को नीचे नहीं ले जाना चाहिए
  • पुनर्भरण/ डाटा गोपनीयता अनिवार्य है: सीमाएँ चोरी नहीं कर रहे हैं
  • संरचना पहले से ही बहु-टेम हैमालिक है और स्थिर है

खराब ट्रिगर

  • "हम स्केल कर सकते हैं"
  • "netlix यह करता है"
  • "सही अभ्यास"
  • "यह अच्छा दिखेगा"
  • "हमारा एकलपन गड़बड़ है, तो हम इसे अलग करके ठीक कर देंगे"

अगर आपके कारण ये शब्द हैं मई, अंत, या भविष्य- रोधी, शायद यह एक कारण नहीं है.

तकनीकी वास्तविकता: असल में जीव - विज्ञानी असल में कौन - से लाभ उठाते हैं

चलो ठोस मिलता है. यहाँ क्या परिवर्तन जब आप एक एकल लाइन में विभाजित करते हैं.

काल चांस तथा लेटिएन्स

मोनोलीथ:

public async Task<Order> PlaceOrder(OrderRequest request)
{
    var user = await _userService.GetUser(request.UserId);
    var inventory = await _inventoryService.CheckStock(request.Items);
    var price = _pricingService.Calculate(request.Items, user.Tier);
    
    var order = new Order { /* ... */ };
    await _orderRepository.Save(order);
    await _emailService.SendConfirmation(order);
    
    return order;
}

कुल देर हो रही है: ~50ms (--staks में कॉल + 2 DBeies)

माइक्रोफ़ॉर्म्स:

public async Task<Order> PlaceOrder(OrderRequest request)
{
    // HTTP call to User Service (network + TLS + serialization)
    var user = await _httpClient.GetAsync<User>($"http://user-service/users/{request.UserId}");
    
    // HTTP call to Inventory Service
    var inventory = await _httpClient.PostAsync<StockResult>(
        "http://inventory-service/check", request.Items);
    
    // HTTP call to Pricing Service
    var price = await _httpClient.PostAsync<PriceResult>(
        "http://pricing-service/calculate", 
        new { items = request.Items, tier = user.Tier });
    
    // HTTP call to Order Service
    var order = await _httpClient.PostAsync<Order>(
        "http://order-service/orders", request);
    
    // Event published to message bus
    await _messageBus.Publish(new OrderPlaced { OrderId = order.Id });
    
    return order;
}

कुल लेटिएशन: ~400ms (इस पर भी आशावादी 5080ms प्रति HTTP कॉल वास्तविक वातावरण + संदेश बस को प्रकाशित करता है - ~20m)

जो कुछ तुम लोग (ख़ुदा की राह में) किया करते हो

  • हर सेवा स्वतंत्र रूप से तैनात कर सकती है
  • प्रक्षेपास्त्र और प्रक्षेपन क्रमों से अलग - अलग स्केल कर सकते हैं
  • ई- मेल में असफल अनुक्रम बनाने में असफल (जैसे लागू होता है)

तुमने जो भुगतान किया:

  • ~8x देरी
  • 4 नए असफलता बिन्दुओं (कोई सेवा नीचे/धीमा) हो सकती है
  • नेटवर्क, डीएनएस, TLS झुट हर कॉल पर
  • सीरियलाइजेशन/ अपॉथाइजेशन अप ( पिछले खण्ड को देखें)
  • तर्क, सर्किट ब्रेकर्स, टाइम- आउटः
  • डिबग असफल में निर्यात करें

रिपिंग में त्रुटि

मोनोलीलीफिंग में त्रुटि:

try
{
    var order = await PlaceOrder(request);
    return Ok(order);
}
catch (InsufficientStockException)
{
    return BadRequest(new { error = "Out of stock" });
}
catch (Exception ex)
{
    _logger.LogError(ex, "Order placement failed");
    return StatusCode(500);
}

माइक्रोफ़ॉर्मेट त्रुटि नियंत्रण:

try
{
    // Call User Service
    var user = await _httpClient.GetAsync<User>($"http://user-service/users/{request.UserId}");
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.NotFound)
{
    return NotFound(new { error = "User not found" });
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.ServiceUnavailable)
{
    // Retry with exponential backoff?
    // Circuit breaker opened?
    // Fail fast or degrade gracefully?
    _logger.LogWarning("User service unavailable, retrying...");
    await Task.Delay(TimeSpan.FromMilliseconds(100));
    // ... retry logic ...
}
catch (TaskCanceledException ex)
{
    // Timeout - was the request processed? Do we retry?
    _logger.LogError("User service timeout");
    return StatusCode(503, new { error = "Service temporarily unavailable" });
}

try
{
    var inventory = await _httpClient.PostAsync<StockResult>(
        "http://inventory-service/check", request.Items);
}
catch (HttpRequestException ex) when (ex.StatusCode == HttpStatusCode.BadRequest)
{
    // Business error from remote service
    var errorDetails = await ex.Content.ReadAsAsync<ErrorResponse>();
    return BadRequest(new { error = errorDetails.Message });
}
catch (HttpRequestException ex)
{
    // Which service failed? Network issue? Service down?
    // Do we have a fallback? Cached data? Fail fast?
    _logger.LogError(ex, "Inventory service failed");
    // Maybe try a backup instance?
    // ... more retry logic ...
}

// And repeat for every service call...

हर नेटवर्क कॉल प्रस्तुत करता है:

  • समय समाप्ति घटना
  • नेटवर्क असफल
  • सेवा अभ्यता
  • आंशिक असफल (माना, भेजा नहीं गया)
  • सत्यापित करने का फिर कोशिश करें ( आपकी फिर कोशिश करें)
  • लेन - देन के सपने

न्याय - समिति

मोनोली तैनाती:

# Build
dotnet publish -c Release

# Run migrations
dotnet ef database update

# Deploy
docker push myapp:v1.2.3
kubectl set image deployment/myapp myapp=myapp:v1.2.3

# Rollback if needed
kubectl rollout undo deployment/myapp

माइक्रोफ़ॉर्म्स तैनातिंग:

अब आप आदेश स्ट्रक्चर बदल रहे हैं. Order इसमें शामिल है UserTier सीधे (कार्य के लिए सामान्यीकृत).

# 1. Deploy Pricing Service v2 (understands both old and new Order format)
kubectl set image deployment/pricing-service pricing-service=pricing:v2.0.0

# 2. Wait for rollout and monitor
kubectl rollout status deployment/pricing-service
# Check metrics - is v2 working with old order format?

# 3. Deploy Order Service v2 (starts sending new format)
kubectl set image deployment/order-service order-service=order:v2.0.0

# 4. Monitor for errors
# If Pricing v2 has a bug, you can't just rollback Order service
# You have to rollback both in reverse order

# 5. Deploy User Service v2 (stops including tier in response)
# But wait - old Order Service instances might still be running!
# Need zero-downtime rollout or maintain backward compat

# 6. Eventually clean up old code paths in Pricing Service v3
# (6 months later because you're scared to remove backward compat)

माइक्रोस्कोप से, प्रत्येक परिवर्तन विभिन्‍न सेवाओं को पार करता है ।

  • पीछे सुसंगतता विंडो
  • सेवा के पूर्ण हिस्से में फ्लैग
  • निर्देशांक रोलआउट
  • विस्तारित जाँच (संपूर्ण जाँच A1 + सेवा B2, सेवा A2 + सेवा B1, आदि.)

लेकिन इसमें अनुशासन, साधन और अनुभव की माँग की जाती है कि अधिकांश टीम दुःख के वर्षों के बाद ही केवल लाभ उठाते हैं ।

डिबगिंग अनुभव

मोनोलीर्ड बग रपट: "यारमेंट प्रीसीनियम उपयोक्ताों के लिए असफल"

// Set breakpoint in PlaceOrder
// Step through each call
// User tier is null - ah, there's the bug
// Fix, test, deploy

माइक्रोफ़ॉर्मेट बग रिपोर्ट: "यारमेंट प्रीसीनियम उपयोक्ताों के लिए असफल"

# 1. Check logs - which service failed?
kubectl logs -l app=order-service --tail=100

# 2. Oh, it's calling Pricing service. Check those logs
kubectl logs -l app=pricing-service --tail=100

# 3. Grep for correlation ID across all services
stern -l app=order-service,app=pricing-service,app=user-service \
  | grep "correlation-id-xyz"

# 4. Reconstruct the call chain from distributed traces
# Open Jaeger/Zipkin, find the trace
# User service returned 200 OK
# Pricing service returned 400 Bad Request
# Error: "user.tier is required"

# 5. Check User service - did it send tier?
# Look at schema version - ah, User v1.2 stopped sending tier
# When did that deploy? Was Pricing service updated?

# 6. Check API contracts
# Pricing expects tier, User stopped sending it
# Who approved this change?

# 7. Fix requires coordinating two teams
# Can't just deploy a fix - need contract negotiation

यह सच्चाई है: बग जो 5-मिमेटिक्स सुधार थे बहु-टेम जांच हो सकता है.

यदि यह अत्यधिक, अच्छा लगता है ।

कैसे सुरक्षित बनाए रखें: मोनोलिपिथ माइक्रोस्कोप

माइक्रोफ़ॉर्म्स एक ही रास्ते का दरवाज़ा हैं। एक तरह से उन्हें इलाज करें।

सुरक्षित पथ उबाऊ लगता है:

1 सब्र रखिए ।

अगर आप एमिलेथ के अंदर सीमा नहीं खींच पा सकते हैं (प्रयोग योग्य निर्भरता के साथ), तो आप इसे सुरक्षित नहीं निकाल सकते.

सबसे पहले समुद्री डाकू जाओ.

2 लिखने से पहले पढ़ने से पहले गुम है.

पढ़ने में आसान है:

  • किसानों में कम
  • कम सुसंगतता की आवश्‍यकताएँ
  • कम रोलबैक सपने

यदि अलग होने की जरूरत है तो पहले पढ़ने के मॉडल बाहर ले जाएँ.

3 सिंक से पहले सिंक की वरीयता दें.

के- एम- प्लॉट सेवा काल जंजीरों तैयार किया गया है.

आईनेप संदेश उत्पन्न करता है:

  • बफरिंग
  • रेफ़रेंस
  • आप वास्तव में बच सकते हैं

अंत की घटनाओं और तथ्यों को अलग करने के द्वारा शुरू करें, नहीं ।

4. Strok, फिर से नहीं

कोई बड़ा बंगा.
नहीं "हम इसे ठीक से फिर से लिखना होगा।"

नाप तौल कर तौल कर देना और तौल में कमी करना।

यदि आप समझा नहीं सकते कि क्यों एक सेवा स्वतंत्र है, तो यह अस्तित्व में नहीं होना चाहिए.

दूर ले जाएँ: रोगाणुओं को केवल पैसा मिलता है अगर आप व्यापार के ट्रेफ्स समझते हैं

वे एक परिणाम हैं ।

जटिलता का सौदा किया जाना चाहिए. वे एक ऋणी साधन नहीं हैं ।

व्यापार- ऑफ समीकरण सरल है:

Microservices Value = (Team Autonomy + Independent Scaling + Failure Isolation)
                     - (Latency Tax + SerDe Tax + Operational Overhead + Coordination Cost)

अधिकतर टीमों के लिए - विशेष रूप से मंच के लिए या एकल-कार उत्पादों पर अधिकार. आप लाभों के लिए बहुत लागत आप अभी तक की जरूरत नहीं है.

लेकिन जब आप हैं:

  • 5+ टीमें एक दूसरे के पैर पर कदम
  • वितरण कतार दिनों में मापी गई
  • सबसिस्टम अलग अलग स्केलिंग के साथ आवश्यकताएँ
  • डेटा पृथकता के लिए पुनर्भरण आवश्यकताएँ

... तो बाएँ तरफ जीतने के लिए शुरू होता है. कर सही हो जाता है.

एक निर्णय फ्रेमवर्क

इन सवालों के क्रम में पूछिए:

  1. क्या एक टीम अभी भी इस अंत से आगे बढ़ सकती है?
    ✔ जी हाँ: एक - दूसरे से अलग रहिए ।

  2. टीमों को एक दूसरे के रिलीज चक्र से बंद कर दिया है?
    ✔ जी हाँ: माइक्रोस्कोप से काम करने में मदद मिल सकती है ।

  3. हमारे पास वितरित तंत्रों को चलाने के लिए ऑपरेशन - पेशियाँ हैं?
    ▪ नहीं: पहले निर्माण कीजिए ।

  4. हम ट्रेस, डिबग, और बहुत सी सेवाओं को बिना भारी कर सकते हैं?
    आप तैयार नहीं हैं. हाँ: हो सकता है.

  5. क्या हमने पहले कोड में सीमाएं सिद्ध की हैं?
    जी हाँ: दूसरों के साथ अच्छा रिश्‍ता बनाए रखना सुरक्षित है ।

अगर आप विश्वास के साथ पिछले सवाल 3 नहीं पा सकते हैं, तो आप माइक्रोस्कोप के लिए तैयार नहीं हैं - और यह ठीक है. नाव की बनावट एक होड़ लगाने का फायदा है ।

सबसे सफल उत्पादन पहले एक ब्लैथ के रूप में बनाया गया: GiBhb, स्टैकिस, बेसकाम्प. वे केवल तब वितरित तंत्रों में उन्‍नति करते थे जब अंग - संबंधी पीड़ा इसकी माँग करती थी ।

आपका काम सबसे प्रभावशाली रचना का निर्माण करने के लिए नहीं है. यह मूल्य को बचाने के लिए है जब तक कि दुर्घटनात्मक जटिलताओं को कम किया जा रहा है.

और कोई ग्राहक कभी अतिरिक्त भुगतान नहीं किया है क्योंकि अपने तंत्र कायरका इस्तेमाल किया है.

कभी कभी इसका अर्थ होता है कि माइक्रोस्कोप का मतलब होता है। आम तौर पर, इसका मतलब है एक अच्छी तरह से पालन - पोषण करना और उस तरह से रखने के लिए अनुशासन।

Finding related posts...
logo

© 2026 Scott Galloway — Unlicense — All content and source code on this site is free to use, copy, modify, and sell.