MongoDB और लचीला डेटा स्कीमा
(धारा: प्रौद्योगिकी और बुनियादी ढांचा)
संक्षिप्त सारांश
MongoDB लचीले सर्किट (BSON), तेज आवेषण, क्षैतिज स्केलिंग और शक्तिशाली एकत्रीकरण पाइपलाइन के साथ एक दस्तावेज-उन्मुख भंडारण है। आईगेमिंग में, यह खिलाड़ी प्रोफाइल, लचीले सीआरएम कार्ड, इवेंट लॉग, टेलीमेट्री, भौतिक स्ट्रीम अनुमानों, गेम कैटलॉग और कैश किए गए फ्रंट विचारों के लिए बहुत अच्छा है। मौद्रिक आक्रमणकारियों (पर्स/बही) के लिए, SQL/CP समोच्च अधिक बार छोड़ दिया जाता है; MongoDB एक रीड-मॉडल और उच्च-प्रदर्शन दस्तावेज़ भंडारण के रूप में उपयुक्त है।
जहां MongoDB iGaming का सबसे अधिक लाभ उठाता है
खिलाड़ी प्रोफाइल और सेटिंग: संरचना चर (लोकेल सेटिंग, वरीयता, केवाईसी मेटाडेटा)।
सामग्री/गेम/प्रदाता कैटलॉग: त्वरित कार्ड रीडिंग, फिल्टर, टैगिंग, पूर्ण पाठ।
घटनाएँ/टेलीमेट्री/लॉग: उच्च टीपीएस, समय विंडो, टीटीएल भंडारण।
भौतिक दृश्य (CQRS): त्वरित स्क्रीन (लीडरबोर्ड, हालिया कार्रवाई, कुल)।
निजीकरण/सुविधाएँ ऑनलाइन एमएल: संग्रह में केवी पैटर्न, लघु टीटीएल।
एक लचीली योजना के सिद्धांत: अराजकता के बजाय अनुशासन
MongoDB "एक स्कीमा के बिना" नहीं है - स्कीमा कोड और सत्यापन में रहता है।
अनुशंसित:1. अनुबंध के रूप में योजना: संग्रह में JSON स्कीमा सत्यापन।
2. 'SchemaVersion' क्षेत्र के साथ दस्तावेजों का सत्यापन
3. सख्त अनिवार्य क्षेत्र (आईडी, खोज कुंजी), दुर्लभ विशेषताओं की "पूंछ" - वैकल्पिक।
4. बाधाएं सरणी आयाम और घोंसले के शिकार (सूचकांक और रैम के लिए)।
5. पृष्ठभूमि में प्रवासन: 'स्कीमावर्स', शेड्यूलर, बैक फिल द्वारा अद्यतन।
उदाहरण: JSON स्कीमा सत्यापन
js db.createCollection("player_profiles", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["playerId", "createdAt", "schemaVersion"],
properties: {
playerId: { bsonType: "string" },
createdAt: { bsonType: "date" },
schemaVersion: { bsonType: "int", minimum: 1 },
locale: { bsonType: "string" },
kyc: {
bsonType: "object",
properties: {
status: { enum: ["pending", "verified", "rejected"] },
doc: { bsonType: "object" }
}
}
}
}
}
});
डेटा मॉडल और दस्तावेज़ डिज़ाइन
डिजाइन "ऑन डिमांड": 1 स्क्रीन/एंडपॉइंट = 1 दस्तावेज़ या दस्तावेजों का एक छोटा सेट।
Denormalization: संलग्न छोटे उपखंड शामिल करें (उदाहरण के लिए, खेल प्रदाताओं के मिनी-कार्ड)।
लिंक बनाम एम्बेडिंग:- एम्बेडिंग - बारीकी से संबंधित और अक्सर अद्यतन टुकड़ों के लिए।
- संदर्भ ('ref') - बड़े आकार/अक्सर अद्यतन/पुन: उपयोग के लिए।
- आकार सीमा: दस्तावेज़ ≤ 16 एमबी; बड़े बायनेरीज़ - GridFS/ऑब्जेक्ट स्टोरेज।
- ऑडिट/मेटाडेटा: ' At', 'अपडेटेड एट', 'traceId', 'tenantId', 'idempot Key'।
सूचकांक: पढ़ें गुणवत्ता और विलंबता स्थिरता
सूचकांक के प्रकार और प्रथा
बी-ट्री (प्राथमिक)
यौगिक: क्षेत्रों का क्रम अक्सर विधेय और प्रकार से मेल खाता है।
उपसर्ग नियम: उपसर्ग विकल्प '(टेनेंटआईडी, प्लेयर आईडी, एट)' के लिए काम करते हैं।
सॉर्ट: सूचकांक के अंत में 'सॉर्ट' पर विचार करें (उदाहरण के लिए, 'At: -1')।
js db.bets.createIndex(
{ tenantId: 1, playerId: 1, createdAt: -1 },
{ name: "idx_bets_tenant_player_created_desc" }
);
आंशिक/विरल
अक्सर सबसेट में तेजी लाएं ('स्थिति: "लंबित"), आकार कम करें।
js db.withdrawals.createIndex(
{ playerId: 1, createdAt: -1 },
{ partialFilterExpression: { status: "pending" } }
);
टीटीएल
टेलीमेट्री/लॉग/अस्थायी विशेषताओं के लिए - स्वचालित समाप्ति।
js db.events.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 });
पाठ/स्वतः पूर्ण
'text' for पूर्ण पाठ (भाषा प्रतिबंध); ऑटो-पूरा करने के लिए - 'एन-ग्राम '/ट्राइग्राम के माध्यम से फ़ील्ड और रीगेक्स दृष्टिकोण या एटलस सर्च।
सूचकांक एंटीपैटर्न
"सभी" सूचकांक - लेखन की गति में गिरावट।
आंशिक → कम चयनात्मकता के बिना कम कार्डिनैलिटी।
डुप्लिकेट यौगिक।
बिना सीमा के विशाल सरणियों के अंदर सूचकांक क्षेत
एकत्रीकरण पाइपलाइन: त्वरित स्क्रीन और रिपोर्ट
प्रारंभिक चरणों के रूप में '$ मैच' → '$ सॉर्ट' → '$ सीमा' का उपयोग करें; '$ मैच/$ सॉर्ट' के तहत परियोजना सूचकांक।
नियंत्रित जॉइन के लिए '$ लुकअप' (नरम, उचित संस्करणों में)।
कई मैट्रिक्स के लिए '$ पहलू'; '$ UnounsWite' - संग्रह विलय करें।
'$ मर्ज '/' $ आउट' - संग्रह (रीड-मॉडल) में परिणाम भौतिक।
उदाहरण: अंतिम खिलाड़ी दांव + तिजोरी:js db.bets.aggregate([
{ $match: { tenantId: "eu-1", playerId: "p123" } },
{ $sort: { createdAt: -1 } },
{ $limit: 100 },
{ $group: {
_id: "$playerId",
lastBets: { $push: { amount: "$amount", ts: "$createdAt", game: "$gameId" } },
totalAmount: { $sum: "$amount" }
} }
]);
लेनदेन, स्थिरता और पहचान
एकल-दस्तावेज़परमाणु - मुक्त परमाणु; जटिल अपरिवर्तनीय - विचार दस्तावेज़ विभाजन।
बहु-दस्तावेज़लेनदेन (ACID) - प्रतिकृति सेट के साथ उपलब्ध है, लेकिन विलंबता में अधिक महंगा है; बिंदुवार लागू करें।
चिंता लिखें/पढ़ें चिंता:- 'w: "बहुमत" महत्वपूर्ण रिकॉर्ड (विलंबता लागत) के लिए;
- 'रीडकंसर्न: लगातार पढ़ ने के लिए "बहुमत"।
- Idempotency: 'idempot Key '/' pspTx', UPSERT ऑपरेशंस ('$ SetOninsert', '$ inc') पर अद्वितीय कुंजी।
js db.wallet.updateOne(
{ playerId: "p123" },
{ $inc: { balanceCents: -5000 }, $set: { updatedAt: new Date() } },
{ upsert: true, writeConcern: { w: "majority" } }
);
शार्डिंग और कुंजी चयन
MongoDB शार्क द्वारा शार्क। चुनाव महत्वपूर्ण है:- लोड वितरण: उच्च कार्डिनैलिटी कुंजी और समान वितरण (उदाहरण के लिए, '(टेनेंटआईडी, प्लेयर)')।
- एकरसता से बचें: '→ At' एकमात्र कुंजी के रूप में - "हॉट" शार्ड।
- हैशेड - अधिक समान रूप से रिकॉर्ड वितरित करता है।
- रेंज क्वेरी के लिए रेंज बेहतर है, लेकिन गर्म पूंछ के लिए देखें।
- टैग विनियमन/स्थानीयकरण (EU/LatAm/TR) के लिए रेंज।
js sh.enableSharding("igaming");
db.bets.createIndex({ tenantId: 1, playerId: 1, _id: "hashed" });
sh.shardCollection("igaming.bets", { tenantId: 1, playerId: 1, _id: "hashed" });
एंटीपैटर्न:
- कम कार्डिनैलिटी ('स्थिति') द्वारा शार्द-कुंजी - शार्क का तिरछा।
- एक समय में एक कुंजी को सह-शार्प किए बिना शार्डी संग्रह के बीच लगातार '$ लुकअप'।
- परिवर्तनीय शार्क कुंजी (मुश्किल और बदलने के लिए महंगा)।
प्रतिकृति सेट, पढ़ ता है, और पढ़ ने के बाद लेखन नीति
प्रतिकृति सेट = एचए और लेनदेन आधार।
पढ़ें वरीयता:- 'primary' for महत्वपूर्ण पढ़ ने-लिखने के बाद;
- 'primaryPrefered '/' माध्यमिक' - एनालिटिक्स/गैर-महत्वपूर्ण के लिए।
- SLO और विलंबता बजट के साथ पढ़ें/लिखें चिंता समन्वय।
स्ट्रीम, सीडीसी और एकीकरण बदलें
स्ट्रीम बदलें: आवेषण/अद्यतन/हटाने के लिए सदस्यता - के लिए सुविधाजनक:- कैश परत तुल्यकालन (Redis)
- सीआरएम ट्रिगर/सूचनाएं,
- OLAP (क्लिकहाउस/पिनोट) के लिए डाउनलोड,
- प्रतिक्रियाशील स्क
- आउटबॉक्स पैटर्न: महत्वपूर्ण डोमेन के लिए, घटनाओं को एक अलग संग्रह में प्रकाशित करें, जिसे कनेक्टर तब बस (काफ्का) में पढ़ ता और अनुवाद करता है। यह एकीकरण की पूर्वानुमेयता को बढ़ाता है।
अवलोकन और एसएलओ
SLO: p99 कार्ड रीडिंग ≤ 10-20 एमएस; घटनाओं को सम्मिलित करना ≤ 20-40 एमएस; एक्स% के भीतर शार्क के बीच लेफ्टिनेंसी अंतर; उपलब्धता ≥ 99। 9%.
मेट्रिक्स: ऑप-लेटेंसी, कतार की गहराई,% प्रति माध्यमिक, कैश/डब्ल्यूटी आंकड़े, पृष्ठ दोष, लॉक-वेट, ओपन कर्सर/कनेक्शन की संख्या।
प्रोफाइलिंग: 'सिस्टम। प्रोफाइल ',' समझाएं ("एक्जीक्यूशनस्टैट्स") ', संग्रह/सूचकांक ताले।
अलर्ट: डब्ल्यूटी कैश दबाव की वृद्धि, धीमी गति से संचालन, सूचकांक में शामिल अनुरोधों की वृद्धि, माध्यमिक अनुरोधों का बैकलॉग, चंक माइग्रेशन/बैलेंसर।
प्रदर्शन और ट्यूनिंग
Wift टाइगर कैश: डिफ़ॉल्ट रूप से ~ 50% RAM - प्रोफ़ाइल के लिए मान्य।
संपीड़न: संग्रह के लिए स्नैपी/zstd, लॉग के लिए zstd - CPU/IO संतुलन।
टेलीमेट्री के लिए बैच आवेषण और बल्कराइट।
प्रक्षेपण ('{field: 1}') ताकि "मोटा" दस्तावेज़ न खींचे।
सीमा/छोड़ें: बड़े 'स्किप' से बचें कर्सर/मार्कर पगिनेशन (' At/_ id') का उपयोग करें।
"रिंग" लॉग के लिए कैप्ड संग्रह।
सुरक्षा और अनुपालन
Auth/RBAC: संग्रह/डेटाबेस पर भूमिकाएँ, न्यूनतम आवश्यक विशेषाधिकार।
पारगमन में टीएलएस, डिस्क पर एन्क्रिप्शन (FLE/at-rest).
PII नीतियां: मास्किंग/अलियासिंग, संवेदनशील क्षेत्रों के लिए अलग संग्रह।
बहु-किरायेदारी: उपसर्ग/व्यक्तिगत डेटाबेस/संग्रह, 'टेनेंटआईडी' द्वारा फिल्टर, आप आवेदन में आरएलएस जैसी परतें कर सकते हैं।
लेखा परीक्षा: महत्वपूर्ण संग्रह पर परिचालन लेखा परीक्षा सक्षम करें।
बैकअप, पीआईटीआर और डीआर
प्वाइंट-इन-टाइम रिकवरी के लिए वॉल्यूम + ओपलॉग बैकअप के स्नैपशॉट।
डीआर के लिए दूसरे क्षेत्र में स्थापित प्रतिकृति; नियमित रूप से वसूली अभ्यास।
सम्मिलन चोटियों के लिए ओपलॉग वृद्धि का नियंत्रण (पीएसपी वेबहूक/टूर्नामेंट)।
शार्ड क्लस्टर में - एक कॉन्फिग सर्वर के साथ सुसंगत बैकअप।
शेष वास्तुकला के साथ एकीकरण
CQRS: टीमों ने SQL (पैसा), घटनाओं → MongoDB में भौतिक दृश्य मारे।
इवेंट-स्ट्रीमिंग: काफ्का/पल्सर बस के रूप में, मोंगो - कनेक्टर्स और चेंज स्ट्रीम के माध्यम से सिंक/स्रोत।
रेडिस: अल्ट्रा-लो लेटेंसी लेयर (कैश/काउंटर) के रूप में पास।
OLAP: लंबे स्कैन और BI के लिए क्लिकहाउस/पिनोट पर अपलोड करें।
कार्यान्वयन चेकलिस्ट
1. फिक्स डोमेन: मोंगो (लचीला/उच्च टीपीएस/प्रक्षेपण) में क्या जाता है, एसक्यूएल में क्या रहता है।
2. स्कीमा अनुबंधों को परिभाषित करें: JSON स्कीमा सत्यापन, 'स्कीमा संस्करण'।
3. वास्तविक प्रश्नों के लिए डिजाइन सूचकांक; शोर डाटा के लिए टीटीएल जोड़ें।
4. शार्ड कुंजी चुनें (उच्च कार्डिनैलिटी, एकरूपता); यदि आवश्यक हो - ज़ोन-शार्डिंग।
5. एसएलओ के लिए एक प्रतिकृति सेट, पढ़ें/लिखें चिंता; पढ़ ने के बाद लिखने की नीति।
6. अवलोकन और प्रोफाइलिंग सक्षम करें, चेतावनी/डब्ल्यूटी कैश/ऑप्लॉग इंडेक्स।
7. बैकअप + पीआईटीआर, डीआर क्लस्टर और नियमित अभ्यास का आयोजन करें।
8. कैश और बसों को तुल्यकालित करने के लिए कनेक्ट करें स्ट्रीम/आउटबॉक्स।
9. दस्तावेज़ आकार और घोंसले के शिकार को सीमित क संकेतक द्वारा पृष्ठभूमि को लागू करें।
10. पीआईआई/किरायेदारों, एन्क्रिप्शन, ऑडिट के लिए अलग नीतियां।
एंटी-पैटर्न
उत्पाद में "कोई योजना नहीं": सत्यापन और संस्करणों की कमी - अराजकता।
समय में शार्ड कुंजी/नीरस - गर्म शार्ड और अस्थिर p99।
इंडेक्स/पैगिनेशन के बिना जॉयनेस का $ लुकअप विशाल सेट।
हर जगह लेनदेन का उपयोग करें - खोई हुई उत्पादकता।
लॉग के लिए टीटीएल/प्रतिधारणों की कमी - मात्रा और लागत में वृद्धि।
केवल सख्त पहचान के बिना मोंगो में महत्वपूर्ण मौद्रिक आक्रमणकारियों को संग्रहीत करें।
परिणाम
MongoDB लचीले iGaming डोमेन के लिए एक शक्तिशाली उपकरण है: प्रोफाइल, निर्देशिका, टेलीमेट्री, अनुमान और निजीकरण। सफलता की कुंजी एक अनुबंध योजना और सत्यापन, विचारशील अनुक्रमण, एक अच्छी तरह से चुनी गई शार्ड कुंजी, सचेत पढ़ें/लेखन चिंता, एकीकरण के लिए परिवर्तन धाराएं और सख्त परिचालन अनुशासन (अवलोकन, बैकअप, डीआर) है। SQL कोर और स्ट्रीमिंग बस के साथ संयुक्त, यह टूर्नामेंट चोटियों के लिए मंच को तेजी से इंटरफेस और स्थिरता प्रदान करता है।