Real-time AI architecture is the serving and integration path around a model, and it decides whether the feature works at enterprise scale. What holds up: a defined latency budget per feature, an autoscaling serving layer, features served from a store rather than recomputed per request, and event-driven integration wherever the user is not waiting.
Here is the pattern that stalls most “real-time AI” projects. A team picks a model, proves it works in a notebook, gets the accuracy everyone wanted, and then tries to put it in front of users in real time. That is where it stops. The model was never the hard part. The serving and integration layer around it was, and it was designed last, if at all.
If you lead an engineering or AI platform team, you have probably lived some version of this. So this piece takes a position rather than a definition: real-time AI succeeds or fails on the serving and integration path, so you design that first and choose the model to fit it, not the other way around.
Real-time AI usually stalls for reasons that have nothing to do with the model:
- The model is chosen before anyone defines the latency budget it has to hit.
- Inference still runs where the notebook ran, with no real serving tier underneath it.
- Features are recomputed on every request instead of served from a store, so the data path is the slow part.
- Everything is wired synchronously, so one slow dependency blocks the user.
- There is no autoscaling, so p99 latency collapses the first time real traffic arrives.
- There is no latency SLO, so “slow” gets discovered by customers instead of dashboards.
Every one of those is an architecture decision, not a modelling one.
What “real-time” actually means at enterprise scale
“Real-time” is a latency budget, not a vibe. Before anything else, decide the number each feature has to hit, because the number dictates the architecture. These tiers are a useful starting frame.
| Tier | Latency budget | Typical features | What it demands |
|---|---|---|---|
| Interactive | Under 100 ms | Typeahead, live fraud scoring at checkout | In-memory features, co-located serving, no cold starts |
| Conversational | 100 ms to 1 s | Chat, agents, live recommendations | Warm serving, streaming responses, caching |
| Near-real-time | 1 to 10 s | Dashboards, alerts, async enrichment | Event-driven, queue-backed, batch-friendly |
| Batch | Minutes or more | Reports, retraining, bulk scoring | Scheduled pipelines, cheapest to run |
The mistake is treating “real-time” as one thing. Most products need a mix, and knowing which tier each feature lives in is what stops you from over-engineering the whole system to sub-100ms when only one path needs it.
The latency budget, allocated line by line
Picking a tier is the easy half. The useful work is spending that budget across every hop the request actually makes, because a budget nobody has allocated is a number nobody is accountable to.
Take the interactive tier and allocate 100 ms end to end. For a warm, well-built path, a realistic breakdown looks like this.
| Hop | Budget | What it covers | Where it goes wrong |
|---|---|---|---|
| Network in and out | 15 to 20 ms | Client to edge to service, TLS, return trip | Cross-region calls, no edge termination |
| Routing and auth | About 5 ms | Gateway, authentication, middleware | Token validation calling a remote service per request |
| Feature fetch | 10 to 15 ms | Online feature store reads | Recomputing per request, or an N+1 read pattern |
| Model inference | 30 to 40 ms | Forward pass, including any batching wait | Cold starts, GPU queueing under burst |
| Post-processing | About 5 ms | Business rules, serialisation, response shaping | Heavy rule evaluation on every request |
| p99 headroom | 15 to 20 ms | Deliberate slack reserved for the tail | Allocating the whole budget at p50 |
Two things tend to surprise teams the first time they draw this up.
The first is that inference is often only about a third of the budget. A team that spends three weeks shaving 12 ms off the forward pass has recovered a tenth of the end-to-end number, while the feature fetch and the two network legs, which cost more between them, were never measured at all.
The second is the headroom line. Allocate the full 100 ms at the median and you have designed for p50, so you will miss p99 constantly, and p99 is where real traffic lives. Reserve 15 to 20 percent for the tail before you allocate anything else.
The discipline is straightforward. Write the allocation down per feature, instrument each hop separately, and the conversation stops being “it feels slow” and becomes “the feature fetch is 40 ms over budget.” Only one of those is actionable.
The serving layer is the bottleneck, not the model
Two teams can take the identical model and get completely different real-time results. The difference is the serving layer: the infrastructure that hosts the model as a running service and answers inference requests under load.
A real serving layer is a dedicated inference tier: model servers or managed endpoints (KServe, Triton, or a cloud model endpoint), autoscaling cloud infrastructure that includes GPU where the workload needs it, request batching to lift throughput, caching for repeated inputs, and warm capacity so the first request after a quiet period does not pay a cold-start penalty. Inference latency, throughput, and per-request cost are all decided here. Training decides whether the model is good. Serving decides whether anyone can use it in time. Standing up that tier as a reliable, monitored service is MLOps and serving infrastructure work in its own right.
This is why “the model works” and “the feature works in production” are different claims. The gap between them is the serving layer, and it is the single highest-leverage thing to design early.
Feature freshness and the staleness trade-off
Latency and freshness get conflated constantly, and the confusion is expensive. They are separate axes. Latency is how fast you can answer. Freshness is how recently the data behind that answer was true. A feature can be served in 8 ms and still be six hours stale, and for a great many decisions that is completely fine.
Freshness has tiers of its own, and they do not map onto the latency tiers.
- Request-time computed. The feature is calculated inside the request. Always current, always the most expensive line in your latency budget, and the first thing to move out when the budget is tight.
- Streaming. A pipeline updates the online store continuously, so features are seconds old. The right default for anything behavioural: session activity, live risk signals, in-session intent.
- Micro-batch. The store refreshes every few minutes. Cheaper, and good enough for most aggregates.
- Batch. Refreshed hourly or nightly. Correct for anything slow-moving, such as tenure, lifetime value, or segment membership.
Most production features mix tiers inside a single request. A fraud score at checkout might read a session signal that is two seconds old, an account aggregate that is ten minutes old, and a customer segment computed last night, and be entirely correct in doing so.
The trap underneath all of this is training-serving skew. If the model trained on features computed one way in a batch job, and production serves those same features computed another way, the model is scoring inputs it never saw during training. Accuracy degrades for reasons that no amount of retraining will fix, because the problem is not the model. Serving training and inference features from one shared set of definitions is what a feature store is actually for. The latency benefit is secondary.
So the rule is not “make everything fresh.” It is to match each feature’s refresh rate to how fast the underlying thing actually changes, and to pay for streaming only where staleness would change the decision.
Event-driven vs request-response: keeping AI features responsive
The second architecture decision is how inference connects to the product. There are two patterns, and the right answer is usually both, chosen deliberately.
- Request-response is correct when the user is waiting on the answer and the budget is tight: a score at checkout, a suggestion as they type. The call is synchronous, so every millisecond and every dependency in that path counts.
- Event-driven is correct when the work can happen just after the trigger rather than in the user’s blocking path: enrichment, downstream scoring, notifications, multi-step agent workflows. The trigger publishes an event, consumers process it, and the interface stays responsive because it is not waiting.
The failure mode is defaulting to synchronous request-response for everything. It feels simpler, but it puts slow or bursty AI work directly in the user’s path, so one dependency hiccup becomes a frozen screen. Moving the work that does not need to block into an event-driven flow is often the cheapest way to make an AI feature feel fast.
Where real-time earns its cost, and where it does not
Real-time is a cost multiplier. Warm GPU capacity, low-latency feature serving, and the operational overhead of tight SLOs are all real spend. So the honest question is not “can we make this real-time” but “does this feature’s latency budget justify it.”
Fraud scoring at checkout earns it: a two-second delay is lost revenue or lost trust. A recommendation that refreshes on the next page load does not, and forcing it into a sub-100ms path buys nothing. A large amount of enterprise AI value is comfortably near-real-time or batch, and building it that way is cheaper, simpler, and more resilient. The discipline is to spend the real-time budget only where the feature genuinely has one, and to be willing to say near-real-time is the right call for the rest.
What breaks first at scale, and in what order
Real-time AI systems do not degrade randomly under load. They fail in a fairly reliable sequence, which is useful, because it means you can instrument ahead of each stage instead of meeting them one at a time during an incident.
- Cold starts, first and at low traffic. Before you have a scale problem you have an idle problem. Traffic arrives in bursts, capacity has scaled to zero between them, and the first request of each burst pays the full model load penalty. It shows up as a terrible p99 next to an unremarkable p50, and it is why “it is fast when I test it” and “customers say it is slow” are both true at once.
- Feature store tail latency. The online store holds its mean well and loses its tail first. A p99 read that drifts from 12 ms to 60 ms eats the entire headroom you reserved, and because the average still looks fine, any dashboard built on averages shows nothing at all.
- Connection and concurrency limits. Pools get sized for expected load rather than burst. When they saturate, requests queue before they ever reach the model, so inference metrics stay healthy while end-to-end latency climbs. This one misleads teams for longer than any other failure on the list.
- GPU batch queueing. Batching lifts throughput right up until queue wait exceeds the latency it saves. Past that inflection the throughput graph keeps looking good while p99 collapses, because the two metrics are moving in opposite directions.
- Downstream fan-out. One synchronous call to a service that itself calls three more, any of which can be slow. The blast radius is wider than the architecture diagram suggests, and this is precisely where event-driven integration earns its keep.
- Cost, which usually breaks before the system does. Warm GPU capacity to kill cold starts, plus streaming features, plus reserved headroom for the tail. The invoice tends to arrive before any of the failures above do. Plenty of real-time features get switched off for budget reasons while running perfectly well.
The first three are infrastructure problems, and none of them are visible in model metrics. A dashboard showing accuracy and throughput will report a healthy system straight through every one of them.
The position: design the data and serving path before the model
Put the argument together and it points one way. The model is the most visible part of an AI feature and the least likely to be why it fails in production. So the sequence that works is:
- Define the latency budget per feature (the number the architecture is designed against).
- Design the serving layer and the feature/data path to hit it, with autoscaling and observability built in.
- Choose the integration pattern (request-response or event-driven) per feature.
- Then choose and fit the model to that envelope.
Teams that lead with the model and retrofit the architecture spend the back half of the project fighting latency. Teams that design the serving and data path first give the model a place to actually run in real time. That is the whole difference, and it is an engineering decision made early, not a rescue effort made late.
A real-time readiness diagnostic you can run in one afternoon
Before you commit to a real-time feature, score the architecture that would carry it. Rate each signal honestly. The weakest ones, usually the serving layer and the latency budget, are where the risk sits and where to start.
Readiness check
Is your architecture real-time-ready?
Rate the closest option in each row. No email, nothing saved — this runs entirely in your browser.
Choose one option in each row to see your readiness.
Your architecture is:
Your biggest gaps: .
Scored “Not real-time-ready” or “Near-real-time”? The serving path is usually the fix, not the model.
See our MLOps & AI infrastructure
Also read
- From pilot to production: the MLOps lifecycle behind scaling AI
- Cloud architecture decisions that control AI costs
- How to build scalable SaaS platforms and integrations
This article is about the real-time serving layer specifically. For the full path from a working pilot to a governed production system (CI/CD for models, versioning, drift monitoring), that is a related but separate discipline covered in the pilot-to-production guide, and part of our broader AI solutions practice.
The bottom line
Real-time AI is not a model problem. It is a serving and integration problem wearing a model’s clothes. Define the latency budget, build the serving layer and data path to meet it, choose request-response or event-driven per feature, and only then fit the model. Do that and real-time stops being the thing that strands your best AI ideas in a notebook.
Pressure-test your real-time AI architecture
Bring us the feature that has to respond in real time. We will map the serving and data path, find the bottleneck, and show what it takes to hit your latency budget.