सी4 मॉडल डायग्राम क्या है?
द सी4 मॉडल डायग्राम एक पदानुक्रमिक, चार-स्तरीय संरचनात्मक ढांचा है जिसका उद्देश्य सॉफ्टवेयर संरचना को विभिन्न स्तरों पर विस्तार से दस्तावेजीकरण करना है। सिमन ब्राउन द्वारा बनाया गया, सी4 अस्पष्ट बॉक्स और रेखाओं से बचने के लिए सिस्टम मैप को चार स्पष्ट अबस्ट्रैक्शन लेंस में संरचित करता है: संदर्भ (सिस्टम-स्तरीय दायरा), कंटेनर (एप्लिकेशन और डेटा स्टोर), घटक (आंतरिक मॉड्यूल), और कोड (क्लास-स्तरीय कार्यान्वयन)।
इस मॉडल को पाठ में प्रभावी ढंग से लागू करने के लिए इंजीनियर आधिकारिक सी4-प्लांटयूएमएल मानक लाइब्रेरी एक्सटेंशन का उपयोग करते हैं। इस लाइब्रेरी में रॉ यूएमएल आकृतियों को विशेष रूप से डिज़ाइन किए गए मैक्रो के साथ प्रतिस्थापित किया जाता है जो उपयोगकर्ताओं, सिस्टम और डेटाबेस के लिए अलग-अलग रंग, आकृतियां और मेटाडेटा फील्ड को स्वचालित रूप से जोड़ते हैं। वीपीएसकोड, आप इन नेस्टेड पर्यावरणों को कोड में साफ तरीके से परिभाषित कर सकते हैं। लेआउट इंजन संबंध वेक्टर को डायनामिक रूप से रास्ता बदलता है और टेक्स्ट फील्ड को स्केल करता है बिना आपके लेआउट ज्यामिति को नुकसान पहुंचाए।
मूल सिंटैक्स गाइड: तत्व और निर्माण
प्लांटयूएमएल का उपयोग करके एक वैध सी4 मॉडल बनाने के लिए सही लाइब्रेरी फाइलों को आयात करना, संरचनात्मक मैक्रो का चयन करना, सीमाओं को स्थापित करना और विशेष संबंध लिंक का उपयोग करना आवश्यक है।
1. सी4 मानक लाइब्रेरी फाइलों को आयात करना
द सी4-प्लांटयूएमएलएक्सटेंशन को स्पष्ट अबस्ट्रैक्शन मॉडल के अलग-अलग स्तरों के सीधे मैपिंग वाली अलग-अलग फाइलों में बांटा गया है। प्रदर्शन में धीमापन या कंपाइलर त्रुटियों से बचने के लिए, आपको केवल उस विशिष्ट फाइल स्तर को आयात करना चाहिए जिसके लिए आपका डायग्राम लक्षित है:
@startuml
' आवश्यक विशिष्ट सी4 स्तर फाइल शामिल करें
!include <C4/C4_Context>
' गहन संरचनात्मक मानचित्र के लिए C4_Container या C4_Component का उपयोग करें
2. मुख्य एक्टर्स और सिस्टम की घोषणा करना (संदर्भ स्तर)
उच्च-स्तरीय सिस्टम संदर्भ स्तर पर, आप आंतरिक घटकों, बाहरी निर्भरताओं और मानव अंत उपयोगकर्ताओं का मॉडल बनाते हैं। मानक लाइब्रेरी विशिष्ट मैक्रो प्रदान करती है जो एक आईडी, एक दृश्य लेबल और एक वैकल्पिक वर्णनात्मक टैग स्वीकार करती है:
व्यक्ति(आईडी, "लेबल", "विवरण")— मानव उपयोगकर्ता प्रोफाइल या सिस्टम एक्टर का प्रतिनिधित्व करता है।सिस्टम(आईडी, "लेबल", "विवरण")— एक प्राथमिक आंतरिक सॉफ्टवेयर एप्लिकेशन या सेवा प्रणाली का प्रतिनिधित्व करता है।System_Ext(id, "लेबल", "विवरण")— एक बाहरी प्रणाली या तृतीय पक्ष के API निर्भरता का प्रतिनिधित्व करता है (स्पष्ट ग्रे रंग पैलेट में प्रदर्शित होता है)।
@startuml C4_Elements
!include <C4/C4_Context>
Person(customer, "बैंकिंग ग्राहक", "एक व्यक्तिगत बैंक खाता वाला ग्राहक")
System(banking_sys, "मुख्य बैंकिंग प्रणाली", "वित्तीय लेनदेन का प्रबंधन करती है")
System_Ext(mail_sys, "ईमेल सेवा", "आंतरिक SMTP सूचना गेटवे") 
3. सीमाओं का विस्फोट (कंटेनर और घटक स्तर)
System_Boundary()System_Boundary() मैक्रो वापसी का उपयोग कर सकते हैं:
!include <C4/C4_Container>
System_Boundary(c1, "ई-कॉमर्स प्रणाली प्रणाली") {
Container(web_app, "सिंगल-पेज एप्लिकेशन", "React & TypeScript", "वेब दृश्य के माध्यम से उपयोगकर्ता विशेषताएं प्रदान करता है")
ContainerDb(database, "संबंधात्मक डेटाबेस", "PostgreSQL", "उपयोगकर्ता प्रोफाइल और लेजर इतिहास संग्रहीत करता है")
} 
4. तकनीकी संबंधों का नक्शा बनाना
Rel(From_ID, To_ID, “लेबल”, “तकनीक”)Rel(From_ID, To_ID, "लेबल", "तकनीक"). यह आपके आर्किटेक्चर नक्शों को बहुत पठनीय बनाए रखता है, क्योंकि यह सुनिश्चित करता है कि प्रत्येक संबंध अपने उद्देश्य और नीचे के परिवहन प्रोटोकॉल (जैसे HTTPS, gRPC या AMQP) को बताता है:
!include <C4/C4_Container>
Person(customer, "बैंकिंग ग्राहक", "एक व्यक्तिगत बैंक खाता वाला ग्राहक")
System(banking_sys, "मुख्य बैंकिंग प्रणाली", "वित्तीय लेनदेन का प्रबंधन करती है")
System_Ext(mail_sys, "ईमेल सेवा", "आंतरिक SMTP सूचना गेटवे")
System_Boundary(c1, "ई-कॉमर्स प्रणाली प्रणाली") {
Container(web_app, "सिंगल-पेज एप्लिकेशन", "React & TypeScript", "वेब दृश्य के माध्यम से उपयोगकर्ता विशेषताएं प्रदान करता है")
ContainerDb(database, "संबंधात्मक डेटाबेस", "PostgreSQL", "उपयोगकर्ता प्रोफाइल और लेजर इतिहास संग्रहीत करता है")
}
Rel(customer, web_app, "वेबस्टोर विशेषताओं का उपयोग करता है", "HTTPS")
Rel(web_app, database, "लेनदेन डेटा को पढ़ता और लिखता है", "SQL/TCP") 
पठनीय C4 आर्किटेक्चर के लिए सर्वोत्तम प्रथाएं
- कभी भी अभिन्न स्तरों को मिलाएं नहीं:अपने आरेखों को एक ही स्तर पर केंद्रित रखें। उच्च स्तर के सिस्टम संदर्भ नक्शे में बारीक आंतरिक सॉफ्टवेयर घटकों को मिलाएं नहीं। यदि कोई प्रणाली बहुत जटिल हो जाती है, तो उसे अलग, निर्दिष्ट कंटेनर स्तर के आरेख में बाहर निकालें।
- तकनीकों को स्पष्ट रूप से परिभाषित करें:Rel()
Rel()मैक्रो में चौथे पैरामीटर का उपयोग करें ताकि स्पष्ट रूप से बताया जा सके कि कौन सी तकनीक या प्रोटोकॉल का उपयोग किया जा रहा है (उदाहरण के लिए,"JSON/HTTPS"या"JDBC"). इससे आपकी टीम को तुरंत महत्वपूर्ण कार्यान्वयन संदर्भ मिलता है। - दिशात्मक लेआउट ओवरराइड का उपयोग करें: यदि आपके घटक असहज ढंग से एकत्र होने लगें, तो दिशात्मक संबंध मैक्रो (जैसे
Rel_D()नीचे के लिए,Rel_R()दाएं के लिए, याRel_L()बाएं के लिए) का उपयोग करके अपने वास्तुकला प्रवाह को हाथ से साफ करें।
वास्तविक दुनिया के PlantUML C4 उदाहरण
उदाहरण 1: उच्च स्तरीय सिस्टम संदर्भ लेआउट (स्तर 1)
यह कार्यात्मक ब्लूप्रिंट एक मानक स्तर 1 सिस्टम संदर्भ आरेख का मॉडल बनाता है, जो ग्राहक द्वारा इंटरनेट बैंकिंग एप्लिकेशन और उसके बाहरी निर्भरताओं के साथ बातचीत करने के तरीके को विस्तार से दर्शाता है।
@startuml
!include <C4/C4_Context>
title इंटरनेट बैंकिंग सिस्टम के लिए सिस्टम संदर्भ आरेख
Person(customer, "व्यक्तिगत बैंकिंग ग्राहक", "व्यक्तिगत खातों वाला बैंक का ग्राहक।")
System(banking_system, "इंटरनेट बैंकिंग सिस्टम", "ग्राहकों को वित्तीय जानकारी देखने और ट्रांसफर करने की अनुमति देता है।")
System_Ext(mail_system, "ईमेल सबसिस्टम", "आंतरिक एंटरप्राइज SendGrid कॉर्पोरेट मेल सर्वर क्लस्टर।")
Rel(customer, banking_system, "ऑनलाइन डैशबोर्ड के माध्यम से उपयोग करता है")
Rel_R(banking_system, mail_system, "सूचना और सत्यापन कोड भेजता है", "SMTP")
@enduml 
सिंटैक्स विश्लेषण: यह आरेख शुद्ध रूप से उच्च स्तरीय दायरे पर केंद्रित है। System_Ext मैक्रो ईमेल सेवा पर स्वचालित रूप से ग्रे रंग प्रोफाइल लागू करता है, जिससे कोर सिस्टम को बाहरी निर्भरताओं से दृश्य रूप से अलग किया जाता है। Rel_R मैक्रो लेआउट इंजन को ईमेल नोड को बैंकिंग सिस्टम ब्लॉक के सीधे दाएं ओर रखने के लिए मजबूर करता है।
उदाहरण 2: गहन जांच माइक्रोसर्विस कंटेनर टोपोलॉजी (स्तर 2)
यह उन्नत एंटरप्राइज ब्लूप्रिंट एक सिस्टम को उसके संघटक कंटेनर एप्लिकेशनों और स्वतंत्र डेटा स्टोर्स में तोड़ता है, जो वेब ट्रैफिक के API गेटवे के माध्यम से बैकएंड माइक्रोसर्विसेज तक रूट होने के तरीके को दर्शाता है।
@startuml
!include <C4/C4_Container>
title भुगतान पोर्टल गेटवे के लिए कंटेनर आरेख
Person(merchant, "वेब मर्चेंट पार्टनर", "प्लेटफॉर्म चेकआउट एंडपॉइंट्स को अपनी वेबसाइटों में एकीकृत करता है।")
System_Boundary(portal_scope, "भुगतान गेटवे इकोसिस्टम") {
Container(api_gateway, "API रूटिंग प्रॉक्सी", "Nginx", "आने वाले कॉल्स को रोकता है, दर सीमाओं को संभालता है और नोड्स को संतुलित करता है।")
Container(auth_service, "पहचान माइक्रोसर्विस", "Go & OAuth2", "विकासकार एपीआई टोकन और स्कोप की पुष्टि करता है।")
Container(txn_service, "लेनदेन लेजर", "Java Spring Boot", "भुगतान को प्रोसेस करता है और लेजर खातों का प्रबंधन करता है।")
ContainerDb(ledger_db, "लेजर डेटास्टोर", "CockroachDB", "वितरित ACID-संगत तालिका संरचनाओं को लागू करता है।")
}
' ट्रैफिक प्रवाह को आंतरिक कंटेनर लक्ष्यों के माध्यम से साफ रूप से रूट करें
Rel(merchant, api_gateway, "भुगतान पेलोड भेजता है", "HTTPS/JSON")
Rel_D(api_gateway, auth_service, "आगमन टोकन की पुष्टि करता है", "gRPC")
Rel_D(api_gateway, txn_service, "चेकआउट कार्रवाई को आगे भेजता है", "gRPC")
Rel_R(txn_service, ledger_db, "लेजर प्रविष्टियों को स्थायी रूप से संग्रहीत करता है", "SQL/TLS")
@enduml 
वाक्य विराम का विश्लेषण: उपयोग करके System_Boundary मैक्रो वापसी, आंतरिक घटकों को स्पष्ट सीमा बॉक्स के भीतर स्पष्ट रूप से समूहित करता है। विशेषित ContainerDb मैक्रो डेटा स्टोर को स्पष्ट डेटाबेस सिलेंडर आइकन के साथ दर्शाता है, जिससे गणना रनटाइम और स्थायी स्टोरेज परतों के बीच विभाजन को तुरंत स्पष्ट करता है।