Core model
Fibril uses a strict queue state machine. Each offset exists in at most one of three states:
Ready -> Inflight -> Acked ^ | +---------+ retry or expired leaseA ready message is eligible for delivery. Consumers pull work rather than receiving an unbounded push stream.
Inflight
Section titled “Inflight”Polling leases a message to a consumer until a deadline. If the consumer does not settle the message before expiry, the broker can return it to Ready.
Acknowledgement is final. An acked offset does not re-enter delivery.
Explicit settlement
Section titled “Explicit settlement”Manual-ack consumers decide what happens after processing:
msg.complete().await?; // terminal successmsg.retry().await?; // requeue immediatelymsg.retry_after(std::time::Duration::from_secs(30)).await?; // requeue after a delaymsg.fail().await?; // terminal failureawait msg.complete(); // terminal successawait msg.retry(); // requeue immediatelyawait msg.retryAfter(30_000); // requeue after a delayawait msg.fail(); // terminal failureawait msg.complete() # terminal successawait msg.retry() # requeue immediatelyawait msg.retry_after(30) # requeue after a delayawait msg.fail() # terminal failuremsg.Complete() // terminal successmsg.Retry() // requeue immediatelymsg.RetryAfter(30 * time.Second) // requeue after a delaymsg.Fail() // terminal failuremsg.Complete(); // terminal successmsg.Retry(); // requeue immediatelymsg.RetryAfter(TimeSpan.FromSeconds(30)); // requeue after a delaymsg.Fail(); // terminal failureDelayed retry keeps the message out of ready delivery until its retry deadline.
Why leasing
Section titled “Why leasing”Leasing makes failure recovery explicit. A consumer can disappear without permanently taking messages with it, and bounded prefetch gives the broker a concrete backpressure mechanism.