de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

C4 मॉडल स्तर 3 गहन अध्ययन: आंतरिक संरचना और उत्तरदायित्वों को उजागर करने के लिए घटक आरेखों को महारत हासिल करना

C4 घटक आरेख क्या है?

घटक आरेख हैस्तर 3साइमन ब्राउन के C4 मॉडल में। यह एक विशिष्ट कंटेनर में जूम करता हैएक विशिष्ट कंटेनर (स्तर 2 कंटेनर आरेख से) दिखाने के लिए:

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI  Tools - ArchiMetric

  • वहतार्किक निर्माण ब्लॉक (घटक) जो उस कंटेनर के बनावट का हिस्सा हैं।

  • उन घटकों के तरीके के बारे मेंएक दूसरे के साथ बातचीत करते हैं एक दूसरे के साथ।

  • उत्तरदायित्व औरकार्यान्वयन प्रौद्योगिकियाँ (वर्गों के ऊपर एक उच्च स्तर पर — स्प्रिंग बीन्स, मॉड्यूल, सेवाएँ, कंट्रोलर, फेसेड्स आदि के बारे में सोचें)।

  • महत्वपूर्णइंटरफेस याअनुबंध घटकों के बीच (अक्सर संबंधों के माध्यम से निहित)।

महत्वपूर्ण स्पष्टीकरण: C4 में एक ‘घटक’ हैनहीं एक वर्ग नहीं। यह एकवर्गों का तार्किक समूह एक अच्छी तरह से परिभाषित इंटरफेस के पीछे — कुछ ऐसा जिसकी स्पष्ट उत्तरदायित्व हो, जिसे कंटेनर के भीतर कुछ हद तक स्वतंत्र रूप से विकसित/परीक्षण/डेप्लॉय किया जा सकता है, लेकिन वहनहीं एक कंटेनर की तरह अलग से डेप्लॉय किया जा सकता है।

घटकों के उदाहरण:

  • REST कंट्रोलर / वेब कंट्रोलर

  • सेवा / उपयोग केस / एप्लिकेशन सेवा

  • रिपॉजिटरी / डेटा एक्सेस ऑब्जेक्ट

  • डोमेन मॉडल / एंटिटी

  • सुरक्षा / प्रमाणीकरण मॉड्यूल

  • नोटिफिकेशन सेंडर

  • बाहरी प्रणाली के लिए फेसेड

  • व्यावसायिक नियम इंजन

  • कैशिंग लेयर

आरेख बना रहता है तार्किक / कार्यान्वयन-अनाडंब बहुत अच्छा — कोई क्लास विशेषताएं, विधियों के हस्ताक्षर, या पूर्ण UML क्लास विवरण नहीं (वह स्तर 4 कोड है, जो वैकल्पिक और दुर्लभ है)।

कंपोनेंट आरेख बनाने का समय

कंपोनेंट आरेख बनाएं (और बनाए रखें) केवल तभी जब:

  • चुने गए कंटेनर है जटिल पर्याप्त कि इसकी आंतरिक संरचना इसके नाम और विवरण से अकेले स्पष्ट नहीं है।

  • नए टीम सदस्य (विशेष रूप से बैकएंड विकासकर्ता) अक्सर पूछते हैं: “फीचर एक्स को इस सेवा/एपीआई के अंदर वास्तव में कैसे लागू किया जाता है?”

  • आप रिफैक्टरिंगविभाजित कर रहे हैं, या निकाल रहे हैं कंटेनर के अंदर तर्क और सीमाओं/जिम्मेदारियों को स्पष्ट करने की आवश्यकता है।

  • आप विस्तृत कर रहे हैं डिज़ाइन चर्चाएंकोड समीक्षा, या ऑन-कॉल हैंडओवर एक विशिष्ट कंटेनर के लिए।

  • आप दस्तावेज़ीकरण करना चाहते हैं महत्वपूर्ण वास्तुकला निर्णय एक कंटेनर के भीतर (उदाहरण के लिए, हेक्सागोनल वास्तुकला, ऊर्ध्वाधर काट, CQRS अलगाव, सुरक्षा लागू करने का बिंदु)।

  • आपने पहचान लिया है तकनीकी ऋणगॉड क्लासेस, या टाइट कपलिंग एक कंटेनर के भीतर और सफाई से पहले स्थिति को दृश्याकृत करना चाहते हैं।

  • आप सीनियर डेवलपर्स/आर्किटेक्ट्स को ओनबोर्ड कर रहे हैं जिन्हें मॉड्यूल संरचना तेजी से समझने की आवश्यकता है।

