All posts
reliabilityapioperationsdispatch

Replay starts with the original request ID

A safe replay path keeps the first delivery visible, refuses blind retries, and records the second attempt as its own event

The replay button is easy to justify.

A delivery failed. The upstream system timed out. An operator wants to try again. A support engineer wants to unblock a user before the next retry window. A queue worker crashed and left the final state uncertain. In each case, replay feels like the practical answer.

Replay is only safe when the operator can still see the first attempt clearly.

If the system has lost the original request ID, payload identity, response record, and delivery state, replay becomes guesswork wearing operational language. The team is no longer asking "should we repeat this delivery?" It is asking "can we afford to act without knowing what the previous attempt actually did?"

A retry and a replay are different operations

Automatic retry belongs to the delivery policy. The system decides when to try again based on the response class, timeout rules, backoff policy, and retry budget.

Replay is an explicit operator action. It happens later, often after somebody has inspected logs, checked a customer report, or decided that waiting for the queue is no longer good enough. That difference matters because replay carries more human confidence and often less direct system context.

A mature dispatch system should not treat the two actions as the same thing. Retry is a governed loop inside the delivery engine. Replay is an exception path that needs stronger evidence and a sharper audit trail.

Keep the first delivery legible

The first delivery record needs enough shape that a second person can inspect it without reconstructing the event from scattered logs.

At minimum, keep the original request ID, destination, payload identity, attempt count, timestamps, response status, response class, and the last known state. If the receiver returned a durable acknowledgement, store that. If the request timed out, store the uncertainty rather than compressing it into failure.

That record turns replay into a reviewable decision. Without it, operators tend to over-index on the latest visible error. A timeout may hide completed work. A 500 may have happened after the receiver already created the downstream job. A network reset may say more about the path than about the receiver.

Operator tools should refuse blind replay

Not every failed delivery should be replayable from the first screen that shows red.

There are times when the right operator action is to wait for the existing retry policy, inspect the receiver, or mark the event for human review. If the tooling allows instant replay without context, the system teaches people to use force where the situation calls for evidence.

A useful replay control asks a small set of questions before it proceeds. What was the last observed result? Has the delivery already been acknowledged by the receiver? Is the destination currently healthy? Does the payload depend on time-sensitive business state that has changed since the first attempt? Has another replay already been triggered?

Those checks do not need to block every action. They need to stop the most common category mistake, replaying because the screen is urgent rather than because the evidence supports another handoff.

The second attempt needs its own record

Replay is not a replacement for the first delivery. It is a new delivery event tied to the first one.

That means the system should create a second record with its own timestamp, operator identity when relevant, request ID, outcome, and reference back to the original attempt. If the replay succeeds, the audit trail should still show that the original delivery failed or timed out. If the replay fails, the team should be able to see that two distinct actions occurred.

This matters for more than debugging. Support answers, downstream reconciliation, incident review, and customer trust all depend on whether the team can explain what the system actually did. "We retried it" is too loose. "The original request timed out, an operator replayed it at 14:12 UTC, and the receiver acknowledged the second delivery" is much better.

Replays should preserve payload identity

The safest replay sends the same business event, not a newly improvised version of it.

If the operator path silently rebuilds the payload from current database state, the replay may no longer represent what the first delivery attempted to send. That can be reasonable in a compensating workflow, but it is no longer a replay in the strict sense. It is a new dispatch decision and should be labeled as such.

Payload identity can stay practical. A content hash, event version, or stored payload snapshot may be enough. The important thing is that the system can tell whether the replay repeated the original business message or generated a new one after conditions changed.

Build the replay path for the calm operator

Operator tools are often designed around the most urgent moment. That produces interfaces that encourage action before understanding.

A better replay path serves the calmer operator, the person who arrives after the first alert, reads the record, checks the receiver, and decides whether repetition is the right fix. That operator needs context, refusal conditions, and a clear audit trail more than they need another fast button.

The same design improves automation. If the operator path is explicit about evidence, payload identity, and second-attempt logging, the system gains a clearer model for when a replay is safe and when it should stay a human decision.

The replay path should make the system more honest

Stack Dispatch helps teams move events with enough evidence that a second attempt never needs to be mysterious.

That means keeping the first request visible, distinguishing automatic retry from human replay, refusing blind repetition where the state is unresolved, and recording the replay as its own delivery event. The result is not only safer operations. It is a system that can explain itself after the fact.

Replay starts with the original request ID because the original request is the thing the team is trying to understand. If that identity disappears, replay becomes an operational shrug. Reliable dispatch systems should demand better than that.

0 comments

Join the conversation

Enjoyed this? Subscribe for more.

Get new essays on software architecture, AI systems, and engineering craft delivered to your inbox. No spam-ever.