Skip to main content
Reliability

SMS Failover and Redundancy: Designing Safer Retries

MessageTrade
FIG. 04FAILOVER PATHS

Redundancy in SMS aggregation is usually sold as more connections. The harder and more valuable work is deciding what your system does with each kind of failure, because an enthusiastic retry can duplicate a passcode, waste spend and annoy a recipient just as effectively as a missing route can lose one.

Three different kinds of redundancy

  • Connection redundancy: more than one bind or endpoint so a single transport failure does not stop submissions.
  • Route diversity: more than one onward path for a destination, so a route-level problem has an alternative — where one is configured and available.
  • Shared final leg: the recipient's mobile network and handset are common to every path. No amount of upstream diversity changes that, which is why 'fully redundant' should never be read as 'guaranteed delivery'.

It is also worth separating acknowledgement layers. A successful SMPP bind establishes a session, not acceptance of a particular SMS. Check the message-level submission response and status code to establish acceptance for onward handling; even successful acceptance is not handset delivery. Provider status vocabularies such as the Twilio message statuses show how many steps sit between those two ideas. Whether rerouting is configured for your traffic, and what it costs, is part of the agreed service — worth confirming with a carrier and aggregator gateway provider rather than assumed from a diagram.

A failure decision table

Different failure signals demand different responses. A written failure policy helps teams avoid blind retries.

SignalWhat it tells youReasonable response
Failure before the request was transmittedDefinitely not submittedBounded retry with backoff and jitter as appropriate, within the validity window
Request sent, but no message-level response, or a timeoutAmbiguous: acceptance is unknownReconcile using the supported functions and agreed reporting for your service before resending. Your own correlation key helps an investigation, but cannot prove the provider-side outcome without supported correlation
Explicit reject, known transient causeNot accepted, and the cause may clearBounded retry with backoff and jitter, within the validity window and where retrying is permitted
Explicit reject, permanent causeNot accepted and will not beDo not retry the same way; assess the code, sender eligibility and message content
Accepted, receipt still pendingIn progress; absence of a receipt proves nothing yetWait for the agreed receipt window before drawing any conclusion
Confirmed terminal failureA final status has reported failureInvestigate the code and eligibility; retry only if the code and market rules justify it
Invalid destination, sender or missing consentThe request itself is wrongStop, correct the data or the arrangement, and never attempt a workaround route
Illustrative decision guide. Adapt the categories to the statuses your own integration actually receives.

The row people get wrong is the ambiguous one. A timeout is not a failure; it is an absence of information. Blindly resending on timeout is how one passcode becomes three.

Retries need boundaries

Retry logic should be explicitly bounded: a maximum number of attempts, exponential backoff with jitter so recovering systems are not hit by a synchronised wave, an overall validity window after which a message is pointless, and a spend limit so a retry loop cannot become a bill. The AWS SDK retry behaviour documentation is a useful published example of how bounded backoff and jitter are configured in practice; it describes that SDK's design, not any MessageTrade implementation.

Idempotency helps, within limits. As the AWS Builders' Library article on safe retries sets out, a retry is only safe when the receiving side can recognise a repeated request identity and avoid repeating the side effect. In messaging, that protection is application-specific and provider-specific: your own request keys can stop your service from creating a second message, and a provider may deduplicate within its own scope, but no request key spanning two independent providers can guarantee exactly one handset delivery. Design for 'at most one that we created', and reconcile the rest.

Failback deserves as much care as failover

Moving traffic away from a degraded route is the easy half. Moving it back too eagerly produces flapping, mixed sender behaviour and confusing evidence. Use a deliberate, controlled failback: confirm recovery over a period rather than a single probe, return a small share of traffic first, watch receipt latency and error codes before restoring the rest, and record the change with an owner and a UTC time.

Practical checks worth running

  • Can you distinguish 'not accepted' from 'no answer' in your own logs today?
  • What does your application do on a submission timeout, and has anyone tested it?
  • Is there a validity window that stops a late authentication message from arriving after it is useless?
  • Does a retry loop have a spend ceiling as well as an attempt ceiling?
  • For authentication traffic in a product, is the resend behaviour visible to the user, so they are not left guessing?

That last point matters most for product teams. Passcode and alerting flows inside an application need the retry and reconciliation behaviour designed alongside the user experience, which is a different conversation from wholesale interconnect and closer to a managed SMS gateway for SaaS applications discussion.

Redundancy that has never been exercised is a hypothesis. Redundancy with a written failure table, bounded retries and a controlled failback path is a design.

Discuss failover and redundancy for your traffic

Tell us which destinations and traffic types must survive a route problem, what your application does today when a submission fails, and how you reconcile ambiguous results. We can then discuss what failover behaviour is realistic for your service.

Sources and further reading

Independent references are general context, not evidence of MessageTrade capabilities, partnerships or performance.