Lesson 2: Debugging Performance (Structural Analysis)
Using your architecture diagram to find bottlenecks.
Lesson 2: Debugging Performance
Scenario: It’s Black Friday. The “Checkout” page is loading in 5 seconds. Why?
The Wrong Way
Start reading random logs or guessing which database query is slow.
The Structural Way
Look at your Sruja User Journey for “Purchase”.
import { * } from 'sruja.ai/stdlib'
Customer = person "Customer"
Platform = system "E-Commerce Platform" {
Checkout = container "Checkout Service"
PaymentWorker = container "Payment Worker"
PaymentQueue = queue "Payment Jobs"
}
PaymentGateway = system "Payment Gateway" {
metadata {
tags ["external"]
}
}
// Original synchronous flow (problematic)
Purchase = story "User Purchase Flow" {
Customer -> Platform.Checkout "Initiates checkout"
Platform.Checkout -> PaymentGateway "Process Payment" {
latency "2s"
}
PaymentGateway -> Customer "Returns confirmation"
}
Wait, the PaymentGateway call is synchronous and takes 2 seconds? And it’s in the critical path of the user request?
Root Cause: We are blocking the user while waiting for the bank.
The Fix: Asynchronous Processing
We need to decouple the user request from the payment processing.
- Introduce a Queue: The Checkout service puts a message on a queue.
- Worker: A background worker processes the payment.
- Update: The frontend polls for status or uses WebSockets.
Let’s update the architecture:
import { * } from 'sruja.ai/stdlib'
Customer = person "Customer"
Platform = system "E-Commerce Platform" {
Checkout = container "Checkout Service"
PaymentWorker = container "Payment Worker"
PaymentQueue = queue "Payment Jobs"
}
PaymentGateway = system "Payment Gateway" {
metadata {
tags ["external"]
}
}
// Updated asynchronous flow
Customer -> Platform.Checkout "Initiates checkout"
Platform.Checkout -> Platform.PaymentQueue "Enqueues payment job" {
latency "10ms"
}
Platform.PaymentQueue -> Platform.PaymentWorker "Processes async"
Platform.PaymentWorker -> PaymentGateway "Processes payment"
PaymentGateway -> Customer "Sends confirmation email"
// Updated scenario
PurchaseAsync = story "Asynchronous Purchase Flow" {
Customer -> Platform.Checkout "Initiates checkout"
Platform.Checkout -> Platform.PaymentQueue "Enqueues job" {
latency "10ms"
}
Platform.PaymentQueue -> Platform.PaymentWorker "Processes async"
Platform.PaymentWorker -> PaymentGateway "Processes payment"
PaymentGateway -> Customer "Sends confirmation"
}
view index {
title "Payment Processing Architecture"
include *
}
// Performance view: Focus on async flow
view performance {
title "Performance View - Async Processing"
include Platform.Checkout Platform.PaymentQueue Platform.PaymentWorker PaymentGateway
exclude Customer
}
By visualizing the flow, the bottleneck (and the fix) becomes obvious.