GH GambleHub

MongoDB və çevik məlumat sxemləri

(Bölmə: Texnologiya və Infrastruktur)

Qısa xülasə

MongoDB - çevik sxemlər (BSON), sürətli əlavələr, üfüqi miqyaslı və güclü Aggregation Pipeline ilə sənədyönümlü anbar. iGaming-də oyunçu profilləri, çevik CRM kartları, hadisə qeydləri, telemetriya, axın materiallaşdırılmış proyeksiyaları, oyun kataloqları və cəbhələr üçün cached performans üçün əladır. Pul variantları üçün (cüzdan/ledger) daha çox SQL/CP kontur qalır; MongoDB read-model və yüksək performanslı sənədli saxlama kimi uyğun gəlir.


Harada MongoDB iGaming maksimum verir

Oyunçuların profilləri və parametrləri: dəyişən strukturlar (lokal parametrlər, üstünlüklər, KYC metadata).
Məzmun/oyun/provayder kataloqları: kartların sürətli oxunması, filtrlər, etiketləmə, tam mətn.
Hadisələr/telemetriya/jurnallar: yüksək TPS, müvəqqəti pəncərələr, TTL saxlama.
Materiallaşdırılmış performans (CQRS): sürətli ekranlar (liderbordlar, son hərəkətlər, aqreqatlar).
Personalization/Fich online ML: Kolleksiyalarda KV nümunələri, qısa TTL.


Çevik sxem prinsipləri: xaos əvəzinə nizam-intizam

MongoDB «sxem olmadan» deyil - sxem kod və validasiya yaşayır.

Tövsiyə olunur:

1. Müqavilə kimi sxem: Kolleksiyalarda JSON Schema Validation.

2. 'schemaVersion' sahəsi ilə sənədlərin versiyası.

3. Ciddi məcburi sahələr (id, axtarış açarları), nadir atributların «quyruğu» - isteğe bağlıdır.

4. Massivlərin ölçüsü və daxili limiti (indekslər və RAM üçün).

5. Arxa planda miqrasiyalar: 'schemaVersion' yeniləmələri, şedulerlər, arxa filllər.

Nümunə: 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" }
}
}
}
}
}
});

Data modeli və sənədlərin layihələndirilməsi

«Sorğu altında» layihələndirin: 1 ekran/end = 1 sənəd və ya kiçik sənəd dəsti.
Denormallaşma: kiçik alt sənədləri daxil edin (məsələn, oyun provayderlərinin mini kartları).

Linklər vs inteqrasiya:
  • Gömülmə - sıx bağlı və nadir yenilənən fraqmentlər üçün.
  • Linklər ('ref') - böyük ölçülü/tez-tez yenilənən/təkrar istifadə edildikdə.
  • Ölçü məhdudiyyəti: 16 MB ≤ sənəd; böyük binarniklər - GridFS/obyekt anbarları.
  • Audit/meta məlumat: 'createdAt', 'updatedAt', 'traceId', 'tenantId', 'idempotencyKey'.

Indekslər: oxu keyfiyyəti və latency sabitliyi

İndeks və təcrübə növləri:
  • B-Tree (əsas)

Compound: sahələrin sırası tez-tez predikatlara və çeşidləmələrə uyğun gəlir.
Prefix-qayda: '(tenantId, playerId, createdAt)' üçün prefiks variantları işləyir.
Çeşidləmə: indeksin sonunda 'sort' qeyd edin (məsələn, 'createdAt: -1').

js db.bets.createIndex(
{ tenantId: 1, playerId: 1, createdAt: -1 },
{ name: "idx_bets_tenant_player_created_desc" }
);

Partial / Sparse

Tez-tez olan alt çoxluqları sürətləndirir ('status:' pending ''), ölçüsünü azaldır.

js db.withdrawals.createIndex(
{ playerId: 1, createdAt: -1 },
{ partialFilterExpression: { status: "pending" } }
);

TTL

Telemetriya/log/müvəqqəti fich üçün - avtomatik bitmə.

js db.events.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 });

Mətn/autocomplete

'text' tam mətn üçün (dil məhdudiyyətləri); avtomatik tamamlama üçün - 'n-gram '/trigram sahələr və regex yanaşmalar və ya Atlas Search vasitəsilə.

Antipattern indeksləri

«Hər şey» indeksi → yazma sürətinin azalması.
partial → aşağı seçicilik olmadan aşağı kardinallıq.
Kompaundların təkrarlanması.
Limitsiz nəhəng massivlər daxilində sahələri indeksləşdirin.


Aggregation Pipeline: sürətli ekranlar və hesabatlar

