- Rygraden i moderne OTT
Hvis du er i gang med at opbygge en streamingplatform, er din Mellemlag er den ukendte helt. Det er det afgørende koordineringslag, der ligger mellem dit virvar af indholdskilder (XMLTV-feeds, VOD (CMS, Live Encoders) og den fejlfri oplevelse, som dine brugere forventer på deres Apple TV eller i deres Android-app.
I denne vejledning gennemgår vi den nøjagtige arkitektur, der kræves for at udvikle en højtydende videomiddleware. Vi vil gennemgå Samlet indlæsning, Design af API’er med høj tilgængelighed, samt de caching-strategier, der er nødvendige for at kunne levere millioner af EPG forespørgsler uden at få din database til at gå ned.
Vigtigste arkitektoniske mål:
Aggregering: Indlæs data problemfrit fra forskellige kilder (Gracenote, XMLTV, JSON-feeds).
Normalisering: Rens og standardiser metadataene i et enkelt, søgbart internt skema.
Præstationer: Opnå API-svartider på under 50 ms ved hjælp af aggressiv caching (Redis).
Sikkerhed: Grundige rettighedskontrol, generering af DRM-tokens og geoblokering.
2. Systemarkitektur på højt niveau
En monolitisk applikation er ikke tilstrækkelig til moderne streaming. Vi anbefaler en Mikrotjenester eller Modulær monolit tilgangen bag en robust API-gateway. Dette sikrer, at en fejl i din EPG-indlæsningsworker ikke får din logintjeneste til at gå ned.
Arkitekturdiagrammet
graf TD
undergraf "Eksterne kilder"
EPG[EPG-udbyder (Gracenote/XMLTV)]
CMS[VOD-CMS (aktiver/metadata)]
LIVE[Live-stream-kodere]
slut
undergraf "Middleware-kerne"
GW[API-gateway / belastningsfordeler]
undergraf "Indlæsningslag"
ING_EPG[EPG-indlæsningsmodul]
ING_VOD[VOD-metadatasyner]
slut
undergraf "Servicelag"
SVC_EPG[EPG-tjeneste]
SVC_VOD[VOD-katalogtjeneste]
SVC_USR[Bruger & rettigheder]
SVC_DRM[DRM-signatur]
slut
undergraf "Data Persistence"
DB[(Primær database - PostgreSQL)]
CACHE[(Cache - Redis)]
SEARCH[(Søgemaskine - Elasticsearch)]
slut
slut
undergraf "Klienter"
WEB[Webapp]
TV[Smart-tv / STB]
MOB[Mobilapp]
slut
EPG --> ING_EPG
CMS --> ING_VOD
ING_EPG --> DB
ING_VOD --> DB
ING_VOD --> SEARCH
WEB --> GW
TV --> GW
MOB --> GW
GW --> SVC_EPG
GW --> SVC_VOD
GW --> SVC_USR
SVC_EPG --> CACHE
SVC_EPG --> DB
SVC_VOD --> DB
SVC_VOD --> SEARCH
SVC_USR --> DB
SVC_USR --> SVC_DRM
3. Sådan får du styr på EPG (den elektroniske programoversigt)
EPG’en er den tungeste komponent i enhver IPTV/OTT system. De lineære tidsplaner ændres ofte, og klient-enhederne anmoder konstant om disse data. Hvis du for hver bruger, der åbner guiden, foretager en forespørgsel i din SQL-database, vil din platform vil falder i seertallene i prime time.
3.1 Indtagelsesstrategien
Du kan ikke stole på, at data hentes i realtid fra udbyderne. Du skal indlæse og gemme dataene lokalt.
Håndtering af formater: Udvikl parsere til standard-XMLTV-skemaer og udbyderspecifikke JSON-skemaer.
Opdateringshyppighed: Kør fuldstændige indlæsninger hver 6.–12. time. Kør “Delta”-opdateringer hvert 15. minut for at fange ændringer i programmet i sidste øjeblik (f.eks. forlængelser i sport).
Normalisering: Knyt eksterne genre-ID’er (f.eks. “ProviderA-Comedy”) til dine interne genre-ID’er (f.eks. “Internal-101”) for at sikre ensartethed i brugergrænsefladen.
3.2 Optimeret databaseskema
Vi bruger PostgreSQL for at sikre relationsintegriteten, men leverer data til klienter via Redis.
Tabel: kanaler | Kolonne | Type | Beskrivelse | | :— | :— | :— | | id | UUID | Unikt kanal-ID | | display_name | VARCHAR | Kanalnavn (f.eks. “HBO”) | | stream_url | VARCHAR | URL'en til HLS/DASH-manifestet | | logisk_position | INT | Kanalnummer (f.eks. 101) |
Tabel: programmer | Kolonne | Type | Beskrivelse | | :— | :— | :— | | id | UUID | Unikt program-ID | | channel_id | UUID | Fremadgående nøgle til kanaler | | starttidspunkt | TIDSMÆRKE | Starttidspunkt i UTC (indekseret) | | end_time | TIDSMÆRKE | Sluttidspunkt i UTC (indekseret) | | titel | VARCHAR | Programtitel | | billeder | JSONB | URL'er til plakater/miniaturer |
3.3 Caching-teknikken “Windowing”
Kunderne har aldrig brug for hele 7-dages programoversigten på én gang. De ser typisk på programoversigten i blokke (f.eks. “Hvad går der lige nu?”).
Redis-strategien:
Nøglestruktur:
epg:{kanal-id}:{datointerval}Værdi: Et komprimeret JSON-array med programmer for netop dette tidsrum.
Forløbet: Middleware tjekker først Redis. Hvis dataene mangler (Cache Miss), udfører den en ressourcekrævende SQL-forespørgsel, udfylder Redis (Cache Set) og returnerer dataene. Dette reducerer belastningen på databasen med 95%.
4. Opbygning af et skalerbart VOD-modul
Video on Demand (VOD) kræver en anden tilgang end Live TV. Den lægger vægt på omfattende metadata, avancerede søgefunktioner og streng adgangskontrol.
4.1 Metadata-hierarki
Undgå at udflade dine data. Oprethold et strengt hierarki for at understøtte “Watching”-brugergrænsefladefunktionerne:
Serie: Den øverste container (f.eks. “Breaking Bad”).
Sæson: Del af en serie.
Afsnit: Den afspilbare enhed. Indeholder tekniske metadata (videokodek, lydspor, varighed).
4.2 Søgning og opdagelse
SQL LIKE Søgninger er for langsomme til VOD. Replikér skrivebeskyttede metadata til en dedikeret søgemaskine (Elasticsearch eller MeiliSearch). Dette gør det muligt at:
Fuzzy-søgning (håndtering af stavefejl).
Vægtede resultater (med fokus på “Nye udgivelser”).
Filtrering efter kriterier (År, Genre, Skuespiller).
4.3 Generering af sikre datastrømme (DRM)
Aldrig Gem statiske stream-URL’er i din database eller i frontend-koden.
Kundeanmodninger
POST /vod/play/{asset_id}.Middleware validerer brugerens abonnement (rettigheder).
Middleware kontakter DRM-udbyderen (Widevine/PlayReady) for at generere et kortvarigt licenstoken.
Middleware returnerer en signeret URL:
https://cdn.service.com/movie.mpd?token=xyz...
5. API-designmønstre
Din API er selve produktet. Design den, så den er RESTful, versionsstyret og forudsigelig.
5.1 Højtydende EPG-endepunkter
Hent kanalliste
GET /api/v1/channels
Hent programoversigten (programskemaet) Inddata: start (ISO-dato), slut (ISO-dato)
GET /api/v1/epg?start=2023-10-27T10:00:00Z&end=2023-10-27T14:00:00Z
Optimeret responsstruktur:
{
"kanaler": [
{
"id": "ch_101",
"name": "Movies 24",
"programs": [
{
"id": "prog_999",
"title": "Inception",
"start": 1698400800,
"end": 1698408000,
"is_catchup_available": true
}
]
}
]
}
5.2 VOD- og afspilningsendepunkter
Se oplysninger om VOD
GET /api/v1/vod/assets/{asset_id}?expand=related,cast
Hent afspilningskontekst (sikker)
POST /api/v1/vod/play
Indhold: { "asset_id": "12345", "device_id": "tv_living_room" }
6. Din køreplan frem mod produktion
Hvis du er klar til at gå i gang, skal du følge denne trinvise gennemførelsesplan for at sikre stabilitet.
Fase 1: Grundlæggende fundament
[ ] Implementer PostgreSQL- og Redis-klynger.
[ ] Kør de indledende databasemigreringer (kanaler, programmer, VOD-indhold).
[ ] Opret godkendelsestjenesten (JWT-baseret).
Fase 2: Indlæsning og dataflow
[ ] Udvikle XMLTV-parseren (Python eller Node.js).
[ ] Implementer “diffing”-logik, så kun ændrede programmer opdateres (sparer på antallet af skrivninger til databasen).
[ ] Konfigurer VOD CMS-webhooks til at udløse opdateringer af metadata i realtid.
Fase 3: Klient-API og sikkerhed
[ ] konkret: Implementer EPG Grid API med den ovenfor nævnte Redis-caching-strategi.
[ ] Implementer søge-API’en ved hjælp af Elasticsearch.
[ ] Integrer logikken til signering med DRM-token for at sikre afspilning.
Fase 4: Operationel excellence
[ ] Konfigurer centraliseret logning (ELK Stack eller CloudWatch).
[ ] Konfigurer CDN-cachingregler (CloudFront/Akamai) for at aflaste statiske ressourcer.