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. Carries a correctness trap — read before starting.
The trap
The #3715 starting analysis called Pulsar "straightforward" because individual acks are supported. Verification says otherwise: PulsarListener.CompleteAsync (src/Transports/Pulsar/Wolverine.Pulsar/PulsarListener.cs:278) does not ack directly — it delegates to _ackHandler.CompleteAsync(...), and the ack strategy is configurable per #3180, including cumulative.
A cumulative ack is precisely the defect that disqualifies Kafka. Under EndpointMode.NativeAck the execution block completes messages in handler-completion order, not delivery order, so a cumulative ack of a later message would silently settle every earlier in-flight delivery — turning the mode's no-loss guarantee into silent loss. This is the same hazard #3706 fixed for RabbitMQ by making every ack multiple: false.
Note the retry-consumer path already acks individually unconditionally; it is the primary consumer's configurable strategy that is the problem.
Work
Decide and implement one of: force individual acks for a NativeAck endpoint regardless of the configured strategy, or reject the NativeAck + cumulative-ack combination at configuration time with a message naming both settings. Do not let the combination be configurable-and-silently-wrong — that is the exact failure Validate or warn on silently-ignored listener configuration combos (Inline + partitioning/parallelism) #3712 exists to prevent.
supportsNativeAck => true on the Pulsar endpoint once (1) is in place.
Mode-default tuning: receiver queue size as the prefetch equivalent, covering every lane that can be busy at once.
Check UseNativeRedelivery / negative-ack backoff interacts sanely with lane-based retry.
Flip this transport's line in the release-gate test; update the transport docs page.
Acceptance
A test proving a cumulative-ack configuration cannot silently coexist with NativeAck.
Adopter issue from the #3715 triage. Carries a correctness trap — read before starting.
The trap
The #3715 starting analysis called Pulsar "straightforward" because individual acks are supported. Verification says otherwise:
PulsarListener.CompleteAsync(src/Transports/Pulsar/Wolverine.Pulsar/PulsarListener.cs:278) does not ack directly — it delegates to_ackHandler.CompleteAsync(...), and the ack strategy is configurable per #3180, including cumulative.A cumulative ack is precisely the defect that disqualifies Kafka. Under
EndpointMode.NativeAckthe execution block completes messages in handler-completion order, not delivery order, so a cumulative ack of a later message would silently settle every earlier in-flight delivery — turning the mode's no-loss guarantee into silent loss. This is the same hazard #3706 fixed for RabbitMQ by making every ackmultiple: false.Note the retry-consumer path already acks individually unconditionally; it is the primary consumer's configurable strategy that is the problem.
Work
supportsNativeAck => trueon the Pulsar endpoint once (1) is in place.UseNativeRedelivery/ negative-ack backoff interacts sanely with lane-based retry.Acceptance
Parent: #3715. Mode: #3708.