GH GambleHub

MongoDB 및 유연한 데이터 스키마

(섹션: 기술 및 인프라)

간략한 요약

MongoDB는 유연한 회로 (BSON), 빠른 인서트, 수평 스케일링 및 강력한 집계 파이프 라인을 갖춘 문서 지향 스토리지입니다. iGaming에서는 플레이어 프로필, 유연한 CRM 카드, 이벤트 로그, 원격 측정, 구체화 된 스트림 프로젝션, 게임 카탈로그 및 캐시 된 전면보기에 적합합니다. 통화 불변량 (지갑/원장) 의 경우 SQL/CP 윤곽이 더 자주 남습니다. MongoDB는 읽기 모델 및 고성능 문서 저장소로 적합합니다.

MongoDB가 iGaming을 최대한 활용하는 곳

플레이어 프로필 및 설정: 구조 변수 (로케일 설정, 기본 설정, KYC 메타 데이터).
컨텐츠/게임/제공자 카탈로그: 빠른 카드 읽기, 필터, 태그 지정, 전체 텍스트.
이벤트/원격 측정/로그: 높은 TPS, 시간 창, TTL 스토리지.
CQRS (Materialized Views): 빠른 화면 (리더 보드, 최근 작업, 집계).
개인화/온라인 ML: 컬렉션의 KV 패턴, 짧은 TTL.

유연한 계획의 원칙: 혼돈 대신 징계

MongoDB는 "스키마가없는" 것이 아닙니다. 스키마는 코드와 검증에 있습니다.

추천:

1. 계약 체계: 컬렉션의 JSON 스키마 검증.

2. 'schemaVersion' 필드로 문서를 검증합니다.

3. 엄격한 필수 필드 (id, 검색 키), 희귀 속성의 "꼬리" - 선택 사항.

4. 컨스트레인 배열 치수 및 중첩 (인덱스 및 RAM).

5. 백그라운드에서의 마이그레이션: 'schemaVersion', shedulers, back fills에 의한 업데이트.

예: 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 개의 문서 또는 작은 문서 세트.
비정규화: 첨부 된 작은 하위 문서 (예: 게임 제공 업체의 미니 카드) 가 포함됩니다.

링크 대 임베딩:
  • 엠베딩-밀접하게 관련되고 드물게 업데이트되는 조각.
  • 참조 ('ref') - 큰 크기/빈번한 업데이트/재사용.
  • 크기 제한: 문서 곳에 16MB; 큰 바이너리-GridFS/오브젝트 스토리지.
  • 감사/메타 데이터: '감사', '업데이트', '트레이스', '테 난트', '데임 포텐 키'.

색인: 읽기 품질 및 대기 시간 안정성

색인 유형 및 관행:
  • B 트리 (1 차)

화합물: 필드의 순서는 빈번한 술어 및 정렬에 해당합니다.
접두사 규칙: 접두사 옵션은 '(tenantID, playerID, leardat)' 에 대해 작동합니다.
정렬: 색인 끝에서 '정렬' 을 고려하십시오 (예: 'dAt: -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" } }
);

TTL

원격 측정/로그/임시 기능-자동 만료.

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

텍스트/자동 완성

전문의 '텍스트' (언어 제한); 필드 및 정규 접근 방식 또는 Atlas 검색을 통한 자동 완료- 'n-gram '/trigram입니다.

인덱스 안티 패턴

"모든" 인덱스 → 쓰기 속도 저하.
부분 → 낮은 선택성이없는 낮은 카디널리티.
중복 화합물.
제한없이 거대한 배열 내부의 색인 필드.

집계 파이프 라인: 빠른 스크린 및 보고서

초기 단계로 '$ match' → '$ sort' → '$ limite' 를 사용하십시오. '$ match/$ sort' 에서 프로젝트 지수.
통제 된 조인을위한 '$ cooting' (부드럽고 합리적인 볼륨).
여러 측정 항목의 '$ facet'; '$ unionWith' -컬렉션을 병합하십시오.
'$ merge '/' $ out' -컬렉션의 결과를 구체화합니다 (읽기 모델).

예: 마지막 플레이어 베팅 + 볼트:
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" }
} }
]);

거래, 일관성 및 demmpotency

