> I think there is an issue with the current behavior. When the init
> subscription
> is not created before creating deadLetterProducer, it may result in the
> loss of messages.
> And this is not the expected behavior.

I'm not sure I agree with this assertion. The default in Pulsar is
that a topic does not retain messages until there is a subscription,
and because topic creation does not (currently) imply subscription
creation, auto topic creation can lead to message loss.

I do agree though that it would be helpful to try to remove the risk
posed by auto topic creation.

> I think we can create a consumer with the DLQ init subscription and then
> close the consumer?

This is the current design proposed by this PIP. As I mentioned
earlier, I do not think we should take this approach.

I think the underlying feature request is to make it possible to auto
create a subscription when a topic is auto created. This feature seems
similar to `force_topic_creation`, which is already a field on the
`CommandSubscribe` command. It is documented here [0]:

 >   // If true, the subscribe operation will cause a topic to be
 >   // created if it does not exist already (and if topic auto-creation
 >   // is allowed by broker.
 >   // If false, the subscribe operation will fail if the topic
 >   // does not exist.
 >   optional bool force_topic_creation = 15 [default = true];

What if we extended the `CommandProducer` command to add a
`create_subscription` field? Then, any time a topic is auto
created and this field is true, the broker would auto create a
subscription. There are some details to work out, but I think this
feature would fulfill the needs of this PIP and would also be broadly
useful for many client applications that dynamically create topics.

Thanks,
Michael

[0] 
https://github.com/apache/pulsar/blob/6657a6c2fb23be579e74bac7c7c07a70cabfb4b2/pulsar-common/src/main/proto/PulsarApi.proto#L373-L378




