Design and Operational Guidance
This page explains how to reason about systems built on RelayX.
It is not an API guide.
It is not a feature list.
It explains how RelayX behaves in the real world and how you should design around that behavior so your system keeps working during crashes, retries, reconnects, and load spikes.
If you understand this page, the rest of the documentation will feel obvious.
Think of RelayX as Infrastructure You Don’t Have to Run
RelayX exists so you don’t have to build or operate real-time infrastructure yourself.
You do not need to:
- Run message brokers
- Manage persistent connections
- Build fan-out systems
- Handle ordering at scale
- Design retry and redelivery logic from scratch
RelayX takes care of those problems.
What it does not do is guess how your application should behave when things fail.
RelayX handles infrastructure problems.
Your application handles product logic.
Separate “Sending” From “Handling”
A core idea in RelayX is that sending a message is not the same as handling it.
- Producers send messages.
- Subscribers handle messages.
- These two sides are intentionally decoupled.
From the producer’s point of view:
- Messaging is fire-and-forget.
- You send a message and move on.
- You do not wait for subscribers.
- You do not track delivery or retries.
From the subscriber’s point of view:
- Messages arrive in order.
- Messages may be redelivered if handling fails.
- Your code must be safe to run again.
Thinking this way prevents tight coupling and avoids blocking systems on each other.
Expect Retries, Not Perfection
RelayX is built on the assumption that things fail.
That means:
- Subscriber processes crash
- Workers restart
- Connections drop
- Timeouts happen
When this happens, RelayX does not panic or invent new behavior. It follows clear rules.
For example:
- Messages are redelivered if subscriber handling fails
- Jobs are redelivered if workers crash or fail to acknowledge
- Ordering and deduplication rules stay the same during retries
Retries are not edge cases.
They are normal behavior.
If your system breaks when something runs twice, it will break in production.
Understand What RelayX Guarantees and What It Does Not
RelayX makes strong backend guarantees, but they are narrow and specific.
RelayX guarantees things like:
- How messages are ordered
- When messages or jobs are redelivered
- What deduplication means
- When work is considered complete
RelayX does not guarantee:
- Exactly-once execution of your code
- That side effects only happen once
- That state updates cannot be overwritten
- That retries are always safe
Do not build systems that rely on guarantees RelayX does not claim to provide.
Design Handlers to Be Safe to Run Again
Because retries happen, handler code should be written with this in mind.
Good handlers:
- Can run more than once without breaking things
- Check state before applying changes
- Avoid irreversible side effects without safeguards
Bad handlers:
- Assume “this will only run once”
- Perform partial side effects without checks
- Rely on timing or ordering across systems
RelayX will not protect unsafe handlers from themselves.
Think in Terms of Delivery, Not Success
RelayX delivers messages and jobs.
It does not decide whether your business logic succeeded.
A message being delivered does not mean:
- The user action succeeded
- The database update committed
- The external API call completed
It only means:
- RelayX delivered the message
- Your code was given a chance to handle it
Success is defined by your application, not by RelayX.
Use the Right Tool for the Job
RelayX gives you multiple tools because different problems need different rules.
- Use Messaging to notify subscribers about events
- Use Queues for background work that must be acknowledged
- Use the Key-Value Store to share small pieces of state
Do not force one tool to behave like another.
If you use Messaging like a queue, or the Key-Value Store like a database, things will fail in subtle ways.
Backpressure Is a Reality, Not a Bug
Under load, RelayX may slow down delivery.
This is expected.
RelayX prefers:
- Slower delivery
- Predictable behavior
- Preserved guarantees
over:
- Dropping messages silently
- Breaking ordering
- Inventing unsafe shortcuts
Your system should be able to tolerate slower delivery during peak load.
Build for Recovery, Not Prevention
You cannot prevent all failures.
Instead of trying to stop every possible failure, design your system so it can recover:
- Handlers can run again
- State can be rebuilt
- Missed messages are acceptable
- Temporary inconsistency is survivable
RelayX supports recovery by making behavior predictable.
A Useful Mental Shortcut
If you remember nothing else, remember this:
- RelayX handles delivery
- Your code handles correctness
RelayX will get messages and jobs to your code in a clear, documented way.
What your code does with them is your responsibility.
Why This Mental Model Works
Teams that think this way:
- Integrate RelayX faster
- Debug issues more easily
- Avoid unsafe assumptions
- Build systems that survive real failures
RelayX is not trying to make distributed systems disappear.
It is trying to make them understandable enough that you can build on them with confidence.
That is how you should think about RelayX.
Join our Discord server, post your concern & someone from our team will help you out ✌️