>From my knowledge, when a client does negative ack, after a certain amount
of time, it sends the following command to the broker containing the
negatively acked messages ids:

message CommandRedeliverUnacknowledgedMessages {
    required uint64 consumer_id = 1;
    repeated MessageIdData message_ids = 2;
    optional uint64 consumer_epoch = 3;
}


On Tue, Jan 17, 2023 at 5:24 AM Nitin Goyal <nitin.goyal....@gmail.com>
wrote:

> Hello all,
>
> I have a few questions.
>
> 1. When a message is NACKed does it still send the commands to the broker?
> 2. Do we have any plan to replace the ReconsumeLater function with NACK
> Backoff interface in future?
>
>
> On Tue, Jan 10, 2023 at 7:17 PM Nitin Goyal <nitin.goyal....@gmail.com>
> wrote:
>
> > Hello Team,
> >
> > Thanks for pointing these things out.
> >
> > First thing is to consider that this addon feature is for the message
> > which needs to go to DLQ after a retryLater reaches the maximum limit of
> > consumer level retries. It allows an additional maximum limit if a
> message
> > has one at the time of producing.
> >
> > There are two types of retry in current architecture which consumers can
> > go with.
> >
> > 1. Process later with an NACK backoff policy: In this case if someone
> > wants to retry and wants to set a maximum retry at message processor
> level.
> > They can get the number of times the message has been retried so far
> > by calling the `reconsumeTimes` function. they will match the number with
> > their custom retry. Now there are two things that will happen. Either
> they
> > will call ACK that particular message or they have to call the
> > `reconsumeLater` function based on system requirement. If they call ACK
> > then the message is marked as delete in the ledger. And other cases would
> > be explained in point 2.
> >
> > 2. By calling reconsumeLater: In some real cases if someone is calling
> > reconsumeLater with a delay like they want to process a message again but
> > after a particular time. so the new message gets created in the consumer
> > RETRY topic which was again processed by the consumer (they may call the
> > reconsumeLater again if the system requires based on use cases.). Now if
> > the message reaches its retry limit which was configured at consumer
> level
> > they will be sent to the DLQ message.
> >
> > So my proposal will not make any changes to 1st scenario which is to use
> > NACK backoff for retrying the message and process. Consumers can use the
> > same mechanism as they are doing now.
> >
> > It adds an additional feature to pulsar in which if a producer knows how
> > many times an event should be processed a max apart from the consumer max
> > retry and send to DLQ if reaches its limit. Then the above change will
> > check if the limit is reached for reconsume later then it will send to
> DLQ
> > even if the consumer has higher reconsme later retry limit.
> >
> > if producers do not pass the max retry limit it will obey the consumer
> > retry limit.
> >
> > Also in this PIP we are not removing the consumer own retry limit it
> would
> > be there. but get overridden by message limit if passed by the producer.
> if
> > a consumer wants to re-override that limit ( temporarily change in the
> > retry limit) which also can be achieved by sending a new max retry as
> > custom property to the `reconsumeLater` function.
> >
> > So let me rephrase the subject for this pip is to `*MAX RECONSUME TIMES
> > per Message*`.
> >
> > Michael's point about adding relation between producer and consumer?
> >
> > Yeah, It added a relation b/w them but it would be loose coupling.
> Because
> > producers can send the max retry limit in a message which can be
> overridden
> > by the consumer if needed. so consumers do not have to obey the limit if
> > needed.
> >
> > Why I prefer message properties over `MessageMetadata` is because if a
> > consumer wants to override the max limit (temporarily or permanent) then
> it
> > would be difficult to update if required.
> >
> > I hope the above content answers most of the doubts about this PIP.
> >
> > On Tue, Jan 10, 2023 at 5:59 PM r...@apache.org <ranxiaolong...@gmail.com
> >
> > wrote:
> >
> >> Thanks for submitting this PIP, Nitin Goyal.
> >>
> >> Seeing that you have submitted a related pull request in the Go SDK
> >> community, I am sorry that I made the request changes first.
> >>
> >> For the retry processing of a single message, the methods currently
> >> provided are:
> >>
> >> -ReconsumeLater
> >> -Nack
> >>
> >> In actual usage scenarios, it may be a more elegant way to retry if we
> >> verify Nack multiple times. The current implementation of ReconsumeLater
> >> relies on delayed messages. This is not an elegant way, and there is no
> >> way
> >> to record the number of retries.
> >>
> >> In order to support backoff retries, we introduced the NackBackoff
> >> strategy, which itself is an interface and exposed to users. Based on
> this
> >> interface, we can do more customized things. If the NackBackoff
> interface
> >> can't meet our current needs, I prefer that we implement more parameters
> >> in
> >> the NackBackoff strategy instead of continuing to add new functional
> logic
> >> in ReconsumeLater.
> >>
> >> --
> >> Thanks
> >> Xiaolong Ran
> >>
> >> Enrico Olivelli <eolive...@gmail.com> 于2023年1月10日周二 16:23写道:
> >>
> >> > I think that Michael's point is very important.
> >> >
> >> > Producers and Consumers are decoupled and this PIP would introduce
> >> > a new concept.
> >> > Also the same Message can be consumed using multiple subscriptions
> >> > (typically Applications)
> >> > and all the applications will process the message in a different way
> >> > (by definition).
> >> >
> >> > Isn't it possible to implement what you want with an Interceptor or
> >> > with some custom handling for the DLQ ?
> >> > The DLQ (currently) in Pulsar is mostly a client-side feature.
> >> > The producer can tag the messages with a message property and the
> >> > client can decide what to do
> >> > and how many times to retry the message or give up.
> >> >
> >> > Enrico
> >> >
> >> > Il giorno mar 10 gen 2023 alle ore 01:00 Michael Marshall
> >> > <mmarsh...@apache.org> ha scritto:
> >> > >
> >> > > Thanks for submitting this PIP, Nitin Goyal.
> >> > >
> >> > > At the heart of this PIP is an assumption about the relationship
> >> > > between producers and consumers. The PIP assumes a producer knows
> how
> >> > > many times a consumer should attempt to consume a message before
> >> > > giving up and sending it to the DLQ. Does anyone have strong
> opinions
> >> > > on the boundaries between producers and consumers in relation to
> this
> >> > > PIP?
> >> > >
> >> > > This PIP expands the relationship between producer and consumer by
> >> > > letting the producer tell the consumer's pulsar client when to send
> a
> >> > > message to the DLQ, and as such, we should be very intentional about
> >> > > accepting this PIP.
> >> > >
> >> > > Because a user can easily implement this feature on their own and
> >> > > because it tightly couples producers and consumers, I think we
> should
> >> > > not move forward with this PIP. I am open to discussion, though.
> >> > >
> >> > > > for instance in case of major system failure you don't want to
> lose
> >> > > > all your messages.
> >> > >
> >> > > For what it's worth, the retry letter topic feature, which this PIP
> >> > > relies on, sends all messages to the DLQ, so this feature does not
> >> > > introduce conditions for message loss.
> >> > >
> >> > > As an aside, if we move forward with this feature, we need to make
> >> > > sure that the protocol documentation is updated and we should
> consider
> >> > > putting this field in the `MessageMetadata` protobuf object, not in
> a
> >> > > properties map.
> >> > >
> >> > > Thanks,
> >> > > Michael
> >> > >
> >> > >
> >> > >
> >> > > On Mon, Jan 9, 2023 at 9:47 AM Nitin Goyal <
> nitin.goyal....@gmail.com
> >> >
> >> > wrote:
> >> > > >
> >> > > > Hello Enrico,
> >> > > >
> >> > > > For your concern about temporarily increasing of retry. It can be
> >> > achieved
> >> > > > using overriding msg property while calling reconsuming later with
> >> > custom
> >> > > > properties..
> >> > > >
> >> > > > About msg immutable as per current design if consumer call
> >> > reconsumeLater
> >> > > > function it creates a new msg in the system adding few properties
> >> to it
> >> > > > like how many times it get consumed. That also allow other custom
> >> > > > properties to be added in newly generated msg.. so if msg needs
> >> > temporary
> >> > > > high retry or change in retry count on msg they can override it
> >> using
> >> > > > custom properties…
> >> > > >
> >> > > > Thanks
> >> > > > Nitin Goyal
> >> > > >
> >> > > >
> >> > > > On Mon, 9 Jan 2023 at 1:11 PM, Enrico Olivelli <
> eolive...@gmail.com
> >> >
> >> > wrote:
> >> > > >
> >> > > > > I don't think that this is a good idea.
> >> > > > >
> >> > > > > Because IIUC we want to add a property per message that sets the
> >> > > > > maximum time of retries.
> >> > > > >
> >> > > > > Unfortunately in a real system sometimes you have to change the
> >> > number
> >> > > > > of retries temporarily,
> >> > > > > for instance in case of major system failure you don't want to
> >> lose
> >> > > > > all your messages.
> >> > > > >
> >> > > > > If we allow you to set a property on a message then you won't be
> >> able
> >> > > > > to change it because the message is immutable.
> >> > > > >
> >> > > > > TTL (time to live) is a similar concept but it is related to the
> >> > > > > concept of "physical time", if you have message that represents
> >> > > > > a task to be executed within a given deadline then it makes
> sense
> >> to
> >> > > > > state it in the message metadata.
> >> > > > >
> >> > > > > But the "number of retries" depends on how you deal with the
> >> retries:
> >> > > > > - how much time do you wait ?
> >> > > > > - how often do you have a temporary failure to retry ?
> >> > > > >
> >> > > > > It would make more sense to have a QOS (quality of service)
> >> attribute
> >> > > > > on the message, like "important/"non-important"/"foo"/"bar"
> >> > > > > and have a way for the brokers and the clients to handle that. I
> >> am
> >> > > > > pretty sure that with interceptors you can already do something.
> >> > > > >
> >> > > > >
> >> > > > > I am against hard coding the behaviour described in the PIP
> (and I
> >> > > > > voted -1 in the VOTE thread)
> >> > > > >
> >> > > > > Enrico
> >> > > > >
> >> > > > > Il giorno ven 6 gen 2023 alle ore 09:11 Zike Yang <
> >> z...@apache.org>
> >> > ha
> >> > > > > scritto:
> >> > > > > >
> >> > > > > > Hi,
> >> > > > > >
> >> > > > > > This looks good to me.
> >> > > > > > +1
> >> > > > > >
> >> > > > > > I was thinking if we could add a new API for `reconsumeLater`
> to
> >> > let
> >> > > > > > users set the max retry times easily. But I saw that there are
> >> too
> >> > > > > > many reconsumeLater API and this will make the consumer more
> >> > complex.
> >> > > > > >
> >> > > > > > Thanks,
> >> > > > > > Zike Yang
> >> > > > > >
> >> > > > > >
> >> > > > > > On Thu, Jan 5, 2023 at 3:58 PM Zixuan Liu <node...@gmail.com>
> >> > wrote:
> >> > > > > > >
> >> > > > > > > +1
> >> > > > > > >
> >> > > > > > > Thanks,
> >> > > > > > > Zixuan
> >> > > > > > >
> >> > > > > > > Nitin Goyal <nitin.goyal....@gmail.com> 于2023年1月5日周四
> 13:50写道:
> >> > > > > > >
> >> > > > > > > > Hi all,
> >> > > > > > > >
> >> > > > > > > > I made a PIP to discuss:
> >> > > > > https://github.com/apache/pulsar/issues/19136
> >> > > > > > > >
> >> > > > > > > > Thanks,
> >> > > > > > > > Nitin Goyal
> >> > > > > > > >
> >> > > > >
> >> > > > --
> >> > > > Regards
> >> > > > Nitin Goyal
> >> >
> >>
> >
> >
> > --
> > Regards
> > Nitin Goyal
> >
>
>
> --
> Regards
> Nitin Goyal
>

Reply via email to