tanujtyagi.com

Where RDI Fits in Media and Entertainment (and Where It Doesn't)

Catalogue, rights windows and entitlements are a near-perfect fit. Watch progress, session limits and live feeds are not, and the two look alike on a whiteboard.

Streaming platforms have a data shape that suits change data capture almost perfectly. A modest amount of editorially managed content, read an enormous number of times, by clients that will not forgive a slow catalogue screen.

They also contain several workloads where CDC is precisely the wrong tool, and the two categories look similar enough on a whiteboard that they end up in the same pipeline. The result is a project that works beautifully for the catalogue and then quietly fails on watch progress, which is usually discovered late.

So this is a use-case-by-use-case verdict, tested against the criteria in the [RDI architecture post](/blog/rdi-architecture-and-fit). Briefly, those were: one source database, the application never writes to that source, eventual consistency measured in seconds is acceptable, and changes arrive as frequent small increments rather than large batches.

The shape that works

RDI in a streaming platform Two separate RDI pipelines. The editorial CMS feeds a catalogue dataset in Redis; the billing system feeds an entitlements dataset. Client apps read from both. Playback and progress writes go to a separate application write path, not through RDI, because RDI is one-directional. Redis Enterprise Editorial CMS titles, artwork, windows Billing system plans, entitlements RDI pipeline A CDC → transform rows → JSON docs RDI pipeline B CDC → transform one source per pipeline Catalogue read on every app launch Entitlements read on every play Apps TV · mobile · web App write path progress, events — not RDI writes never travel back through RDI
Two sources means two pipelines — RDI syncs one source database to one target. The dashed path is the one people try to put through RDI and can't.

Content catalogue and metadata

The obvious fit, and the strongest one. Titles, synopses, cast, artwork references, genre taxonomy, episode ordering. All of it authored in a CMS, and read on every home screen render, every search, every "more like this" row.

It clears every criterion without argument. The CMS owns the data and applications never write to it. A synopsis correction arriving three seconds late affects nobody. Changes come in as one title update, one new episode, one corrected credit. And catalogue metadata is measured in gigabytes rather than hundreds of gigabytes, so the initial sync finishes inside a sensible cutover window.

The transformation step earns its keep here too. A title in a relational schema is spread over half a dozen tables, and what you want in Redis is one JSON document per title, so rendering a home screen is a single round trip instead of a join.

Availability windows and regional rights

Which titles are playable, in which territory, between which dates. Read constantly, since every catalogue render filters on it, and written rarely, by rights management.

Same profile as the catalogue, with one operational wrinkle. Rights changes are usually scheduled rather than immediate, so when a window opens at midnight the row changes at midnight and RDI propagates it within seconds. That is fine. What is not fine is expecting RDI to enforce the window. The read path still has to compare dates itself, and I have seen that assumption cause a title to appear in a territory a day early.

Entitlements and plan lookups

Read on every playback start: does this account have this tier, is it in good standing. Written by billing, which is a system you badly do not want sitting in the hot path of a play request.

This fits, with a caveat worth designing for up front, because the upgrade case is the one that bites. A customer pays for a higher tier, immediately tries to watch the 4K stream, and the cache is three seconds behind. Both mitigations are cheap. You can fall through to the source once on a negative entitlement result before denying, which costs nothing at steady state because negative results are rare. Or you can have the billing flow write a short-lived override key straight into Redis on upgrade, which has the advantage of being a write your own application owns rather than a pipeline concern.

Doing both is not excessive.

Search and browse indexes

Feeding the Redis query engine from the same catalogue source, so search and faceted browse run at the same freshness as the catalogue itself, with the transformation mapping editorial fields onto an index schema.

This is where the lack of joins into nested JSON starts to matter. If your search document needs to denormalise a one-to-many relationship across several tables, test that specific case early rather than assuming the pipeline will assemble it for you.

Now the ones that do not fit

These matter more than the list above, because they are the workloads that look like a fit and are not.

Watch progress and resume points

The most common mistake I see. The application writes progress every few seconds during playback and needs it back instantly on another device. That is write-behind, not change data capture, and RDI is one-directional so it does not implement it. Write to Redis directly and drain onward to your database with your own worker or a stream consumer.

Concurrent stream limits and session state

This one inverts the question. Counting active streams per account to enforce a three-device limit is state that is born in Redis, lives in Redis and expires in Redis. There is no source database to capture changes from. If you find yourself asking how to get session state into Redis via RDI, the architecture diagram is pointing the wrong way.

Live scores and event feeds

Live data feels like CDC because it changes constantly, but it usually arrives as a feed rather than as rows in a database, and no writes to a source database means no change log to tail. Write feed events to Redis directly. Inserting a database in the middle purely so that RDI has something to read is architecture for the tool's benefit rather than yours.

Nightly recommendation batches

A documented failure case rather than a judgement call: RDI will fail processing the long, large transactions that batch ETL produces. Load those with a bulk import, or have the batch write to Redis itself.

Multi-region active-active viewing state

Settled before any performance conversation starts, because Active-Active is not a supported RDI Cloud target topology.

Use caseFitDeciding factor
Content catalogue and metadataStrongOne source, read-heavy, editorial writes only
Availability windows and rightsStrongSame profile; read path still enforces dates
Entitlements and plan lookupsGood, with careUpgrade lag needs a fallback read
Search and browse indexesGoodCheck nested-JSON denormalisation first
Watch progress and resumeNoWrite-behind, and RDI is one-directional
Concurrent stream limitsNoRedis is the system of record here
Live scores from a feedNoNo source database, so no change log
Nightly recommendation batchNoLong ETL transactions are a documented failure
Active-active viewing stateNoNot a supported RDI Cloud target topology

What you actually get

The real win is that the invalidation problem disappears. Catalogue caching without CDC means every content service remembering to invalidate on every write path, and the bug is always the one path somebody forgot about eighteen months ago. RDI turns that from application discipline into infrastructure, which is a much better place for it to live.

After that, read load comes off the source database. A streaming home screen can be dozens of reads, and moving them off the CMS database removes read replicas you were paying for and scaling. Launch spikes land on Redis rather than on a relational database that was never sized for a premiere.

You also get to choose the target shape, so one JSON document per title instead of a six-table join, without writing and maintaining sync code. And freshness becomes a bounded number you can write in a design document and defend, rather than a TTL somebody picked years ago to stop complaints.

What it costs you

It is another moving part: two VMs or a Kubernetes deployment, plus an RDI database consuming memory on a cluster you sized for your application. Small, but it needs monitoring like anything else.

Source configuration is a dependency you do not control. CDC needs log retention, replication slots and privileges on the CMS database, and if the DBA will not grant them then the design is finished. Settle that question before you plan around it, not after.

Schema changes at the source become a coupling you now own. A migration that renames a column is a change nobody told the pipeline about, so somebody on the database side has to know a pipeline is watching. That is an organisational fix as much as a technical one.

Drift is silent. At-least-once delivery with idempotent writes should converge, but "should" is not monitoring. Decide early how you would detect divergence, whether that is a periodic count comparison or checksums over a sample, because nobody builds it before the first incident and everybody wishes they had.

Initial sync sizing surprises people. The published envelope is a sub-hour full sync at up to 200 GB, and catalogue metadata sits comfortably inside that. Measure it against production volume anyway rather than against the 5 GB you tested on.

And it does not solve the write path at all. Half of the interesting state on a streaming platform is written by the client, and RDI covers the read side only.

Scoping a proof of concept

Two weeks, and measure three things.

Freshness under editorial load: change a title in the CMS and measure time to visible in the app, while a bulk metadata update is running rather than on a quiet system. Initial sync against the real catalogue rather than a sample, because that number sets your cutover window. And the entitlements upgrade path: buy a tier, immediately try to play, and find out whether you need the fallback read before you ship rather than after.

If those three come out clean, the rest is configuration.

Sorting them quickly

For media and entertainment, RDI suits editorially managed, read-dominated reference data. Catalogue, rights windows, entitlements, search indexes. Within that shape it removes an entire class of cache-invalidation bugs, which is worth a lot more than the latency numbers people usually lead with.

Outside it, the failures are not subtle. The question that sorts most cases in about ten seconds is simply who writes this data, and is it a database. If the answer is the client application, stop. If it is a feed, stop. If it is editorial, into the CMS, keep going.