Event-Driven Notification Platform  ·  View 16 of 26  ·  4 · Runtime

Timing, Scheduling and Digests

Six ways a notification can be timed, and the one due-work stream they all converge on.

Editable source SVG draw.io All views
Timing decision
Timing decision
Durable wait
Durable wait
Aggregate
Aggregate
Becomes due
Becomes due
Dispatch
Dispatch
Immediate · 85%
Immediate · 85%
Send now
no preference to defer
Send now...
None
straight through
None...
notif.due
p95 under 400 ms
notif.due...
Channel topic
Channel topic
Delayed
Delayed
Delay t
rule sets the offset
Delay t...
Temporal timer
survives restart
Temporal timer...
notif.due
timer fires
notif.due...
Channel topic
Channel topic
Scheduled
Scheduled
At schedule
cron per tenant
At schedule...
Temporal cron
tenant timezone
Temporal cron...
notif.due
timer fires
notif.due...
Channel topic
Channel topic
Quiet hours
Quiet hours
In quiet window
recipient timezone
In quiet window...
Defer to next hour
Defer to next hour
Jittered release
spread over 15 min
Jittered release...
notif.due
window opens
notif.due...
Channel topic
Channel topic
Digest
Digest
Digest opted in
replaces per-event
Digest opted in...
Session window
Flink · 1 h default
Session window...
Aggregate buffer
Redis roll-up
Aggregate buffer...
Digest render
N items to 1
Digest render...
notif.due
one message
notif.due...
Channel topic
Channel topic
Breakout
Breakout
P0 inside a window
security or transactional
P0 inside a window...
None
window bypassed
None...
Left in the digest
would delay a passcode
Left in the digest...
notif.due
immediately
notif.due...
Channel topic
Channel topic
Timing — Immediate, Delayed, Scheduled and Digested
Timing — Immediate, Delayed, Scheduled and Digested
Decision point
Decision point
Application we own
Application we own
Queue / topic
Queue / topic
Data store
Data store
Risk / gap
Risk / gap
Every lane converges on the same notif.due stream, so the dispatcher has one code path. Timing state is durable in Temporal and Kafka, never an in-process timer — a pod restart during a two-day delay loses nothing.
Every lane converges on the same notif.due stream, so the dispatcher has one code path. Timing state is durable in Temporal and Kafka, never an in-process timer — a pod restart during a two-day delay loses nothing.
v 1.0 · owner Data & AI Global Practice · date 2026-08
v 1.0 · owner Data & AI Global Practice · date 2026-08
Text is not SVG - cannot display

Decisions

  • Timing state is durable in Temporal and Kafka, never an in-process timer — a pod restart during a two-day delay loses nothing
  • Every lane converges on the same notif.due stream, so the dispatcher has one code path regardless of how the work became due
  • About 85 percent of traffic takes the immediate lane and never touches Temporal, which is what keeps Temporal off the critical path

Digest behaviour

  • Session windows per recipient in Flink, default one hour, tenant-configurable
  • A P0 item arriving inside a digest window takes the breakout lane and sends on its own — the red cell is what happens if that lane is missing
  • The digest records which notification ids it absorbed, so each still has an individual answer

Risk

  • Quiet hours across timezones create a synchronised release at the window boundary — a thundering herd of deferred sends
  • Mitigated by jittering the release across the first 15 minutes of the window, which must be load-tested before go-live