Thanks Colin, I'll open a new discussion thread. It does look like the KIP has been updated with your and Jason's suggestions but not Mathias' which is a different direction (splitting into separate exceptions for "corrupt" records and auto-skipping those).
On Thu, Apr 22, 2021 at 10:30 PM Colin McCabe <cmcc...@apache.org> wrote: > Hi Sarwar, > > It seems like we didn't reach a consensus last time about this KIP. So I > would suggest revising the KIP, and then creating a new DISCUSS thread when > it's ready for review. > > regards, > Colin > > > On Wed, Apr 14, 2021, at 01:26, Sarwar Bhuiyan wrote: > > Forgive me while I find my feet, but since this reached a VOTE stage, is > it > > really required to go through a DISCUSS thread again or can we continue > to > > address the issues on this thread since the issues were raised on this > > thread? If I do have to create a new DISCUSS thread, do I just copy the > > messages from the old thread to it to address them? > > > > Thank you. > > > > Sarwar > > > > On Wed, Apr 14, 2021 at 9:18 AM Stanislav Kozlovski < > stanis...@confluent.io> > > wrote: > > > > > Hey all, > > > > > > To revive this old KIP, Sarwar Bhuiyan has volunteered to take over > > > ownership. > > > He will continue to drive this KIP to approval and completion - I > > > understand that he will re-start the discussion with a new [DISCUSS] or > > > [VOTE] thread. > > > > > > Thank you Sarwar! > > > > > > Best, > > > Stanislav > > > > > > On Fri, Jan 10, 2020 at 5:55 PM Gwen Shapira <g...@confluent.io> > wrote: > > > > > >> Sorry for the super late reply, but since the vote thread showed up, > > >> I've read the KIP and have a concern. > > >> The concern was raised by Matthias Sax earlier, but I didn't see it > > >> addressed. > > >> > > >> Basically the current iteration of the KIP unifies deserialization > > >> errors with corruption. As was pointed out, these are not the same > > >> thing. Corruption means that the message itself (including envelope, > > >> not just the payload) is broken. De-serialization errors mean that > > >> either key or value serializers have a problem. It can even be a > > >> temporary problem of connecting to schema registry, I believe. Corrupt > > >> messages can only be skipped. De-serialization errors can (and > > >> arguably should) be retried with a different serializer. Something > > >> like Connect will need to skip corrupt messages, but messages with > > >> SerDe issues should probably go into a dead-letter queue. > > >> > > >> Anyway, IMO we need exceptions that will let us tell the difference. > > >> > > >> Gwen > > >> > > >> On Fri, Oct 11, 2019 at 10:05 AM Stanislav Kozlovski > > >> <stanis...@confluent.io> wrote: > > >> > > > >> > Thanks Jason. I've edited the KIP with the latest proposal. > > >> > > > >> > On Thu, Oct 10, 2019 at 2:00 AM Jason Gustafson <ja...@confluent.io > > > > >> wrote: > > >> > > > >> > > Hi Stanislav, > > >> > > > > >> > > Sorry for the late comment. I'm happy with the current proposal. > Just > > >> one > > >> > > small request is to include an example which shows how a user > could > > >> use > > >> > > this to skip over a record. > > >> > > > > >> > > I'd suggest pushing this to a vote to see if anyone else has > feedback. > > >> > > > > >> > > Thanks, > > >> > > Jason > > >> > > > > >> > > On Sat, Jul 13, 2019 at 2:27 PM Stanislav Kozlovski < > > >> > > stanis...@confluent.io> > > >> > > wrote: > > >> > > > > >> > > > Hello, > > >> > > > > > >> > > > Could we restart the discussion here again? > > >> > > > > > >> > > > My last message was sent on the 3rd of June but I haven't > received > > >> > > replies > > >> > > > since then. > > >> > > > > > >> > > > I'd like to get this KIP to a finished state, regardless of > whether > > >> that > > >> > > is > > >> > > > merged-in or discarded. It has been almost one year since the > > >> publication > > >> > > > of the KIP. > > >> > > > > > >> > > > Thanks, > > >> > > > Stanislav > > >> > > > > > >> > > > On Mon, Jun 3, 2019 at 11:19 AM Stanislav Kozlovski < > > >> > > > stanis...@confluent.io> > > >> > > > wrote: > > >> > > > > > >> > > > > Do people agree with the approach I outlined in my last reply? > > >> > > > > > > >> > > > > On Mon, May 6, 2019 at 2:12 PM Stanislav Kozlovski < > > >> > > > stanis...@confluent.io> > > >> > > > > wrote: > > >> > > > > > > >> > > > >> Hey there Kamal, > > >> > > > >> > > >> > > > >> I'm sincerely sorry for missing your earlier message. As I > open > > >> this > > >> > > > >> thread up, I see I have an unsent draft message about > resuming > > >> > > > discussion > > >> > > > >> from some time ago. > > >> > > > >> > > >> > > > >> In retrospect, I think I may have been too pedantic with the > > >> exception > > >> > > > >> naming and hierarchy. > > >> > > > >> I now believe a single exception type of > > >> > > > `RecordDeserializationException` > > >> > > > >> is enough. Let's go with that. > > >> > > > >> > > >> > > > >> On Mon, May 6, 2019 at 6:40 AM Kamal Chandraprakash < > > >> > > > >> kamal.chandraprak...@gmail.com> wrote: > > >> > > > >> > > >> > > > >>> Matthias, > > >> > > > >>> > > >> > > > >>> We already have CorruptRecordException which doesn't extend > the > > >> > > > >>> SerializationException. So, we need an alternate > > >> > > > >>> name suggestion for the corrupted record error if we decide > to > > >> extend > > >> > > > the > > >> > > > >>> FaultyRecordException class. > > >> > > > >>> > > >> > > > >>> Stanislav, > > >> > > > >>> > > >> > > > >>> Our users are also facing this error. Could we bump up this > > >> > > discussion? > > >> > > > >>> > > >> > > > >>> I think we can have a single exception type > > >> > > > >>> FaultyRecordException/RecordDeserialization exception to > > >> capture both > > >> > > > >>> the errors. We can add an additional enum field to > > >> differentiate the > > >> > > > >>> errors > > >> > > > >>> if required. > > >> > > > >>> > > >> > > > >>> Thanks, > > >> > > > >>> Kamal Chandraprakash > > >> > > > >>> > > >> > > > >>> On Wed, Apr 24, 2019 at 1:49 PM Kamal Chandraprakash < > > >> > > > >>> kamal.chandraprak...@gmail.com> wrote: > > >> > > > >>> > > >> > > > >>> > Stanislav, > > >> > > > >>> > > > >> > > > >>> > Any updates on this KIP? We have internal users who want > to > > >> skip > > >> > > the > > >> > > > >>> > corrupted message while consuming the records. > > >> > > > >>> > > > >> > > > >>> > > > >> > > > >>> > On Fri, Oct 19, 2018 at 11:34 PM Matthias J. Sax < > > >> > > > >>> matth...@confluent.io> > > >> > > > >>> > wrote: > > >> > > > >>> > > > >> > > > >>> >> I am not 100% familiar with the details of the consumer > code, > > >> > > > however > > >> > > > >>> I > > >> > > > >>> >> tend to disagree with: > > >> > > > >>> >> > > >> > > > >>> >> > There's no difference between the two cases -- if (and > > >> only if) > > >> > > > the > > >> > > > >>> >> message is corrupt, it can't be deserialized. If (and > only > > >> if) it > > >> > > > >>> can't be > > >> > > > >>> >> deserialized, it is corrupt. > > >> > > > >>> >> > > >> > > > >>> >> Assume that a user configures a JSON deserializer but a > > >> faulty > > >> > > > >>> upstream > > >> > > > >>> >> producer writes an Avro message. For this case, the > message > > >> is not > > >> > > > >>> >> corrupted, but still can't be deserialized. And I can > > >> imaging that > > >> > > > >>> users > > >> > > > >>> >> want to handle both cases differently. > > >> > > > >>> >> > > >> > > > >>> >> Thus, I think it makes sense to have two different > exceptions > > >> > > > >>> >> `RecordDeserializationException` and > > >> `CorruptedRecordException` > > >> > > that > > >> > > > >>> can > > >> > > > >>> >> both extend `FaultyRecordException` (don't like this name > > >> too much > > >> > > > >>> >> honestly, but don't have a better idea for it anyway). > > >> > > > >>> >> > > >> > > > >>> >> Side remark. If we introduce class > > >> > > `RecordDeserializationException` > > >> > > > >>> and > > >> > > > >>> >> `CorruptedRecordException`, we can also add an interface > > >> that both > > >> > > > >>> >> implement to return partition/offset information and let > both > > >> > > extend > > >> > > > >>> >> `SerializationException` directly without an intermediate > > >> class in > > >> > > > the > > >> > > > >>> >> exception hierarchy. > > >> > > > >>> >> > > >> > > > >>> >> > > >> > > > >>> >> -Matthias > > >> > > > >>> >> > > >> > > > >>> >> On 8/8/18 2:57 AM, Stanislav Kozlovski wrote: > > >> > > > >>> >> >> If you are inheriting from SerializationException, > your > > >> derived > > >> > > > >>> class > > >> > > > >>> >> > should also be a kind of serialization exception. Not > > >> something > > >> > > > >>> more > > >> > > > >>> >> > general. > > >> > > > >>> >> > Yeah, the reason for inheriting it would be for > > >> > > > >>> backwards-compatibility. > > >> > > > >>> >> > > > >> > > > >>> >> >> Hmm. Can you think of any new scenarios that would > make > > >> Kafka > > >> > > > >>> force > > >> > > > >>> >> the > > >> > > > >>> >> > user need to skip a specific record? Perhaps one > scenario > > >> is if > > >> > > > >>> records > > >> > > > >>> >> > are lost but we don't know how many. > > >> > > > >>> >> > Not on the spot, but I do wonder how likely a new > scenario > > >> is to > > >> > > > >>> >> surface in > > >> > > > >>> >> > the future and how we'd handle the exceptions' class > > >> hierarchy > > >> > > > then. > > >> > > > >>> >> > > > >> > > > >>> >> >> Which offset were we planning to use in the > > >> > > > >>> >> > exception? > > >> > > > >>> >> > The offset of the record which caused the exception. In > > >> the case > > >> > > > of > > >> > > > >>> >> > batches, we use the last offset of the batch. In both > > >> cases, > > >> > > users > > >> > > > >>> >> should > > >> > > > >>> >> > have to seek +1 from the given offset. You can review > the > > >> PR to > > >> > > > >>> ensure > > >> > > > >>> >> its > > >> > > > >>> >> > accurate > > >> > > > >>> >> > > > >> > > > >>> >> > > > >> > > > >>> >> > If both of you prefer > `RecordDeserializationException`, we > > >> can > > >> > > go > > >> > > > >>> with > > >> > > > >>> >> > that. Please do confirm that is okay > > >> > > > >>> >> > > > >> > > > >>> >> > On Tue, Aug 7, 2018 at 11:35 PM Jason Gustafson < > > >> > > > ja...@confluent.io > > >> > > > >>> > > > >> > > > >>> >> wrote: > > >> > > > >>> >> > > > >> > > > >>> >> >> One difference between the two cases is that we can't > > >> generally > > >> > > > >>> trust > > >> > > > >>> >> the > > >> > > > >>> >> >> offset of a corrupt message. Which offset were we > > >> planning to > > >> > > use > > >> > > > >>> in > > >> > > > >>> >> the > > >> > > > >>> >> >> exception? Maybe it should be either the fetch offset > or > > >> one > > >> > > plus > > >> > > > >>> the > > >> > > > >>> >> last > > >> > > > >>> >> >> consumed offset? I think I'm with Colin in preferring > > >> > > > >>> >> >> RecordDeserializationException for both cases if > > >> possible. For > > >> > > > one > > >> > > > >>> >> thing, > > >> > > > >>> >> >> that makes the behavior consistent whether or not > > >> `check.crs` > > >> > > is > > >> > > > >>> >> enabled. > > >> > > > >>> >> >> > > >> > > > >>> >> >> -Jason > > >> > > > >>> >> >> > > >> > > > >>> >> >> On Tue, Aug 7, 2018 at 11:17 AM, Colin McCabe < > > >> > > > cmcc...@apache.org> > > >> > > > >>> >> wrote: > > >> > > > >>> >> >> > > >> > > > >>> >> >>> Hi Stanislav, > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> On Sat, Aug 4, 2018, at 10:44, Stanislav Kozlovski > wrote: > > >> > > > >>> >> >>>> Hey Colin, > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>> It may be a bit vague but keep in mind we also > raise the > > >> > > > >>> exception in > > >> > > > >>> >> >> the > > >> > > > >>> >> >>>> case where the record is corrupted. > > >> > > > >>> >> >>>> We discussed with Jason offline that message > corruption > > >> most > > >> > > > >>> often > > >> > > > >>> >> >>> prevents > > >> > > > >>> >> >>>> deserialization itself and that may be enough of an > > >> argument > > >> > > to > > >> > > > >>> raise > > >> > > > >>> >> >>>> `RecordDeserializationException` in the case of a > > >> corrupt > > >> > > > >>> record. I > > >> > > > >>> >> >>>> personally find that misleading. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> Hmm. I think that by definition, corrupt records are > > >> records > > >> > > > that > > >> > > > >>> >> can't > > >> > > > >>> >> >>> be deserialized. There's no difference between the > two > > >> cases > > >> > > -- > > >> > > > >>> if > > >> > > > >>> >> (and > > >> > > > >>> >> >>> only if) the message is corrupt, it can't be > > >> deserialized. If > > >> > > > >>> (and > > >> > > > >>> >> only > > >> > > > >>> >> >>> if) it can't be deserialized, it is corrupt. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>> In the end, I think it might be worth it to have a > bit > > >> of a > > >> > > > >>> >> >>>> wider-encompassing `FaultyRecordException` (or even > > >> > > > >>> >> >>>> `UnconsumableRecordException`) which would allow > users > > >> to > > >> > > skip > > >> > > > >>> over > > >> > > > >>> >> the > > >> > > > >>> >> >>>> record. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> If you are inheriting from SerializationException, > your > > >> > > derived > > >> > > > >>> class > > >> > > > >>> >> >>> should also be a kind of serialization exception. > Not > > >> > > something > > >> > > > >>> more > > >> > > > >>> >> >>> general. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>>> We could then potentially have more specific > exceptions > > >> (e.g > > >> > > > >>> >> >>>> deserialization) inherit that but I'm not sure if we > > >> should. > > >> > > > >>> >> >>>> A case for a more general exception which provides > > >> access to > > >> > > > the > > >> > > > >>> >> >>>> partition/offset is future backwards-compatibility. > If > > >> there > > >> > > is > > >> > > > >>> ever > > >> > > > >>> >> a > > >> > > > >>> >> >>> new > > >> > > > >>> >> >>>> scenario that would make the user need to skip a > > >> specific > > >> > > > record > > >> > > > >>> - > > >> > > > >>> >> >> there > > >> > > > >>> >> >>>> would already be such an exception and this will > > >> provide some > > >> > > > >>> >> >>>> backward-compatibility with older clients. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> Hmm. Can you think of any new scenarios that would > make > > >> Kafka > > >> > > > >>> force > > >> > > > >>> >> the > > >> > > > >>> >> >>> user need to skip a specific record? Perhaps one > > >> scenario is > > >> > > if > > >> > > > >>> >> records > > >> > > > >>> >> >>> are lost but we don't know how many. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> If we really want to have something more general, > > >> perhaps we > > >> > > > need > > >> > > > >>> >> >>> something like LostDataException. But in that case, > we > > >> can't > > >> > > > >>> inherit > > >> > > > >>> >> >> from > > >> > > > >>> >> >>> SerializationException, since lost data is more > general > > >> than > > >> > > > >>> >> >> serialization > > >> > > > >>> >> >>> issues. > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> best, > > >> > > > >>> >> >>> Colin > > >> > > > >>> >> >>> > > >> > > > >>> >> >>> > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>> Best, > > >> > > > >>> >> >>>> Stanislav > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>> On Sat, Aug 4, 2018 at 12:23 AM Colin McCabe < > > >> > > > cmcc...@apache.org > > >> > > > >>> > > > >> > > > >>> >> >> wrote: > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>>> Hi Stanislav, > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>>> Thanks for the KIP. > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>>> As as user, "FaultyRecordException" seems a little > > >> vague. > > >> > > > >>> What's > > >> > > > >>> >> >>> faulty > > >> > > > >>> >> >>>>> about it? Is it too big? Does it not match the > > >> schema of > > >> > > the > > >> > > > >>> other > > >> > > > >>> >> >>>>> records? Was it not found? > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>>> Of course, we know that the specific problem is > with > > >> > > > >>> [de]serializing > > >> > > > >>> >> >>> the > > >> > > > >>> >> >>>>> record, not with any of those those things. So we > > >> should > > >> > > > >>> choose a > > >> > > > >>> >> >> name > > >> > > > >>> >> >>>>> that reflects that serialization is the problem. > How > > >> about > > >> > > > >>> >> >>>>> RecordSerializationException? > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>>> best, > > >> > > > >>> >> >>>>> Colin > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>>> On Thu, Aug 2, 2018, at 15:11, Stanislav Kozlovski > > >> wrote: > > >> > > > >>> >> >>>>>> Hi Jason and Ted, > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>> @Jason > > >> > > > >>> >> >>>>>> I did not oppose the idea as I'm not too familiar > > >> with Java > > >> > > > >>> >> >>> conventions. > > >> > > > >>> >> >>>>> I > > >> > > > >>> >> >>>>>> agree it is a non-ideal way for the user to catch > the > > >> > > > >>> exception so > > >> > > > >>> >> >> I > > >> > > > >>> >> >>>>>> changed it back. > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>> I've updated the KIP and PR with the latest > changes. > > >> Now, > > >> > > > >>> there is > > >> > > > >>> >> >>> only > > >> > > > >>> >> >>>>> one > > >> > > > >>> >> >>>>>> public exception `FaultyRecordException` which is > > >> thrown to > > >> > > > the > > >> > > > >>> >> >> user > > >> > > > >>> >> >>> in > > >> > > > >>> >> >>>>>> both scenarios (corrupt record and deserialization > > >> error). > > >> > > > >>> >> >>>>>> Please take a look again. > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>> Best, > > >> > > > >>> >> >>>>>> Stanislav > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>> On Thu, Aug 2, 2018 at 5:25 PM Jason Gustafson < > > >> > > > >>> ja...@confluent.io > > >> > > > >>> >> >>> > > >> > > > >>> >> >>>>> wrote: > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>>> Hey Stanislav, > > >> > > > >>> >> >>>>>>> > > >> > > > >>> >> >>>>>>> I should have noticed it earlier from your > example, > > >> but I > > >> > > > just > > >> > > > >>> >> >>> realized > > >> > > > >>> >> >>>>>>> that interfaces don't mix well with exceptions. > > >> There is > > >> > > no > > >> > > > >>> way > > >> > > > >>> >> >> to > > >> > > > >>> >> >>>>> catch > > >> > > > >>> >> >>>>>>> the interface type, which means you have to > depend on > > >> > > > >>> instanceof > > >> > > > >>> >> >>>>> checks, > > >> > > > >>> >> >>>>>>> which is not very conventional. At the moment, we > > >> raise > > >> > > > >>> >> >>>>>>> SerializationException if there is a problem > parsing > > >> the > > >> > > > >>> error, > > >> > > > >>> >> >>> and we > > >> > > > >>> >> >>>>>>> raise KafkaException if the record fails its CRC > > >> check. > > >> > > > Since > > >> > > > >>> >> >>>>>>> SerializationException extends KafkaExeption, it > > >> seems > > >> > > like > > >> > > > we > > >> > > > >>> >> >> can > > >> > > > >>> >> >>>>> handle > > >> > > > >>> >> >>>>>>> both cases in a compatible way by handling both > cases > > >> > > with a > > >> > > > >>> >> >> single > > >> > > > >>> >> >>>>> type > > >> > > > >>> >> >>>>>>> that extends SerializationException. Maybe > something > > >> like > > >> > > > >>> >> >>>>>>> RecordDeserializationException? > > >> > > > >>> >> >>>>>>> > > >> > > > >>> >> >>>>>>> Thanks, > > >> > > > >>> >> >>>>>>> Jason > > >> > > > >>> >> >>>>>>> > > >> > > > >>> >> >>>>>>> On Thu, Aug 2, 2018 at 5:45 AM, Ted Yu < > > >> > > yuzhih...@gmail.com > > >> > > > > > > >> > > > >>> >> >>> wrote: > > >> > > > >>> >> >>>>>>> > > >> > > > >>> >> >>>>>>>> +1 > > >> > > > >>> >> >>>>>>>> -------- Original message --------From: > Stanislav > > >> > > > Kozlovski < > > >> > > > >>> >> >>>>>>>> stanis...@confluent.io> Date: 8/2/18 2:41 AM > > >> > > (GMT-08:00) > > >> > > > >>> To: > > >> > > > >>> >> >>>>>>>> dev@kafka.apache.org Subject: [VOTE] KIP-334 > > >> Include > > >> > > > >>> >> >> partitions > > >> > > > >>> >> >>> in > > >> > > > >>> >> >>>>>>>> exceptions raised during consumer record > > >> > > > >>> >> >>> deserialization/validation > > >> > > > >>> >> >>>>>>>> Hey everybody, > > >> > > > >>> >> >>>>>>>> > > >> > > > >>> >> >>>>>>>> I'd like to start a vote thread for KIP-334 > Include > > >> > > > >>> partitions > > >> > > > >>> >> >> in > > >> > > > >>> >> >>>>>>>> exceptions raised during consumer record > > >> > > > >>> >> >>> deserialization/validation > > >> > > > >>> >> >>>>>>>> < > > >> > > > >>> >> >>>>>>> > > >> > > > >>> >> >>>>> > > >> https://cwiki.apache.org/confluence/pages/viewpage.action? > > >> > > > >>> >> >>> pageId=87297793 > > >> > > > >>> >> >>>>>>>>> > > >> > > > >>> >> >>>>>>>> > > >> > > > >>> >> >>>>>>>> -- > > >> > > > >>> >> >>>>>>>> Best, > > >> > > > >>> >> >>>>>>>> Stanislav > > >> > > > >>> >> >>>>>>>> > > >> > > > >>> >> >>>>>>> > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>> > > >> > > > >>> >> >>>>>> -- > > >> > > > >>> >> >>>>>> Best, > > >> > > > >>> >> >>>>>> Stanislav > > >> > > > >>> >> >>>>> > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>> > > >> > > > >>> >> >>>> -- > > >> > > > >>> >> >>>> Best, > > >> > > > >>> >> >>>> Stanislav > > >> > > > >>> >> >>> > > >> > > > >>> >> >> > > >> > > > >>> >> > > > >> > > > >>> >> > > > >> > > > >>> >> > > >> > > > >>> >> > > >> > > > >>> > > >> > > > >> > > >> > > > >> > > >> > > > >> -- > > >> > > > >> Best, > > >> > > > >> Stanislav > > >> > > > >> > > >> > > > > > > >> > > > > > > >> > > > > -- > > >> > > > > Best, > > >> > > > > Stanislav > > >> > > > > > > >> > > > > > >> > > > > > >> > > > -- > > >> > > > Best, > > >> > > > Stanislav > > >> > > > > > >> > > > > >> > > > >> > > > >> > -- > > >> > Best, > > >> > Stanislav > > >> > > > > > > > > > -- > > > Best, > > > Stanislav > > > > > > > > > -- > > > > <https://www.confluent.io/> > > > > *Sarwar Bhuiyan* > > > > Senior Customer Success Architect > > > > +447949684437 > > > > Follow us: Blog <http://www.confluent.io/blog> • Slack > > <https://slackpass.io/confluentcommunity> • Twitter > > <https://twitter.com/ConfluentInc> • YouTube < > https://youtube.com/confluent> > > > > <https://developer.confluent.io/> > > >