कृपया न करें इनके लिए कंपोनेंट डायग्राम बनाएं:

  • सरल कंटेनर (एक कंट्रोलर + एक सेवा + एक रिपॉजिटरी वाला CRUD API — स्पष्ट संरचना)।

  • अधिकांश माइक्रोसर्विसेज (अक्सर इतने छोटे होते हैं कि कंटेनर स्तर पर पर्याप्त होता है)।

  • फ्रंट-एंड कंटेनर (React/Vue एप्लिकेशन — आमतौर पर कंपोनेंट ट्री या स्टोरीबुक के साथ बेहतर दिखाया जाता है)।

  • जब स्तर 2 (कंटेनर) + अच्छी कोड संरचना/नामकरण पहले से ही सब कुछ संदेश देता है।

साइमन ब्राउन सुझाव देते हैं: अधिकांश टीमें स्तर 1 + 2 तक रुक सकती हैं। केवल उन के लिए स्तर 3 पर जाएंजटिल / जोखिम भरा / मुख्य / उच्च बदलाव वाला कंटेनर।

कंपोनेंट डायग्राम का उपयोग क्यों करें? (मुख्य लाभ)

  • आ interनल जिम्मेदारियों को स्पष्ट करता है — चिंता के विभाजन को दिखाता है (उदाहरण के लिए, कंट्रोलर्स बनाम सेवाएं बनाम डेटा एक्सेस बनाम बाहरी एकीकरण)।

  • कपलिंग और निर्भरताओं को उजागर करता है — देखाता है देवता-कंपोनेंट्स, चक्रीय निर्भरता, या इंफ्रास्ट्रक्चर कोड पर अत्यधिक निर्भरता।

  • बेहतर ऑनबोर्डिंग और हैंडओवर का समर्थन करता है — विकासकर्ता सभी स्रोत फ़ाइलों को पढ़ने की तुलना में मॉड्यूल सीमाओं को तेजी से समझते हैं।

  • रिफैक्टरिंग और विकास का मार्गदर्शन करता है — मोनोलिथ को विभाजित करने या पैटर्न (पोर्ट्स और एडेप्टर्स, ऊर्ध्वाधर स्लाइसेज) लागू करने से पहले/बाद में दृश्य मूल बिंदु।

  • आर्किटेक्चर समीक्षा और खतरा मॉडलिंग की अनुमति देता है — यह बताता है कि वैधता, प्राधिकरण, लॉगिंग आदि कहाँ होते हैं।

  • कोड के रूप में आर्किटेक्चर — जब प्लांटयूएमएल में स्टोर किया जाता है → कोडबेस के साथ संस्करणबद्ध, डिफ़ योग्य, पीआर में समीक्षायोग्य।

  • संचार को पैमाने पर बढ़ाता है — सीनियर डेवलपर्स कंपोनेंट की ज़िम्मेदारियों के बारे में चिंतित होते हैं; जूनियर्स नए कोड कहाँ रखना है, इसके बारे में चिंतित होते हैं।