단일 문서 원자-자유 원자; 복잡한 불변량-문서 분할을 생각하십시오.

다중 문서 거래 (ACID) - 복제 세트와 함께 사용할 수 있지만 대기 시간이 더 비쌉니다. 포인트 단위로 적용하십시오

우려 쓰기/읽기 우려:
  • 중요한 기록 (대기 비용) 에 대한 'w: "대다수";
  • 일관된 읽기를위한 'readConcern:' major ''.
  • 이데올로기: 'deidempotencyKey '/' pspTx', UPSERT 작업 ('$ setOninspit', '$ inc') 의 고유 키.
UPSERT 예:
js db. wallet. updateOne(
{ playerId: "p123" },
{ $inc: { balanceCents: -5000 }, $set: { updatedAt: new Date() } },
{ upsert: true, writeConcern: { w: "majority" } }
);
💡 통화 불변량의 경우 SQL이 일반적으로 선호됩니다. 몽고에서는 엄격한 키/demotence 규율 및 제한된 거래 만 가능합니다.

샤딩 및 키 선택

파편 키에 의한 MongoDB 파편. 선택은 매우 중요합니다

로드 분포: 높은 카디널리티 키 및 균일 한 분포 (예: '(tenantID, playerID)').
단조로운 것을 피하십시오: 유일한 키 → "핫" 파편으로 '이동'.

