ModernTechLap
AI VisibilityResearchPublishingPaid PRPricing
Check AI Visibility
ModernTechLap

AI visibility research and an independent tech publication. We measure how AI assistants answer your buyers' questions, then publish the expertise that changes the answer.

Product

  • AI Visibility
  • Methodology
  • Sample Report
  • Pricing

Publishing

  • Expert Publishing
  • Paid PR
  • Press Releases
  • Editorial Standards
  • Publication Guidelines

Resources

  • Research
  • Insights
  • Topics
  • About
  • Contact
  • Careers

Legal

  • Privacy Policy
  • Terms of Service
  • Cookie Policy

© 2026 ModernTechLap. All rights reserved.

Back to Blog
Why Video-Heavy Applications Eventually Separate Storage, Processing, and Delivery
Cloud & DevOps

Why Video-Heavy Applications Eventually Separate Storage, Processing, and Delivery

TG
TAURAI GATSI
August 13, 2026 8 min read 0 views
Table of Contents
Contents
Video Creates Several Different WorkloadsThe Single-Server ArchitectureFirst Separation: Move Processing to Background WorkersWorker Concurrency Needs LimitsSecond Separation: Move Media Out of the Application FilesystemThird Separation: Don't Make the Application Server Deliver Every ByteHLS Changes the Request PatternTreat Original and Derived Media DifferentlyVersion Encoded OutputDesign Cleanup as Part of the PipelineBuild for Retryable FailuresMonitor User-Facing MetricsBuild or Use Dedicated Infrastructure?A Practical ArchitectureFinal Thoughts

Get a summary of this article with your favorite AI:

Quick answer

A video application can start surprisingly simple. A user uploads an MP4 file, the application saves it to disk, and an HTML5 player loads that file when somebody presses Play. For an early-stage product, there is nothing inherently wrong with this architecture. The difficulty appears when video usage grows.

A video application can start surprisingly simple.

A user uploads an MP4 file, the application saves it to disk, and an HTML5 player loads that file when somebody presses Play.

For an early-stage product, there is nothing inherently wrong with this architecture.

The difficulty appears when video usage grows.

Large uploads begin competing with application traffic. Transcoding consumes CPU. Media libraries consume terabytes of storage. Thousands of playback sessions generate substantial network traffic. A server that was originally responsible for PHP, Node.js, Laravel, or another application framework gradually becomes responsible for an entirely different workload.

At that point, the important infrastructure question is no longer:

How powerful should our web server be?

A more useful question is:

Which workloads should still be running on the web server at all?

Video Creates Several Different Workloads

It is tempting to treat "video hosting" as one infrastructure problem.

In practice, it contains several.

A typical video lifecycle may look like this:

Upload
  ↓
Store Original
  ↓
Inspect Media
  ↓
Transcode
  ↓
Generate Streaming Output
  ↓
Store Encoded Files
  ↓
Deliver to Viewer

Each stage behaves differently.

Uploads are network-heavy.

Transcoding is CPU-heavy.

Storage is capacity-heavy.

Playback is bandwidth-heavy.

The application itself still needs CPU, memory and database capacity for normal user requests.

Combining all of these workloads on one machine creates resource contention.

The Single-Server Architecture

A small application may begin with:

Web Server
├── Application
├── Database
├── Uploaded Videos
├── FFmpeg
└── Video Delivery
TG
TAURAI GATSI

TAURAI GATSI is a contributor at ModernTechLap.

Last updated: August 13, 2026

Comments

Loading comments…

Related Articles

Nobody "Googles" You Anymore. They Ask ChatGPT. Is Your Business in the Answer?

Nobody "Googles" You Anymore. They Ask ChatGPT. Is Your Business in the Answer?

1 min read

IoT Cybersecurity: Why Connected Devices Must Be Secure by Design

IoT Cybersecurity: Why Connected Devices Must Be Secure by Design

1 min read

Why Remote Access Architecture Should Be Designed for Failured post

Why Remote Access Architecture Should Be Designed for Failured post

1 min read

This has several advantages.

It is easy to understand, inexpensive to deploy and straightforward to debug.

The problem is not that this architecture is technically incorrect.

The problem is that its components cannot scale independently.

Suppose several users upload large videos simultaneously while FFmpeg is already processing previous uploads.

CPU utilization increases.

At the same time, existing viewers continue requesting video data.

Now encoding, application requests and playback are competing for the same resources.

