स्कीमा रजिस्ट्री और डेटा एवोल्यूशन
मैं एक स्कीमा रजिस्ट्री की आवश्यकता क्यों
स्कीमा रजिस्ट्री डेटा अनुबंधों (एपीआई, घटनाओं, धागे, संदेश, संग्रह) के लिए सत्य का एक केंद्रीकृत स्रोत है जो प्रदान करता है:- पूर्वानुमानित विकास: संगतता नियम और स्वचालित टूटने की जाँच।
- दोहराव और पारदर्शिता: संस्करणों का इतिहास, कौन/कब/क्यों बदल गया।
- मानकीकरण: समान नाम, त्रुटि प्रारूप, ट्रेस फ़ील्ड, पीआईआई लेबल।
- सीआई/सीडी के साथ एकीकरण: उत्पादन से पहले ब्रेकिंग परिवर्तन को अवरुद्ध करना।
रजिस्ट्री प्रोटोकॉल-प्रथम और अनुबंध संगतता को जोड़ ती है, जिससे परिवर्तन त्वरित और सुरक्षि
प्रारूप और अनुप्रयोग
JSON स्कीमा: REST/HTTP पेलोड, दस्तावेज़, कॉन्फ़िगरेशन।
एवरो: इवेंट बसें (काफ्का/पल्सर), फील्ड आईडी के माध्यम से कॉम्पैक्ट/विकास।
Protobuf: gRPC/RPC, बाइनरी कुशल, सख्त टैग।
GraphQL SDL: प्रकार और निर्देश स्कीमा, '@ deprecated' के माध्यम से विकास।
SQL DDL एक कलाकृति के रूप में: हम सहमत विचारों को ठीक करते हैं (उदाहरण के लिए, बाहरी स्टोरफ्रंट) - सावधानी के साथ।
संगतता मोड
बैकवर्ड: नए स्कीमा पुराने डेटा/संदेश पढ़ें। किसी ऐसे उत्पादक के लिए उपयुक्त जो अतिरिक्त रूप से पेलोड का विस्तार कर
फॉरवर्ड: पुराने उपभोक्ता सही ढंग से नए डेटा पढ़ ते हैं (एक सहिष्णु पाठक की आवश्यकता होती है)।
पूर्ण: दोनों को जोड़ ती है (सख्त, सार्वजनिक अनुबंधों के लिए अधिक सुविधाजनक)।
कोई नहीं: कोई जाँच नहीं - केवल सैंडबॉक्स के लिए।
सिफारिशें:- घटनाएँ: अधिक बार BACKWARD (निर्माता पेलोड वैकल्पिक विस्तार करता है
- सार्वजनिक एपीआई: क्लाइंट पर पूर्ण या बैकवर्ड + सख्त सहिष्णु पाठक।
- आंतरिक प्रोटोटाइप: अस्थायी रूप से कोई नहीं, लेकिन ट्रंक पर नहीं।
सुरक्षित (योज्य) बनाम खतरनाक परिवर्तन
एडिटिव (ओके):- वैकल्पिक क्षेत्र/प्रकार जोड़ें।
- नए मूल्यों के साथ एनम एक्सटेंशन (सहिष्णु पाठक के साथ)।
- वैकल्पिक प्रक्षेपण/घटना जोड़ें ('.enriched')।
- सहजता बाधाओं ('minLenge', 'अधिकतम' ↑, लेकिन ↓ नहीं)।
- फ़ील्ड मिटाएँ/नाम बदलें या उनके प्रकार/अनिवार्य बदलें।
- थ्रेड्स में स्टेटस/कोडेक्स/ऑर्डर के शब्दार्थ बदलना।
- प्रोटोबुफ टैग का पुन: उपयोग।
- घटनाओं में पार्टिशनिंग कुंजी बदलना।
रजिस्टर संगठन
नामकरण और पता
समूह/स्थान: 'भुगतान', 'kyc', 'ऑडिट'।
नाम: 'भुगतान। अधिकृत। v1 '(घटनाएं),' भुगतान। v1। CaptureRequers '(gRPC),' आदेश। v1। आदेश '(JSON स्कीमा)।
नाम में प्रमुख, मेटाडेटा/स्कीमा संस्करण में नाबालिग।
मेटाडेटा
'मालिक' (कमांड), 'डोमेन', 'स्लास' (SLO/SLA), 'सुरक्षा। टियर '(पीआईआई/पीसीआई),' प्रतिधारण ',' संगतता _ मोड ',' सूर्यास्त ',' चेंजलॉग '।
जीवनचक्र प्रबंधन
ड्राफ्ट → रिव्यू → अनुमोदित → जारी → पदावनत → सूर्यास्त।
स्वचालित वेलिडेटर्स/लिंटर्स, मैनुअल डिजाइन-रिव्यू (एपीआई गिल्ड), रिलीज नोट्स।
सीआई/सीडी में एकीकरण
1. प्री-कमिट: स्थानीय लिंटर्स (स्पेक्ट्रल/बुफ/एवरो टूल्स)।
2. पीआर-पाइपलाइन: स्कीमा-डिफ़ - संगतता मोड जांच; ब्लॉकिंग ब्रेकिंग।
3. आर्टिफैक्ट प्रकाशन: एसडीके/मॉडल को रजिस्ट्री + उत्पन्न करने के लिए सुसंगत स्कीमा को धक्का दें।
4. रनटाइम-गार्ड (वैकल्पिक): गेटवे/निर्माता वर्तमान योजना के खिलाफ पेलोड को मान्य करता है।
पीआर में चरणों का उदाहरण:- 'ओपेनापी-डिफ़ -- फेल-ऑन-ब्रेकिंग'
- 'बुफ़ब्रेकिंग -- against
' - 'avro-compate -- mode BACKWARD'
- सुनहरे नमूने पैदा करना और सीडीसी परीक्षण चलाना।
योजनाओं का विकास: अभ्यास
एडिटिव-फर्स्ट: новые поля - 'वैकल्पिक/शून्य' (JSON), 'वैकल्पिक' (प्रोटो 3), डिफ़ॉल्ट в एवरो।
रिवर्स पिरामिड मॉडल: कोर स्थिर है, संवर्धन पास और वैकल्पिक है।
प्रमुख के लिए दोहरे-उत्सर्जन/दोहरे-लेखन: हम समानांतर में 'v1' और 'v2' प्रकाशित करते हैं।
सूर्यास्त योजना: तिथियां, उपयोग, चेतावनी, एडेप्टर।
सहिष्णु पाठक: ग्राहक अज्ञात क्षेत्रों की अनदेखी करते हैं और नए एनम को सही ढंग से संभालते हैं।
योजनाओं और जाँचों के उदाहरण
JSON स्कीमा (टुकड़ा, योजक क्षेत्र)
json
{
"$id": "orders.v1.Order",
"type": "object",
"required": ["id", "status"],
"properties": {
"id": { "type": "string", "format": "uuid" },
"status": { "type": "string", "enum": ["created", "paid", "shipped"] },
"risk_score": { "type": "number", "minimum": 0, "maximum": 1 }
},
"additionalProperties": true
}
एवरो (संगतता के लिए डिफ़ॉल्ट)
json
{
"type": "record",
"name": "PaymentAuthorized",
"namespace": "payment.v1",
"fields": [
{ "name": "payment_id", "type": "string" },
{ "name": "amount", "type": "long" },
{ "name": "currency", "type": "string" },
{ "name": "risk_score", "type": ["null", "double"], "default": null }
]
}
प्रोटोबुफ (टैग का पुनः उपयोग न करें)
proto syntax = "proto3";
package payments.v1;
message CaptureRequest {
string payment_id = 1;
int64 amount = 2;
string currency = 3;
optional double risk_score = 4; // additive
}
// tag=4 зарезервирован под risk_score, его нельзя менять/удалять без v2
घटना रजिस्टर और विभाजन
नामकरण घटनाएँ: 'डोमेन। क्रिया। v {मेजर} '(' भुगतान। कब्जा कर लिया v1 ')।
विभाजन कुंजी संविदा का हिस्सा है ('भुगतान _ id', 'उपयोगकर्ता _ id')।
कोर बनाम समृद्ध: '.v1' (कोर) और '.enriched। v1 '(विवरण)।
रजिस्ट्री संगतता: थीम/प्रकार स्तर पर मोड; सीआई असंगत परिवर्तनों से इनकार करता है।
प्रवासन प्रबंधन
विस्तार → माइग्रेट → संविदा (REST/gRPC):1. फ़ील्ड/टेबल 2 जोड़ें) नए फ़ील्ड लिखना/पढ़ना शुरू करें; 3) सूर्यास्त के बाद पुराने को हटा दें।
- दोहरे-उत्सर्जन (घटनाएँ): 'v1 '/' v2', उपभोक्ता/प्रक्षेपण प्रवासन के समानांतर, फिर 'v1' को हटाना।
- रीप्ले: लॉग से एक नए आरेख (केवल संगतता और प्रवासियों के साथ) के अनुमानों को फिर से जोड़ ना।
- एडाप्टर्स: गेटवे/प्रॉक्सी जो जटिल ग्राहकों के लिए 'v1↔v2' का अनुवाद करते हैं।
सुरक्षा और अनुपालन
आरेख में पीआईआई/पीसीआई लेबल: 'एक्स-पिई: ट्रू', 'एक्स-सेंसिटिविटी: हाई'।
अभिगम नीतियां: कौन योजनाओं को प्रकाशित/संशोधित कर सकता है (आरबीएसी), हस्ताक्षर रिलीज।
क्रिप्टोग्राफी: स्कीमा संस्करणों के हस्ताक्षर, अपरिवर्तनीय ऑडिट लॉग (WORM)।
भुलाए जाने का अधिकार: उन क्षेत्रों को निर्दिष्ट करें जिनके लिए एन्क्रिप्शन/क्रिप्टो मिटाने की आवश्यकता होती है; रजिस्ट्री में मार्गदर्शन।
अवलोकन और लेखा परीक्षा
डैशबोर्ड: परिवर्तन की संख्या, प्रकार (मामूली/प्रमुख), अस्वीकृत पीआर का हिस्सा, संस्करण उपयोग।
ऑडिट ट्रेल: जिसने योजना को बदल दिया, पीआर/एडीआर से लिंक, संबंधित रिलीज।
रनटाइम मेट्रिक्स: संदेशों का प्रतिशत जो सत्यापन में विफल रहा; संगतता की घटनाएं।
उपकरण (नमूना ढेर)
OpenAPI/JSON स्कीमा: स्पेक्ट्रल, ओपनएपीआई डिफ, स्कीमाथेसिस।
प्रोटोबुफ/जीआरपीसी: बफ, बफ-ब्रेकिंग, प्रोटोक लिंटर्स।
एवरो/इवेंट्स: कन्फ्लूएंट/रेडपांडा स्कीमा रजिस्ट्री, एवरो-टूल्स, करपेस।
ग्राफ़क्यूएल: ग्राफ़क्यूएल इंस्पेक्टर, ग्राफ़क्यूएल कोडेगन।
रजिस्टर/कैटलॉग: आर्टिफैक्ट रजिस्ट्री, गिट-आधारित रजिस्ट्री, बैकस्टेज कैटलॉग, कस्टम यूआई।
प्रलेखन: Redocly/Stoplight, Swagger-UI, GraphiQL।
एंटी-पैटर्न
स्वैगर-वॉश: योजना सेवा की वास्तविकता (या इसके विपरीत) को प्रतिबिंबित नहीं करती है।
विकलांग संगतता जांच: "तत्काल" - उत्पाद टूट जाता है।
प्रोटोबुफ टैग का पुन: उपयोग: मूक डेटा भ्रष्टाचार।
एकल संगतता मोड "सब कुछ के लिए": विभिन्न डोमेन के लिए अलग-अलग मोड की आवश्यकता होती है।
कच्ची सीडीसी सार्वजनिक योजनाओं के रूप में: डीबी मॉडल को लीक करना, विकास की असंभवता।
कार्यान्वयन चेकलिस्ट
- डोमेन द्वारा परिभाषित कलाकृति प्रारूप और संगतता मोड।
- लिंटर्स और स्कीमा-डिफ को सीआई में कॉन्फ़िगर किया जाता है, टूटने पर पीआर अवरुद्ध हो जाता है।
- ग्राहकों के सहिष्णु पाठक के लिए सक्षम; 'add गुण = सही' (जहाँ लागू होता है)।
- प्रमुख परिवर्तन RFC/ADR के माध्यम से जाते हैं, एक सूर्यास्त योजना और दोहरे-उत्सर्जन/दोहरे-लेखन है।
- सर्किट को पीआईआई/पीसीआई और एक्सेस स्तरों के साथ चिह्नित किया गया है; ऑडिटिंग सक्षम है।
- संस्करण उपयोग और संगतता डैशबोर्ड को विफल करता है।
- रजिस्ट्री से एसडीके/मॉडल उत्पन्न करना पाइपलाइन का हिस्सा है।
- प्रलेखन और सुनहरे नमूने स्वचालित रूप से अपडेट किए गए।
एफएक्यू
क्या गिट में योजनाओं को संग्रहीत करने के लिए रजिस्ट्री के बिना संभव है
हां, लेकिन रजिस्ट्री में संगतता एपीआई, खोज, मेटाडेटा, केंद्रीकृत नीति और ऑन-द-फ्लाई सत्यापन शामिल हैं। सबसे अच्छा विकल्प शीर्ष पर भंडारण + यूआई/नीतियों के रूप में गिट है।
मैं संगतता मोड कैसे चुनूंगा?
परिवर्तन की दिशा को देखें: यदि उत्पादक पेलोड का विस्तार करता है - बैकवर्ड। सार्वजनिक एपीआई/एसडीके - फुल के लिए। तेज प्रोटोटाइप के लिए - अस्थायी रूप से कोई नहीं (ट्रंक पर नहीं)।
आवश्यक तोड़ ने पर क्या करें?
v2 तैयार करना: डुअल-एमिट/डुअल-रन, सूर्यास्त-तिथियां, एडेप्टर, उपयोग की टेलीमेट्री, माइग्रेशन गाइड।
क्या मुझे रनटाइम में पेलोड को मान्य करने की आवश्यकता है?
महत्वपूर्ण डोमेन के लिए, हाँ: यह कबाड़ संदेशों को रोकता है और निदान को गति देता है।
परिणाम
स्कीमा रजिस्ट्री जोखिम भरे आशुरचना से डेटा के विकास को एक प्रबंधनीय प्रक्रिया में बदल देती है: समान अंतर नियम, स्वचालित सत्यापन, समझदार संस्करण और एक पारदर्शी इतिहास। इसमें एडिटिव-फर्स्ट, सहिष्णु रीडर, डुअल-एमिट और सूर्यास्त का अनुशासन जोड़ें - और आपके अनुबंध बिना टूटे और रात की घटनाओं के जल्दी से विकसित होंगे।