범위 대 해시:
  • 해시-레코드를보다 균등하게 배포합니다.
  • Ranged는 레인지 쿼리에 더 좋지만 뜨거운 꼬리를보십시오.
  • 규제/현지화 태그 범위 (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" });
안티 패턴:
  • 낮은 카디널리티 ('상태') 에 의한 샤드 키-파편의 왜곡.
  • 한 번에 하나의 키를 공유하지 않고 날카로운 컬렉션간에 빈번한 '$ cooting'.
  • 체인지 가능한 파편 키 (변경하기 어렵고 비용이 많이 듭니다).

복제본 설정, 읽기 및 쓰기 후 정책 읽기

Replica set = HA 및 트랜잭션 기준.

선호도 읽기:
  • 쓰기 후 중요한 읽기를위한 '기본';
  • '1 차 우선 순위 '/' 2 차' -분석/비 임계.
  • 읽기/쓰기 우려는 SLO 및 대기 시간 예산과 조정됩니다.

스트림, CDC 및 통합 변경

스트림 변경: 인서트/업데이트/삭제 가입-편리합니다:
  • 캐시 계층 동기화 (Redis)
  • CRM 트리거/알림,
  • OLAP (Clickhouse/Pinot) 로 다운로드,
  • 반응성 화면.
  • 전송 패턴: 중요한 도메인의 경우 이벤트를 별도의 컬렉션에 게시 한 다음 커넥터를 읽고 버스 (Kafka) 로 변환하십시오. 이것은 통합의 예측 가능성을 증가시킵니다.

관찰 가능성 및 SLO

SLO: p99 카드 판독 이벤트 삽입 X% 내 파편 간의 유동성 차이; 가용성은 99 이상입니다. 9%.
측정 항목: op-latency, 큐 깊이, 2 차당 umps의%, 캐시/WT 통계, 페이지 결함, 잠금 대기, 열린 커서/연결 수.
프로파일 링: '시스템. 프로필 ',' 설명 ("실행 통계"), 수집/색인 잠금 장치.
경고: WT 캐시 압력 증가, 느린 운영, 색인에 포함되지 않은 요청 증가, 2 차 요청 백 로그, 청크 마이그레이션/밸런서.

성능 및 튜닝

WiredTiger Cache: 기본적으로 ~ 50% RAM-프로필 유효성 검사.
압축: 컬렉션의 경우 snappy/zstd, 로그의 경우 zstd-CPU/IO 잔액.
원격 측정을위한 배치 인서트 및 bulkWrite.
"두꺼운" 문서를 드래그하지 않도록 투영 ('{field: 1}').
제한/건너 뛰기: 큰 '건너 뛰기' → 커서/마커 페이지 매김 ('dat/_ id') 을 사용하지 마십시오.
"링" 로그에 대한 캡핑 된 컬렉션.

안전 및 준수

Auth/RBAC: 수집/데이터베이스의 역할, 최소 필수 권한.
전송 TLS, 디스크의 암호화 (FLE/at-rest).
PII 정책: 마스킹/앨리어싱, 민감한 필드에 대한 별도의 컬렉션.
멀티 테넌시: 접두사/개별 데이터베이스/수집, 'tenantID' 필터, 응용 프로그램에서 RLS와 유사한 레이어를 사용할 수 있습니다.
감사: 중요한 컬렉션에 대한 작업 감사를 가능하게합니다.

백업, PITR 및 DR

Point-in-Time Recovery를위한 볼륨 + oplog 백업의 스냅 샷.
DR을 위해 다른 영역에 설정된 복제본; 정기적 인 회복 운동.
삽입 피크에 대한 oplog 성장 제어 (PSP 웹 후크/토너먼트).
파편 클러스터에서-설정 서버를 사용한 일관된 백업.

나머지 아키텍처와 통합

CQRS: 팀이 MongoDB에서 SQL (돈), 이벤트 → Materialized Views를 쳤다.
이벤트 스트리밍: 버스로 Kafka/Pulsar, Mongo-커넥터를 통한 싱크/소스 및 변경 스트림.
Redis: 초저 대기 시간 층 (캐시/카운터) 으로 근처에 있습니다.
OLAP: 긴 스캔 및 BI를 위해 ClickHouse/Pinot에 업로드하십시오.

구현 체크리스트

1. 수정 도메인: Mongo (유연한/높은 TPS/프로젝션), SQL에 남아있는 것.
2. 스키마 계약: JSON Schema Validation, 'schemaVersion' 을 정의하십시오.
3. 실제 쿼리에 대한 디자인 색인; 시끄러운 데이터에 TTL을 추가합니다.
4. 파편 키 선택 (높은 카디널리티, 균일 성); 필요한 경우-영역 샤딩.
5. SLO에 대한 복제 세트, 읽기/쓰기 문제 설정; 쓰기 후 읽기 정책.
6. 관찰 가능성 및 프로파일 링 사용 ,/WT 캐시/oplog 인덱스 알림.
7. 백업 + PITR, DR 클러스터 및 정기적 인 운동을 구성하십시오.
8. 캐시와 버스를 동기화하기 위해 스트림 변경/전송을 연결하십시오.
9. 문서 크기와 중첩을 제한합니다. 커서에 의한 페이지 매김 구현.
10. PII/테넌트, 암호화, 감사에 대한 별도의 정책.

반 패턴

제품의 "계획 없음": 검증 부족 및 버전 → 혼돈.
시간/단조로운 샤드 키-핫 샤드 및 불안정한 p99.
Joynes의 $ cooling 'on 인덱스/페이지 매김없이 거대한 세트.

모든 곳에서 거래를 사용하십시오-생산성

로그에 대한 TTL/보유 부족 → 부피 및 비용의 증가.
엄격한 dempotency없이 Mongo에서만 중요한 통화 불변량을 저장하십시오.

요약

MongoDB는 프로파일, 디렉토리, 원격 측정, 투영 및 개인화와 같은 유연한 iGaming 도메인을위한 강력한 도구입니다. 성공의 핵심은 계약 체계 및 검증, 사려 깊은 색인, 잘 선택된 파편 키, 의식적인 읽기/쓰기 문제, 통합을위한 스트림 변경 및 엄격한 운영 규율 (관찰 가능성, 백업, DR) 입니다. SQL 코어 및 스트리밍 버스와 결합하여 플랫폼에 빠른 인터페이스와 토너먼트 피크의 안정성을 제공합니다.

Contact

문의하기

질문이나 지원이 필요하시면 언제든지 연락하십시오.우리는 항상 도울 준비가 되어 있습니다!

통합 시작

Email — 필수. Telegram 또는 WhatsApp — 선택 사항.

이름 선택 사항
Email 선택 사항
제목 선택 사항
메시지 선택 사항
Telegram 선택 사항
@
Telegram을 입력하시면 Email과 함께 Telegram에서도 답변드립니다.
WhatsApp 선택 사항
형식: +국가 코드 + 번호 (예: +82XXXXXXXXX).

버튼을 클릭하면 데이터 처리에 동의하는 것으로 간주됩니다.