Hi Pulsar community, I open a https://github.com/apache/pulsar/issues/15560 for Function add NONE delivery semantics
Let me know what you think. Thanks, Baodi Shi ## Motivation Currently Function supports three delivery semantics, and also provides autoAck to control whether to automatically ack. Because autoAck affects the delivery semantics of Function, it can be confusing for users to understand the relationship between these two parameters. For example, when the user configures `Guarantees == ATMOST_ONCE` and `autoAck == false`, then the framework will not help the user to ack messages, and the processing semantics may become `ATLEAST_ONCE`. The delivery semantics provided by Function should be clear. When the user sets the guarantees, the framework should ensure point-to-point semantic processing and cannot be affected by other parameters. ## Goal Added `NONE` delivery semantics and delete `autoAck` config. The original intention of `autoAck` semantics is that users want to control the timing of ack by themselves. When autoAck == false, the processing semantics provided by the framework should be invalid. Then we can add `NONE` processing semantics to replace the autoAck == false scenario. When the user configuration `ProcessingGuarantees == NONE`, the framework does not help the user to do any ack operations, and the ack is left to the user to handle. In other cases, the framework guarantees processing semantics. ## API Changes 1. Add `NONE` type to ProcessingGuarantees ``` java public enum ProcessingGuarantees { ATLEAST_ONCE, ATMOST_ONCE, EFFECTIVELY_ONCE, NONE } ``` 2. Delete autoAck config in FunctionConfig ``` java public class FunctionConfig { - private Boolean autoAck; } ``` ## Implementation 1. In `PulsarSinkAtLeastOnceProcessor` and `PulsarSinkEffectivelyOnceProcessor`, when `ProcessingGuarantees != NONE` can be ack. <https://github.com/apache/pulsar/blob/c49a977de4b0b525ec80e5070bc90eddcc7cddad/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/sink/PulsarSink.java#L274-L276> 2. When the delivery semantic is `ATMOST_ONCE`, the message will be acked immediately after receiving the message, no longer affected by the autoAck configuration. https://github.com/apache/pulsar/blob/c49a977de4b0b525ec80e5070bc90eddcc7cddad/pulsar-functions/instance/src/main/java/org/apache/pulsar/functions/instance/JavaInstanceRunnable.java#L271-L276 3. When user call `record.ack()` in function, just `ProcessingGuarantees == NONE` can be work. ## Plan test The main test and assert is that when ProcessingGuarantees == NONE, the function framework will not do any ack operations for the user. ## Compatibility 1. This change will invalidate the user's setting of autoAck, which should be explained in the documentation and provide parameter verification to remind the user. 2. Runtimes of other languages need to maintain consistent processing logic (python, go).