You just send the message again periodically forever until you receive an acknowledgement message. I don't think you need "something" for this, it's a five-liner.
Alternatively, depending on your use case, you mark messages with sequence numbers, and fill the gaps upon receiver's request.
At-most-once delivery is easy in anything. At-least-once is hard from scratch but there are good tools (TCP, HTTP/3) and patterns (retry, acknowledgement, logical monotonicity) and it’s generally not back-breaking.
Of course what everyone wants is exactly-once, which is profoundly difficult even when you know the exact cast of characters in terms of problem domain and compute fabric.
Idempotent updates with retry and ack is a very popular compromise that’s usually pretty feasible.