When MQTT outruns the destination
Incoming MQTT can outpace a database insert, a cloud bridge, or a PLC write.ADD ROUTE_CONFIG lets each route choose whether to wait or to drop the newest message — without crowding out every other route.
When to use it
- Leave the default (
balanced) on most routes. - Use
losslesswhen a path must not lose messages (audit, compliance) and you accept that the publisher may wait. - Use
realtimewhen high-rate telemetry must never stall the client that published it. - Set
OVERLOAD_CAPACITYto cap one noisy route so it cannot crowd out others.
ADD ROUTE_CONFIG is the only LoT block that works on every route type. Place it next to that type’s own config (SQL_CONFIG, SOURCE_CONFIG, MODBUS_CONFIG, and so on). Order among ADD blocks does not matter.
Let’s look at how to set it, starting with the three common contracts.
Quick Start
- Never drop a message
- Never stall the publisher
- Cap a noisy route
Use
lossless on a forwarding path that must keep every message. The publisher waits until this route has room — it never drops.Settings
All three settings are optional. An absentADD ROUTE_CONFIG block inherits the broker default entirely.
A message already accepted for a route is never evicted. Only the arriving message can be dropped. That keeps sequences such as Sparkplug birth then data self-consistent under load.
Defaults
Each setting resolves on its own:- No
ADD ROUTE_CONFIGblock — the route inherits the broker default for policy, timeout, and capacity. - A block is present but a setting is omitted — that setting does not copy the broker’s timeout or capacity.
OVERLOAD_POLICYinherits the broker default.OVERLOAD_TIMEOUTandOVERLOAD_CAPACITYuse that policy’s own default (50ms forbalanced, unbounded capacity). - An invalid value (unknown policy name, negative timeout, non-positive capacity) does not stop the route loading. The broker logs an error and uses that field’s default.
ADD ROUTE_CONFIG always overrides these for that route.
OVERLOAD_CAPACITY on a route is a private budget for that route. The shared ceiling is separate: one route can hit its own cap and start dropping while other routes still have room.
See Broker Configuration for how these sit alongside other broker limits.
What happens under load
When a route is waiting, that wait can delay the publishing client’s own publish — only that client, and only up to the wait budget. Other connected clients are not stalled by this route. The broker logs two different saturation conditions (each at most once every five seconds):- The shared route queue is full — every route waiting behind it is affected.
- A single route is over the
OVERLOAD_CAPACITYit declared for itself — the shared queue may still have room.
Troubleshooting
A route drops messages even though the broker looks idle
A route drops messages even though the broker looks idle
That route’s own
OVERLOAD_CAPACITY is exhausted. Look for the broker warning that a route is over its in-flight budget, not the warning that the shared queue is full.Publishers on a lossless route stall under load
Publishers on a lossless route stall under load
Working as designed —
lossless waits until there is room. Switch to balanced with a timeout if you would rather drop than stall, or cap a noisy route with OVERLOAD_CAPACITY so it drops its own overflow instead.OVERLOAD_CAPACITY seems to have no effect
OVERLOAD_CAPACITY seems to have no effect
It is declared alongside
OVERLOAD_POLICY "lossless" (or the broker default is lossless). Check the broker log for the lossless/capacity conflict — capacity is ignored, not applied.A route with no wildcard still waits longer than its own policy
A route with no wildcard still waits longer than its own policy
Another route’s overlapping wildcard pattern resolved a stricter policy for that topic. See the overlapping-pattern warning above.
The route drops immediately and never waits
The route drops immediately and never waits
The resolved policy is
realtime. That is expected — realtime drops without waiting.Best practices
- Start with the default
balancedpolicy. Change a route only when you have a reason (must not lose, must not stall, or must not crowd others). - Use
losslesssparingly. It protects delivery at the cost of delaying the publisher that caused the backlog. - Put
OVERLOAD_CAPACITYon the noisy route, not on the critical one — the critical route can stay unbounded while the noisy route drops its own overflow. - Prefer exact topic mappings when two routes would otherwise share a broad
+/#pattern with different policies. - Invalid settings never fail the route silently: read the broker log after deploy if behavior does not match the block you wrote.
Next Steps
Routes Overview
Define routes, mappings, and status topics.
Broker Configuration
Set broker-wide route overload defaults and other limits.

