03CASE STUDY

Distributing Notification Workloads

Controlling concurrent notification processing by distributing incoming work across multiple processing channels.

RoleBackend Developer
Period2023 — 2025
FocusConcurrency · Workload Distribution

A single tracking event could trigger multiple notification workflows.

The tracking platform allowed notifications to be configured around different events and conditions. A single tracking could therefore generate work that needed to be processed and delivered to external notification services.

As the volume of tracking data increased, notification work could arrive in bursts. The challenge was not only processing each notification, but controlling how much work was allowed to reach the notification processing layer at the same time.

01Tracking eventVehicle state or detected event
02Notification rulesConditions determine what should be triggered
03Notification workRequests waiting to be processed
04DeliveryExternal notification service

The problem was not processing notifications. It was processing too many at once.

When several tracking events triggered notifications at the same time, the resulting work could reach the notification processing layer in large bursts.

Allowing all of that work to execute concurrently increased pressure on the notification service and made the system's behavior less predictable during traffic spikes.

The challenge was therefore to introduce a controlled amount of concurrency without unnecessarily slowing down normal processing.

01Workload bursts

Multiple tracking events could trigger notification work within a short period of time.

02Concurrent pressure

Too much work reaching the processing layer simultaneously could concentrate load on the notification service.

03Unpredictable load

Without a controlled processing capacity, workload spikes could produce significantly different execution behavior.

04Need for controlled concurrency

The system needed to process work in parallel, but within a predictable and controlled capacity.

I introduced controlled concurrency by distributing work across fixed processing channels.

Instead of allowing every notification request to execute independently, notification work was distributed across a fixed number of processing channels.

Each incoming piece of work was assigned to the next channel in sequence. This created a predictable distribution of workload while keeping the amount of concurrent processing under control.

INCOMING WORK
010203040506
DISTRIBUTIONRound-RobinEach new item is assigned to the next channel in sequence.
CHANNEL 0101 → 05
CHANNEL 0202 → 06
CHANNEL 0303
CHANNEL 0404
01Fixed capacity

The number of processing channels remained fixed, providing a predictable amount of concurrent work.

02Simple distribution

Round-Robin provided a simple and predictable way to distribute incoming work without additional coordination or complex balancing logic.

03Controlled concurrency

Work could still be processed in parallel, but concurrency was bounded instead of growing with every incoming notification.

The solution needed to control concurrency without introducing unnecessary complexity.

There were different ways to distribute notification work. A more adaptive strategy could continuously evaluate the state of each processing path and make decisions based on current workload.

In this case, that additional complexity was not necessary. The main requirement was to establish predictable processing capacity and avoid concentrating bursts of work on a single path.

01
Why fixed channels?

A fixed number of channels made the amount of concurrent processing explicit and predictable. Capacity could be reasoned about instead of growing with the number of incoming requests.

02
Why Round-Robin?

Round-Robin provided a simple and deterministic distribution strategy. Each new piece of work moved to the next channel without requiring additional coordination or workload analysis.

03
Why not adaptive balancing?

An adaptive approach would introduce additional state and decision logic. Since the problem could be addressed with predictable distribution and controlled capacity, the extra complexity was not justified.

04
Why allow parallel processing?

The objective was not to serialize all notification work. Multiple channels allowed the system to continue processing in parallel while keeping concurrency within a controlled limit.

DESIGN PRINCIPLEThe simplest strategy that solves the real problem is often the better design.

Notification processing became more predictable under workload spikes.

Distributing notification work across multiple processing channels reduced the concentration of concurrent operations reaching the notification service at the same time.

The system continued processing work in parallel, but within a defined processing capacity. This made workload behavior easier to reason about and reduced the risk of uncontrolled concurrency during bursts.

01Distributed workload

Incoming notification work was spread across multiple processing channels instead of concentrating on a single execution path.

02Controlled concurrency

The number of concurrent processing paths was bounded by the configured channel capacity.

03More predictable behavior

Workload spikes became easier to reason about because processing capacity was explicit rather than growing with incoming demand.

04Better spike handling

The system could continue processing notification work in parallel without allowing bursts to create uncontrolled concurrent pressure.

CORE IDEAMore concurrency is not always more throughput.

The right amount of concurrency depends on the capacity and behavior of the system receiving the work.

Concurrency should be designed around capacity, not simply maximized.

Parallel processing can improve throughput, but allowing more work to execute simultaneously does not automatically make a system faster. At some point, additional concurrency becomes pressure on the next component in the chain.

This experience reinforced the importance of understanding the complete processing path before choosing a concurrency strategy. The goal is not maximum parallelism, but the right amount of parallelism for the system's actual capacity.

TAKEAWAYDon't maximize concurrency. Control it.