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).


Reply via email to