'$match' → '$sort' → '$limit' erkən mərhələlər kimi istifadə edin; «$match/ $sort» altındakı indeksləri layihələndirin.
Nəzarət edilən joynlar üçün '$lookup' (yumşaq, ağlabatan həcmdə).
'$facet' çoxmetrika üçün; '$unionWith' - kolleksiyaların birləşməsi.
'$merge '/' $out' - kolleksiyada nəticələrin materiallaşdırılması (read-models).

Məsələn: son oyunçu bahisləri + tağ:
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" }
} }
]);

Əməliyyatlar, uyğunluq və idempotentlik

Single-document atomic - pulsuz atom; mürəkkəb invariantlar - sənədlərin bölünməsi haqqında düşünün.
Multi-document transactions (ACID) - replika-setlər ilə mövcuddur, lakin latency daha bahalı; nöqtəli tətbiq edin.

Write Concern / Read Concern:
  • 'w: kritik qeydlər üçün' majority '(latency dəyəri);
  • 'readConcern:' majority 'razılaşdırılmış oxumaq üçün.
  • İdempotentlik: 'idempotencyKey '/' pspTx', UPSERT əməliyyatlarında unikal açarlar ('$setOnInsert', '$inc').
UPSERT nümunəsi:
js db.wallet.updateOne(
{ playerId: "p123" },
{ $inc: { balanceCents: -5000 }, $set: { updatedAt: new Date() } },
{ upsert: true, writeConcern: { w: "majority" } }
);
💡 Pul invariantları üçün adətən SQL-ə üstünlük verilir. Mongo-da - yalnız açarların ciddi intizamı/idempotantlığı və məhdud əməliyyatlarla.

Şardlaşdırma və açar seçimi

MongoDB şard key ilə şardlanır. Seçim kritikdir:
  • Yük paylanması: yüksək kardinallıq və vahid paylanma açarı (məsələn, '(tenantId, playerId)').
  • Monotonluqdan çəkinin: 'createdAt' yeganə açar → «isti» şard.
vs hash diapazonları:
  • Hashed - qeydləri daha bərabər paylayır.
  • Ranged - aralıq sorğular üçün daha yaxşıdır, lakin isti quyruqları izləyin.
  • Tənzimləyici/lokalizasiya (EU/LatAm/TR) üçün zona-şardinq (tag ranges).
Nümunə:
js sh.enableSharding("igaming");
db.bets.createIndex({ tenantId: 1, playerId: 1, _id: "hashed" });
sh.shardCollection("igaming.bets", { tenantId: 1, playerId: 1, _id: "hashed" });
Antipattern:
  • Aşağı kardinallığa görə şard açarı ('status') - şard çarpazlığı.
  • Tez-tez '$lookup' bir açar üçün co-charding olmadan charded kolleksiyalar arasında.
  • Dəyişdirilə bilən shard key (dəyişdirmək çətin və bahadır).

Replika-set, oxu və read-after-write siyasəti

Replika-set = HA və əməliyyatların əsası.

Read Preference:
  • kritik read-after-write üçün 'primary';
  • 'primaryPreferred '/' secondary' - analitik/qeyri-tənqidi üçün.
  • Read/Write concern SLO və latency büdcəsi ilə razılaşdırın.

Change Streams, CDC və inteqrasiya

Change Streams: abunə/update/silinir - üçün əlverişli:
  • cache layları sinxronizasiya (Redis),
  • CRM/bildiriş tetikləyiciləri,
  • OLAP yükləmələri (ClickHouse/Pinot),
  • reaktiv ekranlar.
  • Outbox-pattern: Kritik domenlər üçün hadisələri ayrı bir kolleksiyaya yerləşdirin, sonra konnektor oxuyur və şinə (Kafka) yayımlanır. Bu, inteqrasiyanın proqnozlaşdırılmasını artırır.

Müşahidə və SLO

SLO: p99 kart oxu ≤ 10-20 ms; hadisələri ≤ 20-40 ms; Şardlar arasındakı leytens fərqi X%; mövcudluğu ≥ 99. 9%.
Metriklər: gizli, queue depth, ikincil, cache/WT statistikası, page faults, lock-waits, açıq kursorların/birləşmələrin sayı.
Profil: 'system. profile ',' explain («executionStats») ', kolleksiyaların/indekslərin bloklanması.
Alertlər: WT cache pressure böyüməsi, yavaş əməliyyatlar, indeksə daxil olmayan sorğuların böyüməsi, ikincil geriləmə, chunk migrations/balans.


Performans və sazlama

WiredTiger Cache: default ~ 50% RAM - profil altında valid.
Compression: kolleksiyalar üçün snappy/zstd, jurnallar üçün zstd - CPU/IO balansı.
Telemetriya üçün Batch-insert və bulkWrite.
Projection ('{field: 1}') «qalın» sənədləri çəkməmək üçün.
Limit/Skip: böyük 'skip' → pagination/marker ('createdAt/_ id') istifadə edin.
Capped kolleksiyaları üçün «ring» yuvaları.


