+1


On Tue, Jan 25, 2022 at 8:28 PM mattison chao <mattisonc...@gmail.com>
wrote:

> +1 (non-binding)
>
> > On Jan 25, 2022, at 5:34 PM, Zike Yang <zky...@streamnative.io.INVALID>
> wrote:
> >
> > Hi Pulsar Community,
> >
> > This is the voting thread for PIP-124. It will stay open for at least
> > 48 hours. Pasted below for quoting convenience.
> >
> > Here is the issue for this PIP:
> https://github.com/apache/pulsar/issues/13408
> >
> > ----
> >
> > ## 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 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. If
> > `allowAutoSubscriptionCreation` in `broker.conf` is false, the initial
> > subscription won't be created automatically. Otherwise, it will
> > confuse the user. Users can explicitly create that subscription to
> > handle this case.
> >
> > This PIP needs to be compatible with the previous behavior. The
> > initial subscription name in the DeadLetterPolicy is optional. The
> > default behavior is not to create the initial subscription which is
> > consistent with the original behavior.
> >
> > ## API Changes
> >
> > * Add `initSubscriptionName` to the `DeadLetterPolicy`
> >
> > ```java
> > /**
> > * Name of the initial subscription name of the dead letter topic.
> > * If this field is not set, the initial subscription will not be created.
> > */
> > private String initSubscriptionName;
> > ```
> >
> > * Add a new field to the `CommandProducer`. The broker will use this
> > field to create the initial subscription.
> >
> > ```proto
> > optional string initial_subscription_name
> > ```
> >
> > * Add a new config to the Producer Configuration. This allows the
> > consumer to specify the initial subscription when creating the
> > deadLetterProducer.
> >
> > ```java
> > /**
> > * Use this config to automatically create an initial subscription
> > when creating the topic.
> > * If this field is not set, the initial subscription will not be created.
> > *
> > * @param initialSubscriptionName
> > *              Name of the initial subscription of the topic.
> > * @return the producer builder instance
> > */
> > ProducerBuilder<T> initialSubscriptionName(String
> initialSubscriptionName);
> > ```
> >
> >
> > ## Implementation
> >
> > When the deadLetterProducer is initialized, the consumer will set the
> > initial subscription of the deadLetterProducer according to the
> > DeadLetterPolicy.
> >
> > When the broker creates a producer(after receiving the
> > CommandProducer), if it finds that the topic does not exist, it will
> > not only create the topic(if the topic automatically creation is
> > enabled) but also create the initial subscription(if the initial
> > subscription name is set). When creating an initial subscription, the
> > user needs to have the `canConsume` permission and the
> > `allowAutoSubscriptionCreation` needs to be enabled.
> >
> > ## Reject Alternatives
> >
> > ### Create the initial subscription using the consumer
> >
> > 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.
> >
> > This is the original solution for this PIP. But this introduces too
> > much workload for the client. In the subsequent discussion, we try to
> > add a new command `CommandCreateSubscription` to avoid creating and
> > closing the deadLetterConsumer, but again, this introduces workload as
> > well as greater complexity.
> >
> > ### Use the retention policy to retent the data of the DLQ
> >
> > Before creating the deadLetterProducer,  an admin can create a
> > retention policy for the topic or namespace. Then, consumers of the
> > topic have the duration of the retention policy to discover the topic
> > and create a subscription before messages are lost.
> >
> > But users are not easy to set a different data retention policy or
> > create a new subscription for a lazy created DLQ topic.
> >
> > ### Add a new policy to retain data when the topic has no subscriptions
> >
> > Adding a new policy for pulsar topics: a namespace or a topic level
> > policy that makes it possible to retain messages indefinitely when a
> > topic has no subscriptions.
> >
> > For the auto-created topic, the subscription can only be determined at
> > the time of creation. It may or may not create. If users are able to
> > determine which consumers are, and these consumers need to receive any
> > message sent by the producer, they should create the topic and
> > subscription manually or use the consumer to trigger the topic
> > auto-creation, not the producer.
> >
> > ### Add the initial subscription name field to the metadata of the
> > CommandProducer
> >
> > Use producer metadata to carry the init subscription name so that we
> > don't need to introduce a new field in CommandProducer, and the new
> > field looks a little confusing.
> >
> > While this does not change protobuf, it still implicitly changes the
> > protocol. This solution has different advantages and disadvantages
> > than the current one. Finally, we decided to go with the current
> > solution.
> >
> > In addition, there is a discussion about whether we need to create the
> > initial subscription on the retryLetterTopic. The consumer has already
> > subscribed to the retryLetterTopic and created the subscription before
> > creating the retryLetterProducer, so we don't need to create the
> > initial subscription for it.
> >
> >
> >
> > Prototype implementation PR: https://github.com/apache/pulsar/pull/13355
> >
> > ----
> >
> > Thanks
> > Zike Yang
>
>

Reply via email to