- Ryggraden i modern OTT
Om du håller på att bygga en streamingplattform, så är din Mellanprogramvara är den osungna hjälten. Det är det avgörande samordningslagret som ligger mellan ditt kaos av innehållskällor (XMLTV-flöden, VOD (CMS, Live Encoders) och den förstklassiga upplevelse som dina användare förväntar sig på sin Apple TV eller i sin Android-app.
I den här guiden går vi igenom exakt vilken arkitektur som krävs för att bygga en högpresterande videomellanprogramvara. Vi kommer att ta upp Enhetlig datainhämtning, API-design för hög tillgänglighet, samt de cachelagringsstrategier som krävs för att kunna leverera miljontals EPG förfrågningar utan att databasen kraschar.
Viktiga arkitektoniska mål:
Sammanställning: Importera data smidigt från olika källor (Gracenote, XMLTV, JSON-flöden).
Normalisering: Rensa och standardisera metadata till ett enda internt schema som går att söka i.
Prestanda: Uppnå API-svarstider under 50 ms med hjälp av aggressiv cachelagring (Redis).
Säkerhet: Grundliga behörighetskontroller, generering av DRM-token och geoblockering.
2. Systemarkitektur på hög nivå
En monolitisk applikation räcker inte till för modern streaming. Vi rekommenderar en Mikrotjänster eller Modulär monolit strategin bakom en robust API-gateway. Detta säkerställer att ett fel i din EPG-inläsningsprocess inte leder till att din inloggningstjänst slås ut.
Arkitekturdiagrammet
graf TD
delgraf "Externa källor"
EPG[EPG-leverantör (Gracenote/XMLTV)]
CMS[VOD-CMS (resurser/metadata)]
LIVE[Kodare för direktsändningar]
slut
undergraf "Middleware-kärna"
GW[API-gateway / lastbalanserare]
undergraf "Inmatningslager"
ING_EPG[EPG-inmatningsmodul]
ING_VOD[VOD-metadatasynkroniserare]
slut
delgraf "Tjänstelager"
SVC_EPG[EPG-tjänst]
SVC_VOD[VOD-katalogtjänst]
SVC_USR[Användare och behörigheter]
SVC_DRM[DRM-signaturgenerator]
slut
delgraf "Datapersistens"
DB[(Primär databas – PostgreSQL)]
CACHE[(Cache – Redis)]
SEARCH[(Sökmotor – Elasticsearch)]
slut
slut
undergraf "Klienter"
WEB[Webbapp]
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. Att lära sig hantera EPG (den elektroniska programguiden)
EPG är den tyngsta komponenten i alla IPTV/OTT system. De linjära schemana ändras ofta, och klientenheterna begär dessa uppgifter kontinuerligt. Om du gör en sökning i din SQL-databas för varje användare som öppnar guiden, kommer din plattform kommer att minska under bästa sändningstid.
3.1 Intagsstrategin
Du kan inte förlita dig på att data hämtas i realtid från leverantörerna. Du måste hämta in och lagra data lokalt.
Formathantering: Skapa parsers för standardiserade XMLTV-scheman och leverantörsspecifika JSON-scheman.
Uppdateringsfrekvens: Utför fullständiga inläsningar var 6–12 timmar. Utför “Delta”-uppdateringar var 15:e minut för att fånga upp sista-minuten-ändringar i schemat (t.ex. förlängning i sport).
Normalisering: Koppla externa genre-ID:n (t.ex. “ProviderA-Comedy”) till dina interna genre-ID:n (t.ex. “Internal-101”) för att säkerställa enhetlighet i användargränssnittet.
3.2 Optimerat databasschema
Vi använder PostgreSQL för att säkerställa relationsintegriteten, men levererar data till klienterna via Redis.
Tabell: kanaler | Kolumn | Typ | Beskrivning | | :— | :— | :— | | id | UUID | Unikt kanal-ID | | display_name | VARCHAR | Kanalnamn (t.ex. “HBO”) | | stream_url | VARCHAR | URL:en till HLS/DASH-manifestet | | logisk_position | INT | Kanalnummer (t.ex. 101) |
Tabell: program | Kolumn | Typ | Beskrivning | | :— | :— | :— | | id | UUID | Unikt program-ID | | channel_id | UUID | FK till kanaler | | starttid | TIDSMÄRKE | Starttid i UTC (indexerad) | | sluttid | TIDSMÄRKE | Sluttid i UTC (indexerad) | | rubrik | VARCHAR | Programtitel | | bilder | JSONB | URL:er till affischer/miniatyrbilder |
3.3 Cachingtekniken “Windowing”
Kunderna behöver aldrig hela 7-dagarsprogrammet på en gång. De brukar titta på programguiden i omgångar (t.ex. “Vad går det just nu?”).
Redis-strategin:
Nyckelstruktur:
epg:{kanal-id}:{datumintervall}Värde: En komprimerad JSON-matris med program för just det tidsintervallet.
Flödet: Middleware kontrollerar först Redis. Om data saknas (cache-miss) utför den en resurskrävande SQL-fråga, fyller på Redis (cache-set) och returnerar sedan data. Detta minskar databasbelastningen med 95%.
4. Utveckling av en skalbar VOD-modul
Video på begäran (VOD) kräver ett annat tillvägagångssätt än direktsänd TV. Det fokuserar på omfattande metadata, avancerade sökfunktioner och strikt åtkomstkontroll.
4.1 Metadata-hierarkin
Förenkla inte dina data. Håll fast vid en strikt hierarki för att stödja “Watching”-funktionerna i användargränssnittet:
SERIER: Den översta behållaren (t.ex. “Breaking Bad”).
Säsong: Del i en serier.
Avsnitt: Den enhet som kan spelas upp. Innehåller tekniska metadata (videokodek, ljudspår, speltid).
4.2 Sökning och upptäckt
SQL GILLA Sökningarna går för långsamt för VOD. Replikera skrivskyddad metadata till en särskild sökmotor (Elasticsearch eller MeiliSearch). Detta möjliggör:
Fuzzy-matchning (hantering av stavfel).
Viktade resultat (med extra tyngd på “Nya utgåvor”).
Filtrering efter olika kriterier (År, Genre, Skådespelare).
4.3 Generering av säkra strömmar (DRM)
Aldrig lagra statiska ström-URL:er i din databas eller i frontend-koden.
Kundförfrågningar
POST /vod/play/{asset_id}.Middleware kontrollerar att användarens prenumeration (behörigheter) är giltig.
Middleware anropar DRM-leverantören (Widevine/PlayReady) för att generera en tillfällig licenstoken.
Middleware returnerar en signerad URL:
https://cdn.service.com/movie.mpd?token=xyz...
5. Designmönster för API:er
Ert API är produkten. Utforma det så att det är RESTful, versionshanterat och förutsägbart.
5.1 Högpresterande EPG-slutpunkter
Hämta kanallista
GET /api/v1/channels
Hämta programguiden (programtablå) Indata: start (ISO-datum), slut (ISO-datum)
GET /api/v1/epg?start=2023-10-27T10:00:00Z&end=2023-10-27T14:00:00Z
Optimerad svarsstruktur:
{
"kanaler": [
{
"id": "ch_101",
"name": "Movies 24",
"programs": [
{
"id": "prog_999",
"title": "Inception",
"start": 1698400800,
"end": 1698408000,
"is_catchup_available": true
}
]
}
]
}
5.2 VOD- och uppspelningsändpunkter
Visa information om VOD
GET /api/v1/vod/assets/{asset_id}?expand=related,cast
Hämta uppspelningskontext (säker)
POST /api/v1/vod/play
Innehåll: { "asset_id": "12345", "device_id": "tv_living_room" }
6. Din vägkarta till produktion
Om du är redo att sätta igång, följ denna stegvisa genomförandeplan för att säkerställa stabiliteten.
Fas 1: Grundläggande kunskaper
[ ] Driftsätta PostgreSQL- och Redis-kluster.
[ ] Kör de inledande databasmigreringarna (kanaler, program, VOD-resurser).
[ ] Skapa autentiseringstjänsten (JWT-baserad).
Fas 2: Inläsning och dataflöde
[ ] Utveckla XMLTV-parsern (Python eller Node.js).
[ ] Implementera “diffing”-logik för att endast uppdatera de program som har ändrats (sparar databasskrivningar).
[ ] Konfigurera VOD CMS-webhooks för att utlösa uppdateringar av metadata i realtid.
Fas 3: Klient-API och säkerhet
[ ] specifikt Implementera EPG Grid API med den ovan nämnda Redis-cachestrategin.
[ ] Implementera sök-API:et med hjälp av Elasticsearch.
[ ] Integrera logiken för signering med DRM-token för säker uppspelning.
Fas 4: Operativ excellens
[ ] Konfigurera centraliserad loggning (ELK Stack eller CloudWatch).
[ ] Konfigurera cachelagringsreglerna för CDN (CloudFront/Akamai) för att avlasta statiska resurser.