Təhlükəsizlik və uyğunluq

Auth/RBAC: kolleksiya/DB rolları, minimal lazımi imtiyazlar.
tranzit TLS, disk şifrələmə (FLE/at-rest).
PII siyasətləri: maskalanma/təxəllüs, həssas sahələr üçün ayrı-ayrı kolleksiyalar.
Multi-tenantlıq: prefikslər/ayrı-ayrı DB/kolleksiyalar, 'tenantId' filtrləri, tətbiqdə RLS kimi təbəqələr ola bilər.
Audit: Kritik kolleksiyalarda əməliyyatların auditini daxil edin.


Backup, PITR və DR

Şəkil (snapshots) cildləri + Point-in-Time Recovery üçün oplog-backup.
DR üçün başqa bir bölgədə replika-set; müntəzəm bərpa təlimləri.
Oplogun böyüməsinə nəzarət (PSP webhucks/turnirləri).
Şard-klasterlərdə - config-server ilə razılaşdırılmış backaplar.


Digər memarlıq ilə inteqrasiya

CQRS: komandalar SQL vurur (pul), hadisələr → MongoDB Materialized Views.
Event-Streaming: Kafka/Pulsar bir şin kimi, Mongo - sink/source connectors və Change Streams vasitəsilə.
Redis: ultra aşağı gecikmə təbəqəsi (caches/counters) kimi yaxındır.
OLAP: Uzun skanlar və BI üçün ClickHouse/Pinot-a boşaltma.


Giriş çek siyahısı

1. Domenləri düzəldin: nə Mongo (çevik/yüksək TPS/proyeksiyalar), nə SQL-də qalır.
2. Müəyyən schema contracts: JSON Schema Validation, 'schemaVersion'.
3. Real sorğular üçün indeksləri dizayn edin; «səs-küylü» məlumatlar üçün TTL əlavə edin.
4. Seçin shard key (yüksək kardinallıq, vahid); lazım olduqda - zone-charding.
5. SLO altında replika-set, Read/Write Concern konfiqurasiya; read-after-write siyasəti.
6. / WT cache/oplog indeksləri üçün müşahidə və profil, riskləri daxil edin.
7. Backup + PITR, DR-klaster və müntəzəm təlimlər təşkil edin.
8. Cache və şinləri sinxronlaşdırmaq üçün Change Streams/Outbox bağlayın.
9. Sənədlərin ölçüsünü və yerləşdirilməsini məhdudlaşdırın; Kursor üçün paqinasiya tətbiq edin.
10. PII/tenant, şifrələmə, audit üçün ayrı-ayrı siyasətlər.


Antipatternlər

Prodda «sxem olmadan»: validasiya və versiyaların olmaması → xaos.
Vaxt açarı/monoton - isti şard və qeyri-sabit p99.
Coynalar '$lookup' indeks/paginasiya olmadan böyük dəstlərdə.
Əməliyyat hər yerdə istifadə - performans itkisi.
Loads üçün TTL/Retance yoxdur → həcm və dəyər artımı.
ciddi idempotentlik olmadan yalnız Mongo kritik pul invariantları saxlamaq.


Nəticələr

MongoDB - iGaming çevik domenləri üçün güclü vasitədir: profillər, kataloqlar, telemetriya, proyeksiyalar və personallaşdırma. Uğur açarı - sxem-müqavilələr və validasiya, düşünülmüş indeksasiya, düzgün seçilmiş şard key, şüurlu Read/Write Concern, inteqrasiya üçün Change Streams və sərt əməliyyat intizamı (müşahidə, arxa, DR). SQL nüvəsi və axın şinası ilə birlikdə bu platformaya sürətli interfeyslər və turnir zirvələrinə sabitlik verir.

Contact

Bizimlə əlaqə

Hər hansı sualınız və ya dəstək ehtiyacınız varsa — bizimlə əlaqə saxlayın.Həmişə köməyə hazırıq!

İnteqrasiyaya başla

Email — məcburidir. Telegram və ya WhatsApp — istəyə bağlıdır.

Adınız istəyə bağlı
Email istəyə bağlı
Mövzu istəyə bağlı
Mesaj istəyə bağlı
Telegram istəyə bağlı
@
Əgər Telegram daxil etsəniz — Email ilə yanaşı orada da cavab verəcəyik.
WhatsApp istəyə bağlı
Format: ölkə kodu + nömrə (məsələn, +994XXXXXXXXX).

Düyməyə basmaqla məlumatların işlənməsinə razılıq vermiş olursunuz.