MongoDB va moslashuvchan ma’lumotlar sxemalari
(Bo’lim: Texnologiyalar va infratuzilma)
Qisqacha xulosa
MongoDB - moslashuvchan sxemalar (BSON), tez qo’shimchalar, gorizontal masshtablar va kuchli Aggregation Pipeline bo’lgan hujjatga yo’naltirilgan ombor. iGaming o’yinchilar profillari, moslashuvchan CRM kartochkalari, voqealar loglari, telemetriya, oqimdagi materiallashtirilgan proyeksiyalar, o’yinlar kataloglari va frontlar uchun keshlash tomoshalari uchun juda mos keladi. Pul invariantlari (hamyonlar/ledger) uchun SQL/CP-kontur ko’pincha qoladi; MongoDB o’qish-model va yuqori unumli hujjatlar ombori sifatida mos keladi.
MongoDB iGaming’da maksimal hosil qiladi
Oʻyinchi profillari va moslamalari: oʻzgaruvchan tuzilmalar (lokal moslamalari, afzalliklar, KYC meta maʼlumotlari).
Kontent/o’yinlar/provayderlar kataloglari: kartochkalarni tez o’qish, filtrlar, teglash, to’liq matn.
Voqealar/telemetriya/jurnallar: yuqori TPS, vaqtinchalik derazalar, TTL saqlash.
Materiallashtirilgan tasvirlar (CQRS): tezkor ekranlar (liderbordlar, oxirgi harakatlar, agregatlar).
Personalizatsiya/fich onlayn ML: Kolleksiyalardagi KV-patternlar, qisqa TTL.
Moslashuvchan sxema tamoyillari: tartibsizlik o’rniga intizom
MongoDB «sxemasiz» emas - sxema kod va validatsiyada yashaydi.
Quyidagilar tavsiya etiladi:1. Kontrakt sifatida sxema: JSON Schema Validation kolleksiyalarda.
2. Hujjatlarni’schemaVersion’maydoni bilan versiya qilish.
3. Qattiq majburiy maydonlar (id, qidiruv kalitlari), noyob atributlarning «dumi» - ixtiyoriy.
4. Massivlar oʻlchamini cheklash (indeks va RAM uchun).
5. Migratsiya fonida: «schemaVersion» bo’yicha apdeytlar, shedulyerlar, bek-filllar.
Misol: JSON Schema Validation
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" }
}
}
}
}
}
});
Ma’lumotlar modeli va hujjatlarni loyihalashtirish
1 ekran/endpoint = 1 hujjat yoki kichik hujjatlar toʻplamini loyihalashtiring.
Denormalizatsiya: kichik qo’shimcha hujjatlarni kiriting (masalan, o’yin provayderlarining mini-kartochkalari).
- Joylashtirish - chambarchas bogʻlangan va kamdan-kam yangilanadigan parchalar uchun.
- Havolalar (’ref’) - katta/tez-tez yangilanganda/qayta foydalanilganda.
- O’lchamni cheklash: 16 MB ≤ hujjat; yirik binarniklar - GridFS/obyekt omborlari.
- Audit/meta maʼlumotlar:’createdAt’,’updatedAt’,’traceId’,’tenantId’,’idempotencyKey’.
Indekslar: oʻqish sifati va latency barqarorligi
Indeks va amaliyot turlari:- B-Tree (asosiy)
Compound: maydonlarning tartibi tez-tez uchraydigan predikatlar va saralashlarga mos keladi.
Prefix qoidasi:’(tenantId, playerId, createdAt)’uchun prefiks variantlari ishlaydi.
Saralash: indeksning oxirida’sort’ni hisobga oling (masalan,’createdAt: -1’).
js db.bets.createIndex(
{ tenantId: 1, playerId: 1, createdAt: -1 },
{ name: "idx_bets_tenant_player_created_desc" }
);
Partial / Sparse
Tez-tez uchraydigan kichik turkumlarni tezlashtiradi (’status:’pending’’), hajmini kamaytiradi.
js db.withdrawals.createIndex(
{ playerId: 1, createdAt: -1 },
{ partialFilterExpression: { status: "pending" } }
);
TTL
Telemetriya/log/vaqtinchalik fichlar uchun - avtomatik ravishda tugash.
js db.events.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 });
Matn/autocomplete
’text’ to’liq matn uchun (tillar bo’yicha cheklovlar); avto to’ldirish uchun -’n-gram ’/trigram dala va regex-yondashuvlar yoki Atlas Search orqali.
Antipattern indekslari
Hamma uchun indeks → yozish tezligining pasayishi.
Partial bo’lmagan past kardinallik → past selektivlik.
Bir-birini takrorlovchi kompaundlar.
Gigant massivlar ichidagi maydonlarni chegarasiz indekslash.
Aggregation Pipeline: tezkor ekranlar va hisobotlar
’$match’ →’$sort’→’$limit’dan erta bosqichlar sifatida foydalaning; indekslarni «$match/ $sort» ostida loyihalashtiring.
nazorat qilinadigan joylar uchun «$lookup» (yumshoq, oqilona hajmlarda).
’$facet’ ko’p metriklar uchun;’$unionWith’- kolleksiyalarni birlashtirish.
’$merge ’/’ $out’ - kolleksiyadagi natijalarni materiallashtirish (read-models).
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" }
} }
]);
Tranzaksiyalar, muvofiqlik va idempotentlik
Single-document atomic - bepul atomarlik; murakkab invariantlar - hujjatlarni bo’lish haqida o’ylang.
Multi-document transactions (ACID) - replika-setlar bilan birga, lekin latency bo’yicha qimmatroq; nuqta qo’llash.
- ’w: «majority»’ tanqidiy yozuvlar uchun (latency qiymati);
- ’readConcern:’ majority’kelishilgan oʻqish uchun.
- Idempotentlik:’idempotencyKey ’/’ pspTx’, UPSERT-operatsiyalarning (’$setOnInsert’,’$inc’) noyob kalitlari.
js db.wallet.updateOne(
{ playerId: "p123" },
{ $inc: { balanceCents: -5000 }, $set: { updatedAt: new Date() } },
{ upsert: true, writeConcern: { w: "majority" } }
);
Shardlash va kalitlarni tanlash
MongoDB shard key orqali shardlanadi. Tanlash juda muhim:- Yuklamani taqsimlash: yuqori kardinallik va teng taqsimlanish kaliti (masalan,’(tenantId, playerId)’).
- Monotonlikdan qoching:’createdAt’yagona kalit sifatida → «issiq» shard.
- Xashed - yozuvlarni teng taqsimlaydi.
- Ranged - diapazonli so’rovlar uchun yaxshiroq, lekin issiq dumlarini kuzatib boring.
- Regulyatorika/mahalliylashtirish uchun zona-sharding (tag ranges) (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" });
Antipatternlar:
- Past kardinalligi bo’yicha shard-kalit (’status’) - shardlarning qiyshiqligi.
- Tez-tez’$lookup’sharlangan to’plamlar o’rtasida birma-bir kalitsiz.
- Oʻzgartiriladigan shard key (almashtirish qiyin va qimmat).
Replika-setlar, o’qish va siyosati read-after-write
Replika-set = HA va tranzaksiyalar asosi.
Read Preference:- tanqidiy read-after-write uchun’primary’;
- ’primaryPreferred ’/’ secondary’ - tahliliy/tanqidiy emas.
- Read/Write concern SLO va latency byudjeti bilan kelishing.
Change Streams, CDC va integratsiya
Change Streams: qoʻshimchalar/yangiliklar/oʻchirish uchun obuna:- kesh qatlamlarini sinxronlashtirish (Redis),
- CRM/bildirishnomalar triggerlari,
- OLAP (ClickHouse/Pinot) ga yuklash,
- reaktiv ekranlar.
- Outbox-pattern: tanqidiy domenlar uchun voqealarni alohida toʻplamga joylashtiring, uni konnektor oʻqib, shina (Kafka) ga uzatadi. Bu integratsiyalarning bashorat qilinishini oshiradi.
Kuzatuv va SLO
SLO: p99 kartochka o’qish ≤ 10-20 ms; voqealarni qo’shish ≤ 20-40 ms; shardlar o’rtasidagi leytensiy farqi X% doirasida; foydalanish imkoniyati ≥ 99. 9%.
Metriklar: op-latentlik, queue depth, ikkilamchi, cache/WT statistikasi, page faults, lock-waits, ochiq kursorlar/ulanishlar soni.
Profillash:’system. profile’,’explain («executionStats»)’, toʻplamlar/indekslarni blokirovka qilish.
Alertlar: WT cache pressure o’sishi, sekin operatsiyalar, indeksga tushmagan so’rovlarning o’sishi, ikkilamchi orqada qolish, chunk migrations/balanschi.
Unumdorlik va tyuning
WiredTiger Cache: 50% RAM ~ andoza - profil uchun tasdiqlang.
Compression: kolleksiyalar uchun snappy/zstd, jurnallar uchun zstd - CPU/IO balansi.
Batch-qo’shimchalar va bulkWrite telemetriya uchun.
Projection (’{field: 1}’) «qalin» hujjatlarni tortmaslik uchun.
Limit/Skip: katta’skip’dan qoching → kursor/marker’(’createdAt/_ id’)’dan foydalaning.
«Halqa» jildlar uchun jamlanmalar.
Xavfsizlik va komplayens
Auth/RBAC: to’plamdagi rollar, minimal imtiyozlar.
Tranzitda TLS, diskda shifrlash (FLE/at-rest).
PII siyosati: niqoblash/taxalluslashtirish, sezgir maydonlar uchun alohida kolleksiyalar.
Multi-tenantlik: prefikslar/alohida DB/kolleksiyalar,’tenantId’bo’yicha filtrlar, ilovadagi RLS kabi qatlamlar bo’lishi mumkin.
Audit: tanqidiy kolleksiyalardagi operatsiyalar auditini kiriting.
Bekaplar, PITR va DR
Point-in-Time Recovery uchun snapshots + oplog-backaplar.
DR uchun boshqa mintaqadagi replika-set; muntazam tiklash o’quv mashg’ulotlari.
Qo’shimchalar cho’qqisi ostida oplog o’sishini nazorat qilish (PSP vebxuklari/turnirlari).
Shard-klasterlarda - config-server bilan kelishilgan bekaplar.
Boshqa arxitektura bilan integratsiya
CQRS: jamoalar SQL (pul) ga zarba berishadi, voqealar → MongoDB Materialized Views.
Event-Streaming: Kafka/Pulsar shina sifatida, Mongo - sink/source konnektorlar va Change Streams orqali.
Redis: yonida ultra past latentlik qatlami (kesh/hisoblagich) kabi.
OLAP: uzun skanerlar va BI uchun ClickHouse/Pinotga tushirish.
Joriy etish chek-varaqasi
1. Mongo’da (moslashuvchan/yuqori TPS/proyeksiyalar) nima borligini, SQLda nima qolishini aniqlang.
2. Shema contracts: JSON Schema Validation,’schemaVersion’.
3. Haqiqiy so’rovlar uchun indekslarni loyihalashtiring; shovqinli maʼlumotlar uchun TTL qoʻshing.
4. Shard key (yuqori kardinallik, tekislik) ni tanlang; zarurat bo’lganda - zone-sharding.
5. SLO uchun replika-setni, Read/Write Concernni moslash; read-after-write siyosati.
6. Kuzatish va profillashni/WT cache/oplog indekslariga kiriting.
7. + PITR, DR-klaster va muntazam mashqlar tashkil qiling.
8. Kesh va shinalarni sinxronlash uchun Change Streams/Outbox tarmogʻiga ulaning.
9. Hujjat oʻlchamini cheklang; kursor bo’yicha paginatsiyani joriy qiling.
10. PII/tenantlar uchun alohida siyosatlar, shifrlash, audit.
Antipatternlar
«Sxemasiz»: validatsiya va versiyalar yo’qligi → xaos.
Vaqt boʻyicha shard-kalit/monoton - issiq shard va beqaror p99.
Joynalar’$lookup’indekssiz/paginatsiyasiz katta toʻplamlarda.
Hamma joyda tranzaksiyalardan foydalanish.
Loglar uchun TTL/retensiya yo’qligi → hajmi va qiymati oshishi.
Muhim pul invarantlarini faqat Mongoda qat’iy idempotentsiz saqlash.
Yakunlar
MongoDB - iGaming moslashuvchan domenlari uchun kuchli vosita: profillar, kataloglar, telemetriya, proyeksiyalar va shaxsiylashtirish. Muvaffaqiyat kaliti - sxema-kontraktlar va validatsiya, puxta o’ylangan indeksatsiya, to’g "ri tanlangan shard key, ongli Read/Write Concern, Change Streams integratsiyalashuv uchun va qattiq foydalanish intizomi (kuzatuv, bekap, DR). SQL yadrosi va striming shinasi bilan birgalikda bu platformaga tezkor interfeyslar va turnir cho’qqilariga chidamlilik beradi.