> Ok. I would add in the Compatability change another section with bold or > capital letters to highlight you're creating a breaking change. It should > be reflected in the release notes somehow - don't know the process for that.
Ok, I added to `Incompatible case`. PTAL. Thanks, Baodi Shi > 2022年6月2日 18:0404,Asaf Mesika <asaf.mes...@gmail.com> 写道: > >> >> I tend to fail. Although this breaks the current logic. but the current >> implementation can be considered is a bug. > > Ok. I would add in the Compatability change another section with bold or > capital letters to highlight you're creating a breaking change. It should > be reflected in the release notes somehow - don't know the process for that. > > On Tue, May 31, 2022 at 7:16 PM 石宝迪 <wudixiaolong...@icloud.com.invalid> > wrote: > >>>> If you fail to start the function, you immediately break people's >>> functions when they upgrade to this version. How about notifying them >> once >>> via logger (WARN)? >> >> >> I tend to fail. Although this breaks the current logic. but the current >> implementation can be considered is a bug. >> >>> It will flood their logs if they used it wrong. Maybe write to log once? >> >> >> Agree, I changed PIP. >> >> Thanks, >> Baodi Shi >> >>> 2022年5月31日 23:5720,Asaf Mesika <asaf.mes...@gmail.com> 写道: >>> >>> Hi Baodi, >>> >>> Regarding >>> >>>> >>>> 1. When the delivery semantic is ATMOST_ONCE, add verify autoAck must >>>> be true. If the validation fails, let the function fail to start (This >>>> temporarily resolves the configuration ambiguity). When autoAck is >>>> subsequently removed, the message will be acked immediately after >> receiving >>>> the message. >>>> >>>> >>>> If you fail to start the function, you immediately break people's >>> functions when they upgrade to this version. How about notifying them >> once >>> via logger (WARN)? >>> >>> Regarding >>> >>>> >>>> 1. >>>> >>>> >>>> When user call record.ack() in function, just ProcessingGuarantees == >>>> MANUAL can be work. In turn, when ProcessingGuarantees != MANUAL, user >>>> call record.ack() is invalid(print warn log). >>>> >>>> It will flood their logs if they used it wrong. Maybe write to log once? >>> >>> On Tue, May 31, 2022 at 12:24 PM Baozi <wudixiaolong...@icloud.com >> .invalid> >>> wrote: >>> >>>> Hi, Asaf. >>>> >>>> Thanks review. >>>> >>>>>> I'm not entirely sure that is accurate. The Effectively-Once as I >>>>> understand it is achieved using transactions, thus the consumption of >>>> that >>>>> message and production of any messages, as a result, are considered one >>>>> atomic unit - either message acknowledged and messages produced or >>>> neither. >>>> >>>> >>>> Not using transactions now, I understand: EFFECTIVELY_ONCE = >> ATLEAST_ONCE >>>> + Message Deduplication. >>>> >>>> @Neng Lu @Rui Fu Can help make sure? >>>> >>>>>> I would issue a WARN when reading configuring the function (thus >> emitted >>>>> once) when the user actively configured autoAck=false and warn them >> that >>>>> this configuration is deprecated and they should switch to the MANUAL >>>>> ProcessingGuarantee configuration option. >>>> >>>> >>>> Added to API Change(2) >>>> >>>>>> suggest you clarify what existing behavior remains for backward >>>>> compatibility with the appropriate comment that this is deprecated and >>>> will >>>>> be removed. >>>> >>>> Yes, I have rewritten it, please see Implementation(1) >>>> >>>>> 5. Regarding Test Plan >>>>> * I would add: Validate the test of autoAck=false still works (you >>>> haven't >>>>> broken anything) >>>>> * I would add: Validate existing ProcessingGuarantee test for >> AtMostOnce, >>>>> AtLeastOnce, ExactlyOnce still works (when autoAck=true) >>>> >>>> >>>> Nice, I added to PIP. >>>> >>>> >>>> Thanks, >>>> Baodi Shi >>>> >>>>> 2022年5月30日 22:0011,Asaf Mesika <asaf.mes...@gmail.com> 写道: >>>>> >>>>> Thanks for applying the fixes. >>>>> >>>>> 1. Regarding >>>>> >>>>>> >>>>>> - EFFECTIVELY_ONCE: The message is acknowledged *after* the function >>>>>> finished execution. Depends on pulsar deduplication, and provides >>>>>> end-to-end effectively once processing. >>>>>> >>>>>> I'm not entirely sure that is accurate. The Effectively-Once as I >>>>> understand it is achieved using transactions, thus the consumption of >>>> that >>>>> message and production of any messages, as a result, are considered one >>>>> atomic unit - either message acknowledged and messages produced or >>>> neither. >>>>> >>>>> 2. Regarding >>>>> >>>>>> >>>>>> 1. Indication of autoAck is deprecated, and not use it in the code. >>>>>> (and also Function.proto) >>>>>> >>>>>> * I would issue a WARN when reading configuring the function (thus >>>> emitted >>>>> once) when the user actively configured autoAck=false and warn them >> that >>>>> this configuration is deprecated and they should switch to the MANUAL >>>>> ProcessingGuarantee configuration option. >>>>> >>>>> 3. Regarding >>>>> >>>>>> >>>>>> 1. When the delivery semantic is ATMOST_ONCE, the message will be >>>>>> acked immediately after receiving the message, no longer affected by >>>> the >>>>>> autoAck configuration. >>>>>> >>>>>> I suggest you clarify what existing behavior remains for backward >>>>> compatibility with the appropriate comment that this is deprecated and >>>> will >>>>> be removed. >>>>> >>>>> 4. Regarding >>>>> >>>>>> >>>>>> 1. >>>>>> >>>>>> When user call record.ack() in function, just ProcessingGuarantees == >>>>>> MANUAL can be work. In turn, when ProcessingGuarantees != MANUAL, >> user >>>>>> call record.ack() is invalid(print warn log). >>>>>> >>>>>> That might blast WARN messages to the user. Perhaps save the fact that >>>> you >>>>> have printed a WARN message once and only print when the variable is >> not >>>>> set? >>>>> >>>>> 5. Regarding Test Plan >>>>> * I would add: Validate the test of autoAck=false still works (you >>>> haven't >>>>> broken anything) >>>>> * I would add: Validate existing ProcessingGuarantee test for >> AtMostOnce, >>>>> AtLeastOnce, ExactlyOnce still works (when autoAck=true) >>>>> >>>>> >>>>> >>>>> On Mon, May 30, 2022 at 4:09 PM Baozi <wudixiaolong...@icloud.com >>>> .invalid> >>>>> wrote: >>>>> >>>>>> Hi, Mesika. >>>>>> >>>>>> Thanks review. >>>>>> >>>>>>>> 2. I suggest calling it `MANUAL` `ProcessingGuarantee` instead of >>>> NONE. >>>>>> As >>>>>>>> you carefully explained, ProcessingGuarantee comes does to the fact >>>> that >>>>>>>> the function executor calls acknowledge, in specific timing: >>>>>> >>>>>> >>>>>> Added, Refer to the latest pip. >>>>>> https://github.com/apache/pulsar/issues/15560 >>>>>> >>>>>>>> 3. Removing autoAck from Function Config breaks backward >>>> compatibility, >>>>>>>> thus shouldn't this be strongly reflected in the PIP - how does >> Pulsar >>>>>>>> release handle breaking change? >>>>>> >>>>>> As suggested by @neng, They will be marked as deprecated first and >>>> clearly >>>>>> stated in the documentation. Remove it after 2~3 release. >>>>>> >>>>>>>> 4. Regarding Implementation (1), isn't the class itself >>>>>>>> PulsarSinkAtLeastOnceProcessor encodes what to do? I'm not sure I >>>>>>>> understand how you use that enum value *inside* the class/ >>>>>> >>>>>> I changed PIP, add new PulsarSinkManualProcessor. Refer to the latest >>>> PIP >>>>>> API Changes(3) >>>>>> >>>>>> Thanks, >>>>>> Baodi Shi >>>>>> >>>>>>> 2022年5月30日 12:5128,Rui Fu <r...@apache.org> 写道: >>>>>>> >>>>>>> Hi Baodi, >>>>>>> >>>>>>> Nice work. Put some suggestions below, ptal. >>>>>>> >>>>>>> 1. API changes should also contain the changes of `Function.proto`, >>>>>> including new `ProcessingGuarantees` option and `autoAck`. >>>>>>> 2. Please be sure the other language runtimes (like Python, Golang) >> do >>>>>> support similar `record.ack()` function from the context, if no, it >>>> might >>>>>> have some API changes for different runtime we well. >>>>>>> >>>>>>> >>>>>>> Best, >>>>>>> >>>>>>> Rui Fu >>>>>>> 在 2022年5月29日 +0800 22:18,Asaf Mesika <asaf.mes...@gmail.com>,写道: >>>>>>>> 1. "Added NONE delivery semantics and delete autoAck config." >>>>>>>> - Added --> add >>>>>>>> >>>>>>>> 2. I suggest calling it `MANUAL` `ProcessingGuarantee` instead of >>>> NONE. >>>>>> As >>>>>>>> you carefully explained, ProcessingGuarantee comes does to the fact >>>> that >>>>>>>> the function executor calls acknowledge, in specific timing: >>>>>>>> - `AT_MOST_ONCE` - When the message is read by the client, it is >>>>>>>> immediately acknowledged and only then the function is executed, >> thus >>>>>>>> guaranteeing it will not run more than once >>>>>>>> - `AT_LEAST_ONCE` - Message is acknowledged *after* the function >>>>>> finished >>>>>>>> execution, thus it will be run at least once. >>>>>>>> - `MANUAL` - Signals to the user that it is up to them to >> acknowledge >>>>>> the >>>>>>>> message, inside the function. >>>>>>>> >>>>>>>> I think if you couple that change with adding the explanation I >> wrote >>>>>>>> above to the documentation it will become crystal clear (hopefully) >>>>>> what is >>>>>>>> a Processing Guarantee exactly and what each value signifies. >>>>>>>> >>>>>>>> 3. Removing autoAck from Function Config breaks backward >>>> compatibility, >>>>>>>> thus shouldn't this be strongly reflected in the PIP - how does >> Pulsar >>>>>>>> release handle breaking change? >>>>>>>> >>>>>>>> 4. Regarding Implementation (1), isn't the class itself >>>>>>>> PulsarSinkAtLeastOnceProcessor encodes what to do? I'm not sure I >>>>>>>> understand how you use that enum value *inside* the class/ >>>>>>>> >>>>>>>> >>>>>>>> On Fri, May 27, 2022 at 1:08 AM Neng Lu <freen...@gmail.com> wrote: >>>>>>>> >>>>>>>>> Some suggestions: >>>>>>>>> >>>>>>>>> 1. Instead of deleting the `autoAck`, keep it but not use it in the >>>>>> code. >>>>>>>>> And documented clearly it's deprecated for the following 2~3 >> release. >>>>>> And >>>>>>>>> then delete it. >>>>>>>>> 2. For `PulsarSinkAtLeastOnceProcessor` and >>>>>>>>> `PulsarSinkEffectivelyOnceProcessor`, if `NONE` is configured, it >>>>>> defaults >>>>>>>>> to ATLEAST_ONCE. >>>>>>>>> 3. Need to let users know the behavior when they call >> `record.ack()` >>>>>> inside >>>>>>>>> the function implementation. >>>>>>>>> >>>>>>>>> On Thu, May 12, 2022 at 1:52 AM Baozi <wudixiaolong...@icloud.com >>>>>> .invalid> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>>> 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). >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>>> -- >>>>>>>>> Best Regards, >>>>>>>>> Neng >>>>>>>>> >>>>>> >>>>>> >>>> >>>> >> >>