On Wed, Dec 22, 2021 at 5:32 AM PengHui Li <peng...@apache.org> wrote:
>
> I think we can create a consumer with the DLQ init subscription and then
> close the consumer?
> This will make the implementation easier.
>
> Penghui
>
> On Wed, Dec 22, 2021 at 4:49 PM Zike Yang <zky...@streamnative.io.invalid>
> wrote:
>
> > > We can avoid confusion by only attempting to create the subscription
> > > when `initSubscriptionName` is not `null`. As a result, this PIP
> > > wouldn't change the behavior for current implementations.
> > I think there is an issue with the current behavior. When the init
> > subscription
> > is not created before creating deadLetterProducer, it may result in the
> > loss of messages.
> > And this is not the expected behavior. So the purpose of this PIP is to fix
> > this issue.
> > IMO, we need to create that subscription by default to fix the current
> > behavior.
> >
> > > +1 - I think we should expand the binary protocol to add a
> > > `CommandSubscription` or possibly `CommandCreateSubscription`
> > > (`CommandSubscribe` is already taken). Without a new command, we will
> > > introduce race conditions related to consumer creation and will
> > > definitely generate unnecessary errors.
> > +1. `CommandCreateSubscription` seems more reasonable.
> >
> > > Regarding default authorization, this new command would require the
> > > same level of permission for the client since the act of creating a
> > > consumer and the act of creating a subscription both require the same
> > > `AuthAction` permission: Consume.
> > +1
> >
> > Thanks,
> > Zike Yang
> >
> > On Wed, Dec 22, 2021 at 2:40 AM Michael Marshall <mmarsh...@apache.org>
> > wrote:
> > >
> > > > IMO, we won't create the init subscription if
> > `allowAutoSubscriptionCreation`
> > > > is false. Otherwise, it will confuse the user. Users can explicitly
> > create that
> > > > subscription to handle this case.
> > >
> > > That is a good point, but I don't think we should attempt to create
> > > the subscription implicitly via consumer creation because that will
> > > lead to additional failure, which adds unnecessary load on the broker.
> > >
> > > We can avoid confusion by only attempting to create the subscription
> > > when `initSubscriptionName` is not `null`. As a result, this PIP
> > > wouldn't change the behavior for current implementations.
> > >
> > > > Do you mean to create a private method called `createSubscription` in
> > > > the non-admin client? But we don't have a protocol command for
> > > > creating subscription
> > >
> > > Yes, that was what I meant, and you're right, we don't have a protocol
> > > command for this case.
> > >
> > > > Or the other way is to create a new command `CommandSubscription` in
> > > > the protocol to handle this.
> > >
> > > +1 - I think we should expand the binary protocol to add a
> > > `CommandSubscription` or possibly `CommandCreateSubscription`
> > > (`CommandSubscribe` is already taken). Without a new command, we will
> > > introduce race conditions related to consumer creation and will
> > > definitely generate unnecessary errors.
> > >
> > > Regarding default authorization, this new command would require the
> > > same level of permission for the client since the act of creating a
> > > consumer and the act of creating a subscription both require the same
> > > `AuthAction` permission: Consume.
> > >
> > > Thanks,
> > > Michael
> > >
> > > On Tue, Dec 21, 2021 at 4:57 AM Zike Yang
> > >
> > > <zky...@streamnative.io.invalid> wrote:
> > > >
> > > > Thanks for your review Michael.
> > > >
> > > > On Tue, Dec 21, 2021 at 5:48 AM Michael Marshall <mmarsh...@apache.org
> > >
> > wrote:
> > > > >
> > > > > Thanks for creating this PIP Zike Yang. This sounds like an important
> > > > > improvement. I have a couple thoughts.
> > > > >
> > > > > 1. Does the `retryLetterTopic` have the same problem with immediate
> > > > > message expiration? Based on a quick glance, I don't see anything
> > > > > creating a subscription for the retry topic.
> > > > >
> > > > Yes. I think we also need to handle the retryLetterTopic. I will update
> > the PIP.
> > > >
> > > > > 2. Your prototype exposes a lacking in our existing client
> > > > > implementation: the non-admin client cannot directly create
> > > > > subscriptions. IIUC, this implementation does not work if
> > > > > `allowAutoSubscriptionCreation` is false.
> > > > IMO, we won't create the init subscription if
> > `allowAutoSubscriptionCreation`
> > > >  is false. Otherwise, it will confuse the user. Users can explicitly
> > create that
> > > > subscription to handle this case.
> > > >
> > > > > Further, it is inefficient
> > > > > to create and immediately close a consumer just to create a
> > > > > subscription. Perhaps we should just update the non-admin client so
> > > > > that it can create subscriptions? It could be private so that we
> > don't
> > > > > create confusion with the non-admin and the admin clients.
> > > > Do you mean to create a private method called `createSubscription` in
> > > > the non-admin client? But we don't have a protocol command for
> > > > creating subscription.
> > > > So in that method, we can send the `CommandSubscribe` and
> > `CommandUnsubscribe`
> > > > to the broker to simulate the creation and closure of a consumer. But
> > > > I think it is not
> > > > straightforward to create a subscription using two commands.
> > > > Or the other way is to create a new command `CommandSubscription` in
> > > > the protocol
> > > > to handle this. But I wonder if there are more use cases for this
> > > > command that would
> > > > make it worthwhile to use this solution.
> > > > What do you think about these two ways?
> > > >
> > > > >
> > > > > Thanks,
> > > > > Michael
> > > > >
> > > > >
> > > > > On Mon, Dec 20, 2021 at 4:18 AM Zike Yang
> > > > > <zky...@streamnative.io.invalid> wrote:
> > > > > >
> > > > > > https://github.com/apache/pulsar/issues/13408
> > > > > >
> > > > > > Pasted below for quoting convenience.
> > > > > >
> > > > > > ——
> > > > > >
> > > > > >
> > > > > > ## Motivation
> > > > > >
> > > > > > If we enable the DLQ when consuming messages. For some messages
> > that can't be processed successfully, the messages will be moved to the
> > DLQ, but if we do not specify the data retention for the namespace or
> > create a subscription for the DLQ to retain the data, the data of the DLQ
> > topic will be removed automatically. Therefore, we need to create the
> > initial subscription before sending messages to the DLQ.
> > > > > >
> > > > > > ## Goal
> > > > > >
> > > > > > Users can set the initial subscription name in the
> > DeadLetterPolicy. The consumer will create the initial subscription before
> > sending messages to the DLQ. At this point, subsequent messages produced to
> > the DLQ are not automatically deleted unexpectedly.
> > > > > >
> > > > > > This PIP needs to be compatible with the previous behavior. The
> > initial subscription name in the DeadLetterPolicy is optional. Default
> > value is the subscription name of the consumer.
> > > > > >
> > > > > > ## API Changes
> > > > > >
> > > > > > Add `initSubscriptionName` to the `DeadLetterPolicy`
> > > > > >
> > > > > > ```java
> > > > > > /**
> > > > > >  * Name of the initial subscription name of the dead letter topic.
> > > > > >  * The default value is the subscription name of the consumer.
> > > > > >  */
> > > > > > private String initSubscriptionName;
> > > > > > ```
> > > > > >
> > > > > > ## Implementation
> > > > > >
> > > > > > Before the deadLetterProducer is initialized, the consumer first
> > tries to create a deadLetterConsumer using the initial subscription name in
> > the DeadLetterPolicy. When this subscription already exists, the
> > ConsumerBusy exception will occur. In this case, we can ignore that
> > exception and create the deadLetterProducer.
> > > > > >
> > > > > > Prototype implementation PR:
> > https://github.com/apache/pulsar/pull/13355
> > > > > >
> > > > > >
> > > > > >
> > > > > > Thanks,
> > > > > > Zike Yang
> > > > > >
> > > >
> > > >
> > > >
> > > > Best regards,
> > > > Zike Yang
> >

Reply via email to