diagrammi di dati MongoDB e flessibili
(Sezione Tecnologia e infrastruttura)
Breve riepilogo
MongoDB - Storage incentrato su documentario con diagrammi flessibili (BSON), inserimenti rapidi, ridimensionamento orizzontale e la potente Aggregation Pipeline. Il iGaming è perfetto per i profili dei giocatori, le schede CRM flessibili, i loghi di eventi, la telemetria, le proiezioni materializzate di striam, i cataloghi di giochi e le rappresentazioni di diapositive per i fronti. Per gli invarianti in denaro (portafogli/ledger), il tracciato SQL/COP rimane più spesso; MongoDB è appropriata come read-model e storage documentario ad alte prestazioni.
Dove il MongoDB dà il massimo nel iGaming
I profili e le impostazioni dei giocatori sono variabili di struttura (impostazioni locali, preferenze, metadati KYC).
Cataloghi di contenuti/giochi/provider: lettura rapida di schede, filtri, tag, full text.
Eventi/telemetria/registri: alta TPS, finestre temporali, archiviazione TTL.
Viste materializzate (CQRS) - Schermate veloci (liderboard, azioni recenti, aggregazioni).
Personalizzazione/fitta online ML: KV-pattern in collezioni, TTL breve.
Schema flessibile: disciplina anziché caos
Non è «senza schema». Lo schema vive nel codice e nella validazione.
Raccomandato:1. Schema come contratto: JSON Schema Validation nelle collezioni.
2. Versioning dei documenti con il campo «schemaVersion».
3. Campi obbligatori rigorosi (id, chiavi di ricerca), coda di attributi rari - opzionale.
4. Vincola la dimensione degli array e l'allegato (per indici e RAM).
5. Migrazioni a sfondo: update a «schemaVersion», shadowler, back-fill.
Esempio: 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" }
}
}
}
}
}
});
Modello di dati e progettazione dei documenti
Progettare «sotto richiesta»: 1 schermo/endpoint = 1 documento o una piccola serie di documenti.
Denormalizzazione: includere piccoli sottocartelli (ad esempio mini-schede dei provider di giochi).
- Incorporazione: per porzioni strettamente correlate e raramente aggiornate.
- Riferimenti ('ref') - A grandi dimensioni/frequenti update/riutilizzo.
- Limite di dimensione: documento ≤ 16 MB; binari di grandi dimensioni - GridFS/magazzini per oggetti.
- /metadati: « », « », « », « », « ».
Indici: qualità della lettura e stabilità latency
Tipi di indice e di pratica:- B-Tree (principale)
Compound: l'ordine dei campi corrisponde a predici e ordinamenti frequenti.
Regola preferenziale: per «(tenantId, playerId, createdAt)» funzionano le varianti prefisso.
Ordina: tieni conto dì sort "alla fine dell'indice (ad esempio," createdAt: -1 ").
js db.bets.createIndex(
{ tenantId: 1, playerId: 1, createdAt: -1 },
{ name: "idx_bets_tenant_player_created_desc" }
);
Partial / Sparse
Accelerano i sottoinsiemi frequenti ('status: pending'), riducono le dimensioni.
js db.withdrawals.createIndex(
{ playerId: 1, createdAt: -1 },
{ partialFilterExpression: { status: "pending" } }
);
TTL
Per la telemetria/logi/fiocchi temporali, scollegamento automatico.
js db.events.createIndex({ expireAt: 1 }, { expireAfterSeconds: 0 });
Testo/autocomplete
«text» per il testo completo (restrizioni linguistiche) per completamento automatico - 'n-gram '/triangram attraverso campi e approcci regex o Atlas Search.
Antipattern indice
L'indice «per tutti» è un calo della velocità di scrittura.
Bassa cardinalità senza partiale, bassa selettività.
Compound duplicati.
Indicizza i campi all'interno di array giganti senza limiti.
Aggregation Pipeline - Schermate veloci e report
Usa "$ match" → "$ →" $ limit "come fasi iniziali; progettare indici sotto «$ match/$ sart».
«$ lookup» per i gioielli controllati (morbidi, in quantità ragionevoli).
«$ facet» per le metriche multiple, «$unionWith» per unire le collezioni.
'$ merge '/' $ out' - Materializzazione dei risultati nella raccolta (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" }
} }
]);
Transazioni, coerenza e idipotenza
Single-type atomic - gratuità atomica; invarianti complicati, pensate a dividere i documenti.
Multi-Izzazioni (ACID) - Disponibile con repliche di rete, ma più costoso in latency; Usare con precisione.
- w: «majority» per i record critici (costo latency);
- "readConcern:" majority "per una lettura coerente.
- Idampotenza: chiavi uniche su «idempotencyKey »/« pspTx», operazioni UPSERT («$setOnInsert», «$ inc»).
js db.wallet.updateOne(
{ playerId: "p123" },
{ $inc: { balanceCents: -5000 }, $set: { updatedAt: new Date() } },
{ upsert: true, writeConcern: { w: "majority" } }
);
Charding e selezione delle chiavi
MongoDB Shard Key. La scelta è critica:- Distribuzione del carico: chiave di alta radicalità e distribuzione uniforme (ad esempio, «(tenantId, playerId)»).
- Evitate la monotonia dì "come unica chiave per un hot shard.
- Hashed - più a posto distribuisce le registrazioni.
- Ranged è migliore per le richieste di intervallo, ma tieni d'occhio le code calde.
- Zona-sharding (tag ranges) per regolazione/localizzazione (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" });
Antipattern:
- La chiave Shard a bassa cardinalità («status») è una distorsione di chard.
- Frequenti «$ lookup» tra collezioni sharded senza co-sharding a una sola chiave.
- Shard key modificabile (difficile e costoso).
Repliche, letture e criteri read-after-write
Replica-set = HA e la base delle transazioni.
Read Preference:- «primary» per i read-after-write critici
- «primaryPreferred »/« secondary» è per analisti/non critici.
- Read/Write concern concordare con SLO e budget latency.
Change Streams, CDC e integrazione
Cambio Streams - Abbonamento a inserimenti/update/rimozione - utile per:- sincronizzazione dei livelli cache (Redis),
- trigger CRM/notifiche,
- download in OLAP (ClickHouse/Pinot),
- schermate reattive.
- Outbox-Pattern: per i domini critici, pubblicare gli eventi in una raccolta separata che il connettore legge e trasmette al bus (Kafka). Questo migliora la prevedibilità delle integrazioni.
Osservabilità e SLO
SLO: p99 letture di schede da 10 a 20 ms; Inserimento di eventi 20-40 ms la differenza di leitensi tra i chard entro il X%; Disponibilità ≥ 99. 9%.
Metriche: latitanza opzionale, queue depth,% di jumps per statistiche secondarie, cache/WT, page faults, lock-wates, puntatori/connessioni aperti.
Profilazione: 'system. profile ',' esplain ', blocchi raccolte/indici.
Alert: crescita WT cache pressure, operazioni lente, crescita delle richieste non iscritte all'indice, ritardo secondario, chunk migrations/bilanciatore.
Prestazioni e tuning
WiredTiger Cache: impostazione predefinita per il tuo profilo.
Compressione: snappy/zstd per le raccolte, zstd per i registri - saldo CPU/IO.
Inserzioni batch e bulkWrite per la telemetria.
Progection ('{field: 1}') per non trascinare documenti «spessi».
Limit/Skip - Evita i grandi «skip» → usa la paginazione puntata/maniglia («createdAt/_ id»).
Raccolte Capped per gli anelli.
Sicurezza e compilazione
Auth/RBAC: ruoli della raccolta/database, privilegi minimi necessari.
TLS in transito, crittografia su disco (FLE/at-rest).
Criteri PII: maschera/alias, raccolte separate per campi sensibili.
Multi-tenantezza: prefissi/singoli database/raccolte, filtri per «tenantId», è possibile utilizzare livelli RLS simili nell'applicazione.
Controllo - Attivare il controllo delle attività nelle raccolte critiche.
Bacapi, PITR e DR
Snapshots dei volumi + oplog per Point-in-Time Recovery.
Replica set in un'altra regione per DR; esercitazioni di ripristino regolari.
Controllo di crescita oplog sotto i picchi di inserimento (PSP webhook/tornei).
I cluster shard includono bacap coerenti con il server config.
Integrazione con il resto dell'architettura
CQRS - I comandi colpiscono SQL (denaro), gli eventi di Materialized Views nel .
Event-Streaming: Kafka/Pulsar come pneumatico, Mongo come sonk/source attraverso connettori e Change Streams.
Redis: accanto come uno strato di latitanza ultra bassa (cache/contatori).
OLAP - Scarica nel ClickHouse/Pinot per scene lunghe e BI.
Assegno foglio di implementazione
1. Fissare i domini in Mongo (TPS/proiezioni flessibili/elevate) che rimangono in SQL.
2. Definisci JSON Schema Validation, «schemaVersion».
3. Progettare gli indici in base alle richieste reali; aggiungere TTL per i dati «rumorosi».
4. Selezionare shard key (alta cardinalità, uniformità); se necessario - zone-sharding.
5. Regolare la replica set, Read/Write Concern sotto SLO; criterio read-after-write.
6. Attivare osservazione e profilassi, alert su indici/WT cache/oplog.
7. Organizzare backup + PITR, DR-cluster e esercizi regolari.
8. Collegare Change Streams/Outbox per sincronizzare cache e pneumatici.
9. Limitare la dimensione e l'allegato dei documenti. incorporare la paginazione del cursore.
10. Regole separate per PII/tenanti, crittografia, controllo.
Antipattern
«Senza schema» in vendita, l'assenza di convalida e di versioni ha → ato il caos.
La chiave Shard tempo/monotono - shard caldo e p99 instabile.
Jorna' $ lookup'su set enormi senza indici/paginazione.
Utilizzare le transazioni ovunque - perdita di prestazioni.
La mancanza di TTL/Retrensione per i reparti ha aumentato il volume e il costo.
Conservare invarianti monetari critici solo in Mongo senza una severa idempotenza.
Riepilogo
MongoDB è uno strumento potente per i domini flessibili del iGaming: profili, cataloghi, telemetria, proiezioni e personalizzazione. La chiave del successo sono gli schemi-contratti e la validazione, l'indicizzazione elaborata, lo shard key ben scelto, il Read/Write Concern consapevole, la Change Streams per le integrazioni e la rigida disciplina operativa (osservabilità, bacap, DR). In combinazione con il nucleo SQL e lo streaming, questo dà alla piattaforma interfacce veloci e resilienza sotto i picchi del torneo.