Motor de directorio de contenido
El motor de catálogo es el núcleo de los escaparates de juegos y selecciones promocionales en el frente: recopila y normaliza metadatos de proveedores (RGS), proporciona búsqueda/filtros/rankings, aplica reglas de disponibilidad por jurisdicciones y marcas, mezcla personalización y juegos promocionales, y luego da respuestas rápidas a través de la API con un SLO predecible.
1) Objetivos y principios
Lecturas rápidas: p95 ≤ 100-150 ms para solicitar un directorio/búsqueda.
Verdad y frescura: la relevancia garantizada de los atributos clave (disponibilidad, jackpots, estados de proveedores).
Flexibilidad: colecciones editoriales y ranuras promocionales sin lanzamientos.
Cumplimiento: reglas de geo/edad/contenido, licencias, restricciones del juego responsable.
Multi-tenant/región: aislamiento de marcas y cumplimiento de la residencia de datos.
Observabilidad: métricas de calidad de emisión, A/B, conversión a juego/apuesta.
2) Modelo de dominio (mínimo)
Entidades:- Game es un juego/producto del proveedor.
- Provider - RGS/estudio.
- Variant - variantes de un juego (volatilidad, líneas, límites, servidor).
- Colección es una selección editorial/automática (por ejemplo, «Novedades», «Botes»).
- Placement - Posición fijada/banner/misterio en la página/en la ranura.
- Capability/Feature - atributos del juego (tiradas gratis, función de compra, premio mayor).
- JurisdictionRule - Reglas de disponibilidad/restricciones.
- Signals - señales conductuales/operativas (popularidad, CTR, revenue).
- Asset es un medio de comunicación (iconos, carteles, vídeos de demostración) con opciones para dispositivos/densidades.
Claves: 'game _ id' (interior estable, no es igual a provider_game_id), 'tenant _ id', 'region', 'locale'.
3) Ingest y normalización
Transportador:1. Adaptadores de origen (pullers): integraciones con RGS/estudios (catálogos, fichas, RTP, etiquetas).
2. Sanitize & Map: mapping de campos externos en un solo diccionario (ACL), validación y deduplicación.
3. Enrich: localizaciones, categorías, etiquetas semánticas, clasificaciones de límite de edad.
4. Moderna: banderas de contenido (NSFW/símbolos religiosos/temas sensibles) por mercado.
5. Publish: eventos 'GameUpserted/ProviderStatusChanged' → proyección de directorios.
Idempotencia: todos los mensajes con 'source _ id' + 'version _ ts'; la repetición se procesa sin efectos secundarios.
Esquema de evolución: 'schema _ version' en adaptadores + migración de mappers.
4) Esquema normalizado (simplificado)
json
{
"game_id": "g_3f92",
"tenant_id": "brand_eu",
"provider": { "id": "pr_evolution", "name": "Evolution" },
"title": { "en": "Lightning Roulette", "de": "Lightning Roulette" },
"capabilities": ["live","roulette","multiplier","bonus"],
"rtp": 97.3,
"volatility": "high",
"limits": { "min": 0.1, "max": 1000.0, "currency": "EUR" },
"jurisdiction": {
"allowed": ["MT","EE","DE"],
"blocked": ["NL","BE"],
"age_rating": 21
},
"assets": {
"tile": { "1x":"...", "2x":"..." },
"poster": { "web":"...", "mobile":"..." }
},
"tags": ["new","jackpot"],
"release_date": "2025-09-12",
"status": "active",
"variants": [{ "id":"v1","server":"eu-central-1","rtp":97.3 }]
}
5) Búsqueda, filtros, facetas
Índices: texto completo por nombre/sinónimos, facetas por 'provider', 'capabilities', 'volatility', 'rtp _ bucket', 'tags'.
Filtros: jurisdicción/región/idioma/dispositivo/edad, sólo activo/certificado.
Sinónimos/estemming: mapa de términos personalizados («cuadernos», «frutas», «bolas»).
Errores tipográficos: búsqueda tolerante (edit distance ≤1 -2) con límite de longitud.
6) Clasificación: señales y fórmula
Señales (ejemplo):- Freshness (hora de lanzamiento).
- Popularity (lanzamientos/hora, jugadores únicos).
- Calidad (CTR de catálogo a juego, 1/7 día de espera).
- Business (boosts de marketing, transacciones, ranuras promocionales).
- Compliance (rebajas suaves para contenido sensible, si es necesario).
- Player-fit (compatibilidad perfil/preferencias).
score = w1freshness + w2popularity + w3ctr + w4player_fit + w5boost
Los pesos son controlados por la configuración/experimentación; todas las señales se normalizan en [0; 1].
7) Personalización
Memoria corta: últimos lanzamientos y géneros, RYW - el usuario ve acciones frescas de inmediato.
Memoria larga: embestidas de juegos y perfil del jugador (géneros de juego/volatilidad/sesiones).
Seguridad: la personalización nunca viola las reglas jurisdiccionales/de edad.
Fallback: si hay pocas señales - clasificación neutral + colecciones editoriales.
8) Colecciones y juegos promocionales
Colecciones:- Auto: regla/consulta (por ejemplo, 'capabilities contains' jackpot 'AND release_date> = NOW () -30d').
- Editorial: lista manual con orden y fecha límite.
- Playsment: posiciones fijadas en las páginas (hero, row-1-slot-3), A/B, orientación por segmentos/jurisdicciones.
- Plazos y prioridades: 'starts _ at/ends _ at', prioridad de colisiones, previsualización antes de la publicación.
9) Cumplimiento y política de accesibilidad
Geo/jurisdicción: listas blancas/negras de países/regiones, verificación de licencias/certificados.
Clasificación de edad: edad mínima, advertencias, ocultación para mercados incompatibles.
Temática/simbolismo: banderas de contenido sensible por país (religión, alcohol, etc.).
Juego responsable: ocultar/bajar para jugadores con límites/tiempo de espera.
Auditoría: registro inmutable de cambios de disponibilidad con razones.
10) Multi-tenant y multi-región
Todos los datos están marcados con 'tenant _ id' y 'region'.
Aislamiento: quórum/almacenamiento por región; proyecciones cruzadas-regionales - sólo unidades.
Fairness: cuotas de ingest/publishing per tenant para que la marca «ruidosa» no retrase al resto.
11) Contorno arquitectónico
Kernel de directorio de escritura (CP): normalización + outbox transaccional de eventos.
Proyecciones/Modelos de lectura (EC): índices de búsqueda, colecciones materializadas, contadores de popularidad.
- Edge/CDN para páginas/imágenes «frías».
- Caché in-memory para consultas en caliente (key = filtros + página + tenant + región).
- Fichflags: laminación de reglas de rankings/colecciones sin lanzamiento.
12) API (NAT/GraphQL, ejemplos)
REST
GET /v1/catalog?tenant=brand_eu®ion=EE&locale=ru
&filter=jackpot,true&sort=score_desc&page=1&size=24
→ 200 { items:[...], facets:{...}, as_of:"2025-10-31T12:10:02Z" }
GraphQL (fragmento)
graphql query Catalog($tenant:String!,$region:String!,$q:String,$filters:Filters){
catalog(tenant:$tenant, region:$region, q:$q, filters:$filters){
items { gameId title provider { name } score badges assets { tile } }
facets { providers { key,count } capabilities { key,count } }
freshnessMs
}
}
Contratos:
- Siempre devuelva 'as _ of/freshnessMs', paginación, facetas.
- Para personalización - marcador de sesión (RYW) sin PII.
13) Señales y flujo de datos
Popularidad: incrementos en el lanzamiento de juegos → baquetas de minutos → unidades en proyección.
CTR/conversión: contadores de clics/lanzamientos en playsments/colecciones.
Estados operativos: salud de los proveedores (RGS), botes/límites (stream de eventos).
Boosts de marketing: coeficientes de tiempo para juegos/categorías/proveedores.
14) Observabilidad y SLO
Métricas de directorio:- `catalog_p95_ms`, `catalog_p99_ms`, `error_rate`.
- 'index _ freshness _ ms' (retraso de diseño), 'ingest _ lag _ ms'.
- 'ctr', 'click-to-launch', 'collection _ coverage' (% de la emisión de las colecciones).
- `lift_ctr`, `lift_conversion`, «explore vs exploit» доля.
- % de reglas geo/de edad aplicadas correctamente, número de bloques/hora.
Alertas: crecimiento de 'ingest _ lag _ ms', caída de CTR en colecciones clave, degradación del proveedor (etiquetas en emisión).
15) Rendimiento y almacenamiento en caché
Estrategia: consultas en caliente: caché de 30 a 120 con clave de filtro; bloques personales - TTL corto (10-30 s) o sin caché.
Discapacidad: por eventos 'GameUpserted/AvailabilityChanged/PlacementUpdated'.
Paginación: cursores estables para no «saltar» las tarjetas cuando se actualizan las señales.
16) Trabajar con los medios de comunicación
Perfiles de renderizado: dimensiones/densidades para web/mobile/TV.
Optimización: WebP/AVIF, lazy-load, sprite/atlas para azulejos.
Seguridad de contenido: escaneo, marcas de agua, prohibición en línea-PII.
17) Pruebas
Contract/Schema tests para adaptadores y API.
Pruebas de relevancia: conjuntos de consultas de oro → resultados/orden esperados.
Personalización: offline AUC/NDCG + online A/B con métricas guardrail (tiempo en juego, depósitos, señales RG).
Chaos: degradaciones de proveedores, picos de ingest, retrasos en la indexación.
18) Playbooks (runbooks)
1. Lag Index> SLO: detener las colecciones secundarias, aumentar la prioridad de ingest, simplificar temporalmente la clasificación.
2. Proveedor «rojo»: bajar/ocultar sus juegos, levantar colecciones alternativas.
3. API error salto: comprobar caché/backend, activar temporizadores de seguridad, reducir el tamaño de las páginas.
4. Disponibilidades incorrectas: revertir la última regla, incluir una «lista blanca» de mercados críticos, auditar los cambios.
5. Rankings release: canario rollout (5% → 25% → 50% → 100%), redespliegue por CTR/conversiones.
19) Errores típicos
Mezcla de circuitos externos de proveedores con un modelo interno (sin ACL).
La ausencia de 'as _ of/freshness' → la controversia sobre el directorio «obsoleto».
Personalización que viola las reglas jurisdiccionales.
La única fórmula «mágica» para clasificar sin descomponer señales y A/B.
Páginas grandes sin caché y cursores → p99 «disparar».
Escritura dual en el índice y OLTP en lugar de eventos + proyecciones.
20) Lista de verificación antes de la venta
- Diccionario normalizado de campos y ACL para todos los proveedores.
- Idempotent ingest, outbox/inbox, DLQ y redrive.
- Proyecciones de catálogo e índices de búsqueda con frescura SLO.
- Clasificación con escalas controlables, descomposición de señales y A/B.
- Reglas de cumplimiento (geo/edad/tema) y auditoría de cambios.
- Multi-tenant/región: aislamiento de datos, fairness, residency.
- API con 'as _ of', facetas, cursores; caché y discapacidad por eventos.
- Métricas p95/p99, ingest/indexación, CTR/conversión; alertas.
- Playbucks de incidentes; lanzamientos canarios y fichflags.
- Pruebas de relevancia, contratos, caos y personalización.
Conclusión
El motor del catálogo es el «motor de búsqueda + sistema de reglas + escaparate» sobre el contenido del juego. Las ACL fuertes, los datos normalizados, las proyecciones para lecturas rápidas, las señales de clasificación transparentes, la personalización con métricas guardrail y el estricto cumplimiento convierten el catálogo en una palanca de crecimiento de productos sostenible y medible, sin sorpresas en la producción y sin compromisos con los reguladores.