Adding a larger server may postpone the problem, but it does not change the underlying architecture.

First Separation: Move Processing to Background Workers

Video conversion should generally not happen inside the HTTP request responsible for accepting the upload.

Instead of:

Upload Request
     ↓
Run FFmpeg
     ↓
Wait
     ↓
Return Response

the application can use:

Upload
  ↓
Store Source
  ↓
Create Queue Job
  ↓
Return Response

Then:

Queue
  ↓
Worker
  ↓
FFmpeg
  ↓
Output

This changes the operational model considerably.

The application server no longer has to keep a web request open throughout a potentially long encoding operation.

Workers can also be scaled separately.

If the encoding queue becomes too long, additional worker capacity can be introduced without changing the web tier.

Worker Concurrency Needs Limits

There is another common mistake: assuming that more simultaneous FFmpeg processes always mean faster processing.

Imagine an eight-core machine running eight encoding jobs.

Each FFmpeg process may itself use multiple threads.

The result can become:

Too Many Jobs
     ↓
CPU Saturation
     ↓
Each Job Slows Down
     ↓
Processing Takes Longer

The correct concurrency level depends on codecs, source resolution, hardware and encoding settings.

Benchmarking is more useful than simply matching worker count to CPU-core count.

Queue wait time and actual encoding time should also be measured separately.

A video that takes five minutes to encode but waits forty minutes in a queue has a 45-minute user-facing processing time.

Second Separation: Move Media Out of the Application Filesystem

Storage becomes another independent scaling problem.

Consider 20,000 videos averaging 500 MB each.

The source files alone represent approximately 10 TB of storage.

That does not include:

  • transcoded versions

  • thumbnails

  • HLS playlists

  • HLS segments

  • temporary processing files

  • backups

Keeping this entire library on the application server makes infrastructure changes increasingly difficult.

Object storage provides a cleaner separation:

Application
├── API
├── Authentication
└── Metadata

Object Storage
├── Originals
├── Encoded Videos
├── HLS
└── Thumbnails

The database stores references to media rather than relying on a local filesystem path.

For example:

{
  "video_id": 8412,
  "status": "ready",
  "source": "videos/8412/source.mp4",
  "playlist": "videos/8412/hls/master.m3u8"
}

Now application compute and media capacity can grow independently.

Third Separation: Don't Make the Application Server Deliver Every Byte

Storage and delivery are related, but they are not the same responsibility.

Consider an application server proxying every video request:

Storage
   ↓
Application Server
   ↓
Viewer

The server becomes an unnecessary bandwidth bottleneck.

A more scalable path can be:

Application
   ↓
Authorization

Object Storage
   ↓
CDN
   ↓
Viewer

The application decides whether a user is allowed to watch.

The media infrastructure handles the actual bytes.

This distinction becomes particularly important for segmented streaming.

HLS Changes the Request Pattern

With HLS, one viewing session can generate many requests.

Suppose a 30-minute video uses six-second segments.

That represents roughly 300 media segments before accounting for playlists and quality changes.

Now multiply that request pattern across thousands of viewers.

Sending every request through the main application server is rarely desirable.

A CDN can cache appropriate media resources and reduce repeated origin requests.

The resulting architecture becomes:

                Application
                    |
             Authorization
                    |
                    v
Viewer <---------- CDN
                    |
                    v
              Object Storage

The application remains important, but it is no longer acting as the media transport layer.

Treat Original and Derived Media Differently

Another useful design decision is separating source files from playback files.

An uploaded original might be:

originals/8412/source.mov

while derived media could be:

streams/8412/v1/master.m3u8
streams/8412/v1/720p/...
streams/8412/v1/480p/...

This separation simplifies lifecycle management.

For example, a product might retain originals for re-encoding while aggressively caching immutable streaming segments.

Or it may remove originals after a retention period if product requirements permit it.

The important point is that different media classes have different operational purposes.

Version Encoded Output

Suppose a video is re-encoded but the application reuses the same segment paths.

CDN caches may continue serving older objects.

Versioned output avoids much of this ambiguity:

/video/8412/v1/...
/video/8412/v2/...

Once the application points playback to v2, the previous objects can be retired according to a cleanup policy.

Immutable, versioned media is considerably easier to cache safely.

Design Cleanup as Part of the Pipeline

Temporary storage is easy to ignore until a worker runs out of disk space.

A robust processing workflow should explicitly include cleanup:

Fetch Source
    ↓
Create Temporary Files
    ↓
Encode
    ↓
Upload Output
    ↓
Verify Output
    ↓
Delete Temporary Files

Cleanup also needs to happen after failed jobs.

Otherwise, a series of failed conversions can gradually fill the worker's disk.

A scheduled safety cleanup can be useful, but it should complement rather than replace correct job-level cleanup.

Build for Retryable Failures

Video processing involves multiple external and internal dependencies.

Failures can include:

  • interrupted uploads

  • malformed source files

  • FFmpeg failures

  • storage timeouts

  • network interruptions

  • worker crashes

A queue should distinguish between failures that may succeed on retry and failures that are effectively permanent.

For example:

Attempt 1
   ↓
Temporary Storage Error
   ↓
Wait
   ↓
Attempt 2

But repeatedly retrying a corrupted source video wastes worker capacity.

Bounded retries, exponential backoff and a final failed state make operational behavior much easier to understand.

Monitor User-Facing Metrics

Infrastructure monitoring alone is insufficient for video.

CPU at 40% and an online origin server do not prove that viewers are receiving good playback.

Useful media metrics include:

  • upload failure rate

  • queue wait time

  • encoding duration

  • processing failure rate

  • time to first frame

  • buffering duration

  • playback errors

  • CDN cache hit ratio

These metrics help connect infrastructure behavior with user experience.

For example:

Application uptime: 99.99%
Average video startup: 7.8 seconds

The infrastructure may technically be available while the actual product experience remains poor.

Build or Use Dedicated Infrastructure?

Once responsibilities are separated, teams face another decision.

They can operate:

Queue
+
Workers
+
FFmpeg
+
Object Storage
+
CDN
+
Playback Layer
+
Monitoring

themselves, or move some of these responsibilities to dedicated media infrastructure.

Platforms such as FileMoon are examples of the latter model: the application can treat video as a separate infrastructure layer instead of making its primary web servers responsible for the complete media lifecycle.

Neither approach is universally superior.

Self-managed infrastructure offers greater control.

Dedicated infrastructure can reduce operational responsibility.

The correct choice depends on whether custom media infrastructure creates meaningful product value for the team.

A Practical Architecture

For a growing video application, a reasonable architecture may eventually look like:

                    Users
                      |
                      v
               Web Application
                 /         \
                v           v
           Database      Upload API
                             |
                             v
                       Object Storage
                             |
                             v
                           Queue
                      /             \
                     v               v
                 Worker A         Worker B
                     \               /
                      \             /
                         FFmpeg
                           |
                           v
                     Streaming Output
                           |
                           v
                      Object Storage
                           |
                           v
                          CDN
                           |
                           v
                        Viewer

The value of this architecture is not that it contains more components.

Its value is that each workload can evolve independently.

Web traffic increases? Scale the application tier.

Encoding queue increases? Add worker capacity.

Media library grows? Scale storage.

Playback traffic increases? Optimize CDN and delivery.

That is a more sustainable model than repeatedly replacing one increasingly overloaded server.

Final Thoughts

The most important scaling lesson in video infrastructure is separation of responsibilities.

Video applications combine workloads with very different characteristics:

Application → compute and database

Encoding → CPU

Storage → capacity

Streaming → bandwidth

Trying to solve every growth problem by increasing the size of one server eventually becomes inefficient.

A better approach is to identify which resource is under pressure and separate that workload when the operational benefit justifies the additional complexity.

Start simple.

Measure queue time, processing time, storage growth and playback quality.

Then separate components based on actual bottlenecks rather than theoretical scale.

Good video architecture is not about having the largest number of services.

It is about ensuring that one workload cannot unnecessarily destabilize all the

Share

LinkedInX / TwitterFacebook
Contents
Video Creates Several Different WorkloadsThe Single-Server ArchitectureFirst Separation: Move Processing to Background WorkersWorker Concurrency Needs LimitsSecond Separation: Move Media Out of the Application FilesystemThird Separation: Don't Make the Application Server Deliver Every ByteHLS Changes the Request PatternTreat Original and Derived Media DifferentlyVersion Encoded OutputDesign Cleanup as Part of the PipelineBuild for Retryable FailuresMonitor User-Facing MetricsBuild or Use Dedicated Infrastructure?A Practical ArchitectureFinal Thoughts

Share

LinkedInX / TwitterFacebook