एक बेहतरीन कंपोनेंट डायग्राम बनाने का तरीका (चरण-दर-चरण + सर्वोत्तम प्रथाएं)

  1. एक कंटेनर चुनें — सबसे जटिल या व्यावसायिक रूप से महत्वपूर्ण वाले से शुरू करें (अक्सर मुख्य API / बैकएंड सेवा)।

  2. लेवल 2 से संदर्भ कॉपी करें — इस कंटेनर से बातचीत करने वाले बाहरी एक्टर्स (अन्य कंटेनर, व्यक्ति, बाहरी प्रणालियाँ) को शामिल करें।

  3. कंटेनर सीमा खींचें — उपयोग करें कंटेनर_सीमा प्लांटयूएमएल में “इस कंटेनर के अंदर” को स्पष्ट रूप से सीमित करने के लिए।

  4. घटकों की पहचान करें — पूछें:

    • अंदर के प्रमुख मॉड्यूल / स्प्रिंग बीन्स / पैकेजेज / सीमित संदर्भ क्या हैं?

    • आने वाले अनुरोध कहाँ आते हैं? (कंट्रोलर्स/हैंडलर्स)

    • व्यावसायिक तर्क कहाँ संगठित किया जाता है?

    • डेटा कहाँ एक्सेस किया / कैश किया / सत्यापित किया जाता है?

    • क्रॉस-कटिंग चिंताओं का निपटारा कहाँ किया जाता है? (सुरक्षा, लॉगिंग)

    • क्या लीगेसी/बाहरी प्रणालियों के लिए कोई फेसेड्स / एंटी-करप्शन परतें हैं?

  5. तकनीक और संक्षिप्त विवरण जोड़ें — नाम, तकनीक (स्प्रिंग सेवा, .NET हैंडलर, गो मॉड्यूल आदि), संक्षिप्त उद्देश्य (< 15 शब्दों में)।

  6. इंटरैक्शन को परिभाषित करें — दिशा + इरादा दिखाएं (उपयोग करता है, कॉल करता है, से पढ़ता है, घटनाओं को प्रकाशित करता है)। इस स्तर पर प्रोटोकॉल अक्सर छोड़ दिया जाता है।

  7. सर्वोत्तम प्रथाएं

    • सीमा सीमित रखें — प्रति आरेख में अधिकतम 6–12 घटक। यदि अधिक हैं → एकाग्र उप-दृश्य बनाएं (उदाहरण के लिए, “प्रमाणीकरण स्लाइस”)।

    • अर्थपूर्ण नाम दें — “OrderService” के बजाय “Order Placement Service” को प्राथमिकता दें।

    • वर्गों के बजाय जिम्मेदारियों को दिखाएं — हर वर्ग की सूची बनाने से बचें; तार्किक रूप से समूहित करें।

    • आइकन का संतुलित उपयोग करें — केवल तभी जब वे तकनीक को स्पष्ट करते हैं (Spring, .NET आइकन)।

    • प्रतीक सूची सक्षम करें — नए पाठकों की सहायता करता है।

    • लेआउट साफ रखें — LEGEND_के_साथ_लेआउट()ऊपर_से_नीचे_का_लेआउट().

    • रिपोजिटरी में संस्करण — कंटेनर के कोड के पास .puml फ़ाइलें।

    • पुनरावृत्ति करें — रिफैक्टरिंग स्पाइक या तिमाही संरचना स्वास्थ्य जांच के दौरान अपडेट करें।

PlantUML उदाहरण – इंटरनेट बैंकिंग सिस्टम API एप्लिकेशन (क्लासिक बिग बैंक plc शैली)

यह आधिकारिक C4-PlantUML लाइब्रेरी का उपयोग करते हुए उत्पादन-ग्रेड उदाहरण है — सबसे अधिक संदर्भित वास्तविक दुनिया का उदाहरण।

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

title घटक आरेख: इंटरनेट बैंकिंग सिस्टम - API एप्लिकेशन

' एक्टर / कंटेनर स्तर से बाहरी भाग
Container(spa, "एकल-पृष्ठ एप्लिकेशन", "JavaScript & Angular", "ब्राउज़र के माध्यम से इंटरनेट बैंकिंग UI प्रदान करता है")
Container(mobile, "मोबाइल एप्लिकेशन", "iOS/Android", "सीमित मोबाइल बैंकिंग कार्यक्षमता प्रदान करता है")
ContainerDb(database, "बैंकिंग डेटाबेस", "PostgreSQL", "उपयोगकर्ता प्राथमिकताएं, कैश्ड डेटा, सत्र संग्रहित करता है")
System_Ext(mainframe, "मुख्य बैंकिंग सिस्टम", "मेनफ्रेम – मुख्य खाते और लेनदेन")

