+1 (binding) Regards, Penghui
On Wed, Jan 26, 2022 at 12:17 PM Michael Marshall <mmarsh...@apache.org> wrote: > +1 (non binding) - this proposal looks great! Thank you for a good > discussion of this feature! > > Thanks, > Michael > > On Tue, Jan 25, 2022 at 8:20 PM Hang Chen <chenh...@apache.org> wrote: > > > > +1 (binding) > > > > Thanks, > > Hang > > > > Jia Zhai <zhai...@apache.org> 于2022年1月26日周三 10:17写道: > > > > > > +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 > > > > > > > > >