I’m looking for an event bus library that reliably implements Outbox pattern, i.e. can guarantee that if the publishing function finished its execution, then a message will be delivered at least once to every subscriber.
That includes postponing parent shutdown until getting an acknowledgement from the storage that an event was successfully persisted.
Are the messages to be published to an external service or inside the same Elixir system?
For the Outbox pattern we use Oban as it has retry built-in. If you are publishing to services like Kafka or RabbitMQ you still have to trust the service to deliver the message if the publishing function returns.
While in a DB transaction that creates some stuff we insert an Oban job (outbox pattern itself).
When the transaction succeeds we can return “OK” from our API and guarantee that the job will be performed at some point since the job was inserted in Postgres.
In the job there is a simple HTTP call to another service or a message published to Kafka. It can be anything.