You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Adopter issue from the #3715 triage. Cheapest of the six adopters — start here.
Why Redis Streams qualifies
Verified against RedisStreamListener.CompleteAsync (src/Transports/Redis/Wolverine.Redis/Internal/RedisStreamListener.cs:224): the ack is StreamAcknowledgeAsync(streamKey, consumerGroup, entryId), keyed off an entry id carried in a header on the envelope itself. That is exactly the property EndpointMode.NativeAck needs — the delivery identity travels with the envelope, so it can be settled out of order from an arbitrary worker thread after the handler finishes.
Redis has no lease clock. The pending-entries list plus XAUTOCLAIMis the redelivery mechanism, so unlike SQS/ASB/Pub/Sub/NATS there is nothing to renew while an envelope waits in a partition lane. That is what makes this the cheapest adoption, and why it is the best transport to prove the shape on before the lease-based ones.
Work
protected override bool supportsNativeAck => true; on RedisStreamEndpoint.
Mode-default tuning: the read batch size is the prefetch equivalent here. It must cover every lane that can be busy at once — partition slots when group-partitioned, otherwise MaxDegreeOfParallelism. See RabbitMqQueue.PreFetchCount's NativeAck arm for the shape.
Confirm DeleteOnAck behaves sanely under out-of-order settlement.
Adopter issue from the #3715 triage. Cheapest of the six adopters — start here.
Why Redis Streams qualifies
Verified against
RedisStreamListener.CompleteAsync(src/Transports/Redis/Wolverine.Redis/Internal/RedisStreamListener.cs:224): the ack isStreamAcknowledgeAsync(streamKey, consumerGroup, entryId), keyed off an entry id carried in a header on the envelope itself. That is exactly the propertyEndpointMode.NativeAckneeds — the delivery identity travels with the envelope, so it can be settled out of order from an arbitrary worker thread after the handler finishes.Redis has no lease clock. The pending-entries list plus
XAUTOCLAIMis the redelivery mechanism, so unlike SQS/ASB/Pub/Sub/NATS there is nothing to renew while an envelope waits in a partition lane. That is what makes this the cheapest adoption, and why it is the best transport to prove the shape on before the lease-based ones.Work
protected override bool supportsNativeAck => true;onRedisStreamEndpoint.MaxDegreeOfParallelism. SeeRabbitMqQueue.PreFetchCount's NativeAck arm for the shape.DeleteOnAckbehaves sanely under out-of-order settlement.Acceptance
Wolverine.RabbitMQ.Tests/native_ack_mode.cs, in particular the redelivery-after-a-dead-node case.Parent: #3715. Mode: #3708.