GH GambleHub

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).

Collegamenti di incorporazione vs:
  • 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).

Esempio: le ultime scommesse del giocatore + serie:
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.

Write Concern / Read Concern:
  • w: «majority» per i record critici (costo latency);
  • "readConcern:" majority "per una lettura coerente.
  • Idampotenza: chiavi uniche su «idempotencyKey »/« pspTx», operazioni UPSERT («$setOnInsert», «$ inc»).
Esempio UPSERT:
js db.wallet.updateOne(
{ playerId: "p123" },
{ $inc: { balanceCents: -5000 }, $set: { updatedAt: new Date() } },
{ upsert: true, writeConcern: { w: "majority" } }
);
💡 Per gli invarianti di denaro di solito preferiscono SQL. In Mongo: solo con una disciplina rigorosa di chiavi/idempotenza e transazioni limitate.

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.
Intervalli vs hash:
  • 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).
Esempio:
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.

Contact

Mettiti in contatto

Scrivici per qualsiasi domanda o richiesta di supporto.Siamo sempre pronti ad aiutarti!

Avvia integrazione

L’Email è obbligatoria. Telegram o WhatsApp — opzionali.

Il tuo nome opzionale
Email opzionale
Oggetto opzionale
Messaggio opzionale
Telegram opzionale
@
Se indichi Telegram — ti risponderemo anche lì, oltre che via Email.
WhatsApp opzionale
Formato: +prefisso internazionale e numero (ad es. +39XXXXXXXXX).

Cliccando sul pulsante, acconsenti al trattamento dei dati.