for solace cloud brokers

Autoscale your brokers as throughput grows

A single Solace broker can only grow so far. Once you're on the biggest one and traffic keeps climbing, the question changes from "pick a bigger broker" to "how many brokers, and when?" solace-autoscale answers that using capacity numbers you measure from your own brokers, and shows the reason behind every recommendation, never just a number. It advises by default; turning on automatic scaling is a separate, deliberate switch.

One broker, light load
Apache 2.0 · free & open source Python 3.11+ Same input, same answer, every time Never changes anything unless you ask

Measure once, then get answers you can trust

Nothing is guessed and nothing is hidden. The capacity numbers come from your own brokers, not from us. The recommendation is worked out the same way every time, and it comes with the full reasoning - so you can still explain it to someone weeks later.

step 1 · measure

Use your own numbers

Feed it a spreadsheet of how your brokers actually perform. It saves that as a dated file it reads later, so you always know which numbers produced which answer.

step 2 · recommend

See the why, not just the how many

It checks four things a broker can run out of - message rate, data rate, connections, and stored messages - and tells you which one you'll hit first.

step 3 · act (optional)

It only advises, unless you say otherwise

Out of the box it just gives advice - it can't touch your brokers. Letting it scale for you is a separate, deliberate switch, with safety checks that block anything risky.

Bigger messages cost far more than they look

One broker can handle about 44,000 small (1 KB) messages a second - but only about 439 a second when each message is 200 KB. That's why "just add more brokers" is sometimes the wrong call: with big messages you run out of data capacity, and shrinking the message is usually the cheaper fix than buying more brokers.

44,192 439
messages/sec one broker can handle
as each message grows from 1 KB to 200 KB
The message rate drops about 100×, yet the broker is moving roughly the same amount of data (45 → 90 MB/s). It's busy shifting bytes, not messages. At that point more brokers help, but they get expensive fast - so it's worth checking the payload first.

Three workloads, three different answers

These are real results from the tool. For each workload, the bars show how full one broker would be on each of the four things it can run out of. The amber line is the safe limit; the highlighted bar is the one you'd hit first - and the reason for the advice.

within one broker more than one broker can handle safe limit

Route each message by topic and payload, not round-robin

Once a workload spans several brokers, where each message goes stops being arbitrary. The shim wraps the app's existing AMQP client and makes a per-message decision from rules that combine the topic and the payload, picks the target broker, and stamps a partition key on the wire (AMQP group-id plus a saas_partition_key property). The listener side runs the same rules in reverse to demultiplex a coherent per-key stream, so routing is deterministic and verifiable end to end. Type a message below and watch a rule fire.

When the fleet scales, the shim does not poll to find out. The autoscaler publishes a topology snapshot as an event on the brokers' own reserved control topics, and the shim reacts to the push. A scale-up moves only a small fraction of partition keys (rendezvous hashing), and each moved key is reassigned ordering-first: it keeps draining on its old broker until in-flight messages clear, then cuts over to the new owner, stamped with a generation (saas_gen) so the listener releases the key's stream in order. Per-key order survives the scale event.

broker
address
partition key
amqp group-id
saas_gen

The rules driving this demo (first match wins; else the default broker):

dispatch:
  enabled: true
  default_broker: broker-bulk
  rules:
    - name: vip-orders                 # topic AND payload
      when:
        topic: "orders/>"
        payload:
          - { path: priority, op: in, value: [high, urgent] }
      route:
        broker: broker-vip
        key:   "vip.{region}"          # partition key = ordering group
        topic: "vip/{topic}"           # optional address rewrite
    - name: large-orders
      when:
        topic: "orders/>"
        payload:
          - { path: amount, op: gt, value: 1000 }
      route: { broker: broker-big, key: "big.{region}" }

Turn broker counts into dollars - and see what's coming

A recommendation you can take to a budget meeting needs a price tag and a look ahead. Give it your own prices and it shows the monthly cost. Ask "what if traffic doubles?" and it shows how many brokers you'd need - and where you'd run out of room.

Monthly cost as a workload grows

GroupBrokersUSD / moChange / mo
orders1 → 54,200 → 21,000+16,800
plus 1 standby+1 idle25,200+21,000

A standby broker still costs money while it sits idle. You supply your own prices - the tool ships none.

Brokers needed if traffic grows

TrafficBrokers neededRuns out ofRoom left?
today5data rateyes
8data ratefull
8data ratefull
8data ratefull

At just 2× today's traffic, this workload already maxes out an 8-broker limit. Better to plan for that now than be surprised by it next quarter.

Up and running in three commands

Before you add your own numbers, it runs on clearly-labelled sample data that can never trigger a real change. Install it, get a recommendation, then look ahead.

# install (Python 3.11+)
python -m venv .venv && . .venv/bin/activate
pip install -e '.[dev]'

# 1. turn your performance spreadsheet into numbers the tool can read
solace-autoscale compile --workbook performance.xlsx \
    --service-classes models/service-classes.json --out models/mymodel.json

# 2. get a recommendation, with the reasoning and the cost
solace-autoscale recommend --config config.example.yaml --metrics metrics.json

# 3. see what you'd need if traffic doubles or quadruples
solace-autoscale whatif --config config.example.yaml --metrics metrics.json --multipliers 1,2,4

There's more it can do: simulate (stress-test the numbers across many workloads), monitor (watch a live broker and track how accurate its advice was), accuracy (predicted vs. what actually happened), shard-advise (suggest how to split traffic into groups), and serve (point clients at the right broker).

Sensible defaults, and knobs when you need them

Everything lives in one settings file, and it warns you about typos instead of ignoring them. The defaults are cautious on purpose. Here are a few settings you're most likely to touch:

How many brokers are allowed

fleet.min_brokers / max_brokers

Set a floor and a ceiling. If a workload needs more than the ceiling, it says so clearly rather than quietly pretending it fits.

How brokers are connected

topology.mode: sharded | mesh | hybrid

If your brokers talk to each other (mesh), it counts that extra traffic - so a setup that's costly with big messages looks costly, as it should.

How much safety margin

policy.headroom.mode: derived | fixed

It can work out the margin for you - leaving room for traffic that keeps rising while a new broker spins up - or you can set a fixed number.

Prices & cost

billing.model · per_broker_monthly

Add your own prices to see monthly cost. If you pay a fixed yearly rate, it won't suggest scaling down (you're paying either way). No prices ship with the tool.

Where the numbers come from

metrics.source: semp | prometheus | cloud-api | static

Read live stats straight from a broker, from Prometheus, from the Cloud API, or from a file. The live-broker reader is checked against a real broker.

Advise, or actually scale

actuation.mode: recommend | scale-up-only | full

Advice-only by default, and it stays that way. Letting it make changes is a deliberate switch - with an off switch, rate limits, and checks before anything is removed.