ContactBook a call
HomeServicesProcessProjectsIndustriesAboutContact
Book a discovery call
Real-time · Distributed · GPU

Multi-instance Unreal Engine pixel streaming, behind a single URL.

An interactive 3D product configurator delivered through the browser — with no client install, no plugin and a control plane that handed out fresh GPU instances in under a second.

CONCURRENT SESSIONS
8,420
P99 CONTROL PLANE
84ms
GPU POOL
54 nodes
STREAMS LAUNCHED
11.4M
● THE PROBLEM

What we walked into.

The client had a single-tenant Unreal Engine experience that took 30 seconds to spin up, served exactly one user per GPU, and required custom URLs that leaked instance addresses. A month-long sales pilot crashed the platform on day three when 1,200 prospects arrived at once.

GOALS WE COMMITTED TO
  • Multi-instance allocation behind a single, opaque URL per session
  • Sub-second time-to-pixel for warm pools, < 6s cold-start
  • Tenant isolation: any session reachable only by its rightful holder
  • Observability deep enough to debug a frozen frame across five services
● THE SOLUTION

What we shipped.

  • 01A Go orchestrator (gRPC) that owns the GPU pool, leases instances per session, and reaps idle workers. Backed by Redis for distributed leases.
  • 02Kong gateway in front of every public endpoint, terminating mTLS, validating JWTs and enforcing per-tenant rate limits.
  • 03Laravel auth service for SSO, RBAC and session minting; NestJS logging service consuming RabbitMQ topics.
  • 04Fluent Bit shipping logs from every UE node to Loki, correlated by trace ID with metrics in Prometheus and traces in Tempo.
Architecture

The full topology, at a glance.

UE-PIXEL-STREAM · ARCHITECTURELIVE
EDGE / CLIENTCONTROL PLANESTREAM ORCHESTRATIONOBSERVABILITY📱Player BrowserWebRTC client🎮Game LobbyReact + Vite🛠Admin ConsoleVue 3Studio Uploadmultipart · S3 sigv4CDN · Edge Locations3 regions · 12ms p50Kong API GatewayJWT · rate-limit · circuit-breakAAuth Servicelaravel · sso · rbacSSession Servicenestjs · redis leaseUUpload Servicelaravel · ffmpegBBillingstripe · webhooksStream Orchestratorgolang · grpcpoolscheduleleaseevictRabbitMQexchanges · DLQ · 14k msg/sRedis Clustersessions · backpressureFluent Bitlog shipper · 50msPPostgres HAprimary + 2 replicasUE Instance Pool Aus-east · 24× g4dn.xlargeUE Instance Pool Beu-west · 18× g4dnUE Instance Pool Cap-south · 12× g4dnKKubernetesHPA + custom KEDAGrafana40 dashboardsPrometheus15s scrapeLoki6.4M lines/dayTempoOTel tracesPagerDutySLO burn
SAMPLE: SESSION ALLOCATION
orchestrator/lease.gogo
// LeaseInstance picks a warm GPU and hands it to a session.
// Idempotent on (tenant, sessionID); honors per-tenant quotas.
func (o *Orchestrator) LeaseInstance(
  ctx context.Context, req *LeaseReq,
) (*Lease, error) {
  span := tracer.Start(ctx, "lease.acquire")
  defer span.End()

  if err := o.quota.Check(req.Tenant); err != nil {
    return nil, errs.QuotaExceeded(err)
  }

  inst, err := o.pool.PickWarm(ctx, req.Region)
  if err != nil {
    return o.coldBoot(ctx, req)
  }

  lease := &Lease{
    ID:        uuid.NewString(),
    ExpiresAt: time.Now().Add(req.TTL),
  }
  return lease, o.store.Save(ctx, lease)
}
Microservices

The services we shipped.

stream-orchestratorGo

GPU pool, leases, evictions

auth-svcLaravel

SSO, RBAC, JWT

session-svcNestJS

session lifecycle, limits

upload-svcLaravel

build ingest, transcoding

log-svcNestJS

RabbitMQ → Loki bridge

billing-svcNode

metered minutes, Stripe