' हम जिस कंटेनर में जूम कर रहे हैं
Container_Boundary(api, "API एप्लिकेशन") {
    Component(signInCtrl, "लॉग इन कंट्रोलर", "Spring MVC REST कंट्रोलर", "प्रमाणीकरण और सत्र निर्माण का प्रबंधन करता है")
    Component(accountsCtrl, "खाता सारांश कंट्रोलर", "Spring MVC REST कंट्रोलर", "खाता शेष और सारांश प्रदान करता है")
    Component(resetPwdCtrl, "पासवर्ड रीसेट कंट्रोलर", "Spring MVC REST कंट्रोलर", "पासवर्ड रीसेट प्रवाह का प्रबंधन करता है")
    
    Component(security, "सुरक्षा घटक", "Spring बीन", "JWT टोकन, पासवर्ड हैशिंग, भूमिका जांच")
    Component(accountService, "खाता प्रबंधन घटक", "Spring बीन / सेवा", "खाता प्रश्नों और व्यावसायिक नियमों का निर्देशन करता है")
    Component(mainframeFacade, "मेनफ्रेम बैंकिंग फेसेड", "Spring बीन", "पुराने मेनफ्रेम के लिए एंटी-कॉरप्शन परत")
    Component(emailNotifier, "ईमेल सूचना घटक", "Spring बीन", "पुष्टि और रीसेट ईमेल भेजता है")
}

' सीमा के भीतर संबंध
Rel(signInCtrl, security, "उपयोग करता है")
Rel(accountsCtrl, accountService, "उपयोग करता है")
Rel(resetPwdCtrl, security, "उपयोग करता है")
Rel(resetPwdCtrl, emailNotifier, "उपयोग करता है")
Rel(accountService, mainframeFacade, "उपयोग करता है")
Rel(accountService, database, "से पढ़ता है और लिखता है", "JDBC")
Rel(mainframeFacade, mainframe, "उपयोग करता है", "XML/HTTPS")
Rel(emailNotifier, database, "उपयोगकर्ता प्राथमिकताएं पढ़ता है", "JDBC")

' फ्रंट-एंड से आने वाले कॉल
Rel(spa, signInCtrl, "उपयोग करता है", "JSON/HTTPS")
Rel(spa, accountsCtrl, "उपयोग करता है", "JSON/HTTPS")
Rel(spa, resetPwdCtrl, "उपयोग करता है", "JSON/HTTPS")
Rel(mobile, signInCtrl, "उपयोग करता है", "JSON/HTTPS")
Rel(mobile, accountsCtrl, "उपयोग करता है", "JSON/HTTPS")
Rel(mobile, resetPwdCtrl, "उपयोग करता है", "JSON/HTTPS")

LAYOUT_WITH_LEGEND()
LAYOUT_LEFT_RIGHT()

@enduml

यह दिखाता है:

  • API कंटेनर के चारों ओर स्पष्ट सीमा

  • कंट्रोलर, सेवाओं, फेसेड का तार्किक समूहन

  • सटीक जिम्मेदारियां

  • मुख्य बातचीत और निर्भरताएँ

  • पठनीयता के लिए स्वचालित विवरण

PlantUML रेंडरर में पेस्ट करें (ऑनलाइन या IDE) — अपनी प्रणाली के लिए नाम/तकनीकों को कस्टमाइज़ करें।

इस पैटर्न का अपने शुरुआती टेम्पलेट के रूप में उपयोग करें। लक्ष्य हमेशा प्रभावी टीम संचार — आरेख की सुंदरता नहीं। खुशी से मॉडलिंग करें!

C4 कंपोनेंट डायग्राम संसाधन

यह पोस्ट Deutsch, English, Español, فارسی, Français, Bahasa Indonesia, 日本語, Polski, Portuguese, Ру́сский, Việt Nam, 简体中文 और 繁體中文 में भी उपलब्ध है।