Overall, I agree with Jay on both points. 1. I think it's reasonable to add new error codes w/o bumping up the protocol version. In most cases, by adding new error codes, we are just refining the categorization of those unknown errors. So, a client shouldn't behave worse than before as long as unknown errors have been properly handled.
2. I think it's reasonable to just document that 0.8.2 will be the last release that will support ack > 1 and remove the support completely in trunk w/o bumping up the protocol. This is because (a) we never included ack > 1 explicitly in the documentation and so the usage should be limited; (2) ack > 1 doesn't provide the guarantee that people really want and so it shouldn't really be used. Thanks, Jun On Sun, Jan 18, 2015 at 11:03 AM, Jay Kreps <jay.kr...@gmail.com> wrote: > Hey guys, > > I really think we are discussing two things here: > > 1. How should we generally handle changes to the set of errors? Should > introducing new errors be considered a protocol change or should we reserve > the right to introduce new error codes? > 2. Given that this particular change is possibly incompatible, how > should we handle it? > > I think it would be good for people who are responding here to be specific > about which they are addressing. > > Here is what I think: > > 1. Errors should be extensible within a protocol version. > > We should change the protocol documentation to list the errors that can be > given back from each api, their meaning, and how to handle them, BUT we > should explicitly state that the set of errors are open ended. That is we > should reserve the right to introduce new errors and explicitly state that > clients need a blanket "unknown error" handling mechanism. The error can > link to the protocol definition (something like "Unknown error 42, see > protocol definition at http://link"). We could make this work really well > by instructing all the clients to report the error in a very googlable way > as Oracle does with their error format (e.g. "ORA-32") so that if you ever > get the raw error google will take you to the definition. > > I agree that a more rigid definition seems like "right thing", but having > just implemented two clients and spent a bunch of time on the server side, > I think, it will work out poorly in practice. Here is why: > > - I think we will make a lot of mistakes in nailing down the set of > error codes up front and we will end up going through 3-4 churns of the > protocol definition just realizing the set of errors that can be thrown. I > think this churn will actually make life worse for clients that now have to > figure out 7 identical versions of the protocol and will be a mess in terms > of testing on the server side. I actually know this to be true because > while implementing the clients I tried to guess the errors that could be > thrown, then checked my guess by close code inspection. It turned out that > I always missed things in my belief about errors, but more importantly even > after close code inspection I found tons of other errors in my stress > testing. > - In practice error handling always involves calling out one or two > meaningful failures that have special recovery and then a blanket case that > just handles everything else. It's true that some clients may not have done > this well, but I think it is for the best if they fix that. > - Reserving the right to add errors doesn't mean we will do it without > care. We will think through each change and decide whether giving a little > more precision in the error is worth the overhead and churn of a protocol > version bump. > > 2. In this case in particular we should not introduce a new protocol > version > > In this particular case we are saying that acks > 1 doesn't make sense and > we want to give an error to people specifying this so that they change > their configuration. This is a configuration that few people use and we > want to just make it an error. The bad behavior will just be that the error > will not be as good as it could be. I think that is a better tradeoff than > introducing a separate protocol version (this may be true of the java > clients too). > > We will have lots of cases like this in the future and we aren't going to > want to churn the protocol for each of them. For example we previously had > to get more precise about which characters were legal and which illegal in > topic names. > > -Jay > > On Fri, Jan 16, 2015 at 11:55 AM, Gwen Shapira <gshap...@cloudera.com> > wrote: > >> I updated the KIP: Using acks > 1 in version 0 will log a WARN message >> in the broker about client using deprecated behavior (suggested by Joe >> in the JIRA, and I think it makes sense). >> >> Gwen >> >> On Fri, Jan 16, 2015 at 10:40 AM, Gwen Shapira <gshap...@cloudera.com> >> wrote: >> > How about we continue the discussion on this thread, so we won't lose >> > the context of this discussion, and put it up for VOTE when this has >> > been finalized? >> > >> > On Fri, Jan 16, 2015 at 10:22 AM, Neha Narkhede <n...@confluent.io> >> wrote: >> >> Gwen, >> >> >> >> KIP write-up looks good. According to the rest of the KIP process >> proposal, >> >> would you like to start a DISCUSS/VOTE thread for it? >> >> >> >> Thanks, >> >> Neha >> >> >> >> On Fri, Jan 16, 2015 at 9:37 AM, Ewen Cheslack-Postava < >> e...@confluent.io> >> >> wrote: >> >> >> >>> Gwen -- KIP write up looks good. Deprecation schedule probably needs >> to be >> >>> more specific, but I think that discussion probably needs to happen >> after a >> >>> solution is agreed upon. >> >>> >> >>> Jay -- I think "older clients will get a bad error message instead of >> a >> >>> good one" isn't what would be happening with this change. Previously >> they >> >>> wouldn't have received an error and they would have been able to >> produce >> >>> messages. After the change they'll just receive this new error message >> >>> which their clients can't possibly handle gracefully since it didn't >> exist >> >>> when the client was written. Whether the acks > 1 setting was actually >> >>> accomplishing what they thought doesn't matter. Someone could have >> >>> reasonably read the docs on 0.8.1.1, thought acks = 2 is an ok >> setting for >> >>> their applications, set it as a default across a bunch of apps, then >> follow >> >>> the recommended upgrade path of updating brokers to 0.8.2 and all >> their >> >>> apps will start failing on produce requests. >> >>> >> >>> >> >>> On Thu, Jan 15, 2015 at 8:27 PM, Jay Kreps <jay.kr...@gmail.com> >> wrote: >> >>> >> >>> > This is a good case to discuss. >> >>> > >> >>> > Let's figure the general case of how we want to handle errors and >> get >> >>> that >> >>> > documented in the protocol. The problem right now is that we give no >> >>> > guidance on this. I actually thought Gwen's suggestion made sense >> on the >> >>> > guidance we should have given which is that we will enumerate a set >> of >> >>> > errors and their meaning for each API but it is possible that other >> >>> errors >> >>> > will occur and they should be handled (maybe poorly) in the same way >> >>> > UNKNOWN_ERROR is handled which is our normal escape hatch for >> things like >> >>> > OOMException. >> >>> > >> >>> > I really do think we shouldn't be dogmatic here: In considering a >> change >> >>> > to errors we should consider the potential ill-effect vs the >> complexity >> >>> of >> >>> > yet another protocol version. >> >>> > >> >>> > In this case I actually am not sure we need to bump the protocol >> because >> >>> > the whole point of the change was to make a setting we think >> doesn't make >> >>> > sense break, right? Well this will break it. It seems like the only >> >>> > downside is that older clients will get a bad error message instead >> of a >> >>> > good one. But it isn't like we will have rendered a client >> unusable, it >> >>> is >> >>> > just that they will need to change their config. >> >>> > >> >>> > -Jay >> >>> > >> >>> > On Thu, Jan 15, 2015 at 6:14 PM, Gwen Shapira < >> gshap...@cloudera.com> >> >>> > wrote: >> >>> > >> >>> >> I created a KIP for this suggestion: >> >>> >> >> >>> >> >> >>> >> >> >>> >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-1+-+Remove+support+of+request.required.acks >> >>> >> >> >>> >> Basically documenting what was already discussed here. Comments >> will >> >>> >> be awesome! >> >>> >> >> >>> >> Gwen >> >>> >> >> >>> >> On Thu, Jan 15, 2015 at 5:19 PM, Gwen Shapira < >> gshap...@cloudera.com> >> >>> >> wrote: >> >>> >> > The errors are part of the KIP process now, so I think the >> clients are >> >>> >> safe :) >> >>> >> > >> >>> >> > >> >>> >> >> >>> >> https://cwiki.apache.org/confluence/display/KAFKA/Kafka+Improvement+Proposals >> >>> >> > >> >>> >> > On Thu, Jan 15, 2015 at 5:12 PM, Steve Morin < >> steve.mo...@gmail.com> >> >>> >> wrote: >> >>> >> >> Agree errors should be part of the protocol >> >>> >> >> >> >>> >> >>> On Jan 15, 2015, at 17:59, Gwen Shapira <gshap...@cloudera.com >> > >> >>> >> wrote: >> >>> >> >>> >> >>> >> >>> Hi, >> >>> >> >>> >> >>> >> >>> I got convinced by Joe and Dana that errors are indeed part of >> the >> >>> >> >>> protocol and can't be randomly added. >> >>> >> >>> >> >>> >> >>> So, it looks like we need to bump version of ProduceRequest in >> the >> >>> >> >>> following way: >> >>> >> >>> Version 0 -> accept acks >1. I think we should keep the >> existing >> >>> >> >>> behavior too (i.e. not replace it with -1) to avoid surprising >> >>> >> >>> clients, but I'm willing to hear other opinions. >> >>> >> >>> Version 1 -> do not accept acks >1 and return an error. >> >>> >> >>> Are we ok with the error I added in KAFKA-1697? We can use >> something >> >>> >> >>> less specific like InvalidRequestParameter. This error can be >> reused >> >>> >> >>> in the future and reduce the need to add errors, but will also >> be >> >>> less >> >>> >> >>> clear to the client and its users. Maybe even add the error >> message >> >>> >> >>> string to the protocol in addition to the error code? (since >> we are >> >>> >> >>> bumping versions....) >> >>> >> >>> >> >>> >> >>> I think maintaining the old version throughout 0.8.X makes >> sense. >> >>> IMO >> >>> >> >>> dropping it for 0.9 is feasible, but I'll let client owners >> help >> >>> make >> >>> >> >>> that call. >> >>> >> >>> >> >>> >> >>> Am I missing anything? Should I start a KIP? It seems like a >> >>> KIP-type >> >>> >> >>> discussion :) >> >>> >> >>> >> >>> >> >>> Gwen >> >>> >> >>> >> >>> >> >>> >> >>> >> >>> On Thu, Jan 15, 2015 at 2:31 PM, Ewen Cheslack-Postava >> >>> >> >>> <e...@confluent.io> wrote: >> >>> >> >>>> Gwen, >> >>> >> >>>> >> >>> >> >>>> I think the only option that wouldn't require a protocol >> version >> >>> >> change is >> >>> >> >>>> the one where acks > 1 is converted to acks = -1 since it's >> the >> >>> only >> >>> >> one >> >>> >> >>>> that doesn't potentially break older clients. The protocol >> guide >> >>> >> says that >> >>> >> >>>> the expected upgrade path is servers first, then clients, so >> old >> >>> >> clients, >> >>> >> >>>> including non-java clients, that may be using acks > 1 should >> be >> >>> >> able to >> >>> >> >>>> work with a new broker version. >> >>> >> >>>> >> >>> >> >>>> It's more work, but I think dealing with the protocol change >> is the >> >>> >> right >> >>> >> >>>> thing to do since it eventually gets us to the behavior I >> think is >> >>> >> better -- >> >>> >> >>>> the broker should reject requests with invalid values. I >> think Joe >> >>> >> and I >> >>> >> >>>> were basically in agreement. In my mind the major piece >> missing >> >>> from >> >>> >> his >> >>> >> >>>> description is how long we're going to maintain his "case 0" >> >>> >> behavior. It's >> >>> >> >>>> impractical to maintain old versions forever, but it sounds >> like >> >>> >> there >> >>> >> >>>> hasn't been a decision on how long to maintain them. Maybe >> that's >> >>> >> another >> >>> >> >>>> item to add to KIPs -- protocol versions and behavior need to >> be >> >>> >> listed as >> >>> >> >>>> deprecated and the earliest version in which they'll be >> removed >> >>> >> should be >> >>> >> >>>> specified so users can understand which versions are >> guaranteed to >> >>> be >> >>> >> >>>> compatible, even if they're using (well-written) non-java >> clients. >> >>> >> >>>> >> >>> >> >>>> -Ewen >> >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>>> On Thu, Jan 15, 2015 at 12:52 PM, Dana Powers < >> >>> >> dana.pow...@gmail.com> wrote: >> >>> >> >>>>> >> >>> >> >>>>>> clients don't break on unknown errors >> >>> >> >>>>> >> >>> >> >>>>> maybe true for the official java clients, but I dont think >> the >> >>> >> assumption >> >>> >> >>>>> holds true for community-maintained clients and users of >> those >> >>> >> clients. >> >>> >> >>>>> kafka-python generally follows the fail-fast philosophy and >> raises >> >>> >> an >> >>> >> >>>>> exception on any unrecognized error code in any server >> response. >> >>> >> in this >> >>> >> >>>>> case, kafka-python allows users to set their own >> required-acks >> >>> >> policy when >> >>> >> >>>>> creating a producer instance. It is possible that users of >> >>> >> kafka-python >> >>> >> >>>>> have deployed producer code that uses ack>1 -- perhaps in >> >>> production >> >>> >> >>>>> environments -- and for those users the new error code will >> crash >> >>> >> their >> >>> >> >>>>> producer code. I would not be surprised if the same were >> true of >> >>> >> other >> >>> >> >>>>> community clients. >> >>> >> >>>>> >> >>> >> >>>>> *one reason for the fail-fast approach is that there isn't >> great >> >>> >> >>>>> documentation on what errors to expect for each request / >> response >> >>> >> -- so >> >>> >> >>>>> we >> >>> >> >>>>> use failures to alert that some error case is not handled >> >>> >> properly. and >> >>> >> >>>>> because of that, introducing new error cases without bumping >> the >> >>> api >> >>> >> >>>>> version is likely to cause those errors to get raised/thrown >> all >> >>> >> the way >> >>> >> >>>>> back up to the user. of course we (client maintainers) can >> fix >> >>> the >> >>> >> issues >> >>> >> >>>>> in the client libraries and suggest users upgrade, but it's >> not >> >>> the >> >>> >> ideal >> >>> >> >>>>> situation. >> >>> >> >>>>> >> >>> >> >>>>> >> >>> >> >>>>> long-winded way of saying: I agree w/ Joe. >> >>> >> >>>>> >> >>> >> >>>>> -Dana >> >>> >> >>>>> >> >>> >> >>>>> >> >>> >> >>>>> On Thu, Jan 15, 2015 at 12:07 PM, Gwen Shapira < >> >>> >> gshap...@cloudera.com> >> >>> >> >>>>> wrote: >> >>> >> >>>>> >> >>> >> >>>>>> Is the protocol bump caused by the behavior change or the >> new >> >>> error >> >>> >> >>>>>> code? >> >>> >> >>>>>> >> >>> >> >>>>>> 1) IMO, error_codes are data, and clients can expect to >> receive >> >>> >> errors >> >>> >> >>>>>> that they don't understand (i.e. unknown errors). AFAIK, >> clients >> >>> >> don't >> >>> >> >>>>>> break on unknown errors, they are simple more challenging to >> >>> >> debug. If >> >>> >> >>>>>> we document the new behavior, then its definitely >> debuggable and >> >>> >> >>>>>> fixable. >> >>> >> >>>>>> >> >>> >> >>>>>> 2) The behavior change is basically a deprecation - i.e. >> acks > 1 >> >>> >> were >> >>> >> >>>>>> never documented, and are not supported by Kafka clients >> starting >> >>> >> with >> >>> >> >>>>>> version 0.8.2. I'm not sure this requires a protocol bump >> either, >> >>> >> >>>>>> although its a better case than new error codes. >> >>> >> >>>>>> >> >>> >> >>>>>> Thanks, >> >>> >> >>>>>> Gwen >> >>> >> >>>>>> >> >>> >> >>>>>> On Thu, Jan 15, 2015 at 10:10 AM, Joe Stein < >> >>> joe.st...@stealth.ly> >> >>> >> >>>>>> wrote: >> >>> >> >>>>>>> Looping in the mailing list that the client developers >> live on >> >>> >> because >> >>> >> >>>>>> they >> >>> >> >>>>>>> are all not on dev (though they should be if they want to >> be >> >>> >> helping >> >>> >> >>>>>>> to >> >>> >> >>>>>>> build the best client libraries they can). >> >>> >> >>>>>>> >> >>> >> >>>>>>> I whole hardily believe that we need to not break existing >> >>> >> >>>>>>> functionality >> >>> >> >>>>>> of >> >>> >> >>>>>>> the client protocol, ever. >> >>> >> >>>>>>> >> >>> >> >>>>>>> There are many reasons for this and we have other threads >> on the >> >>> >> >>>>>>> mailing >> >>> >> >>>>>>> list where we are discussing that topic (no pun intended) >> that I >> >>> >> don't >> >>> >> >>>>>> want >> >>> >> >>>>>>> to re-hash here. >> >>> >> >>>>>>> >> >>> >> >>>>>>> If we change wire protocol functionality OR the binary >> format >> >>> >> (either) >> >>> >> >>>>>>> we >> >>> >> >>>>>>> must bump version AND treat version as a feature flag with >> >>> >> backward >> >>> >> >>>>>>> compatibility support until it is deprecated for some time >> for >> >>> >> folks >> >>> >> >>>>>>> to >> >>> >> >>>>>> deal >> >>> >> >>>>>>> with it. >> >>> >> >>>>>>> >> >>> >> >>>>>>> match version = { >> >>> >> >>>>>>> case 0: keepDoingWhatWeWereDoing() >> >>> >> >>>>>>> case 1: doNewStuff() >> >>> >> >>>>>>> case 2: doEvenMoreNewStuff() >> >>> >> >>>>>>> } >> >>> >> >>>>>>> >> >>> >> >>>>>>> has to be a practice we adopt imho ... I know feature >> flags can >> >>> be >> >>> >> >>>>>> construed >> >>> >> >>>>>>> as "messy code" but I am eager to hear another (better? >> >>> >> different?) >> >>> >> >>>>>> solution >> >>> >> >>>>>>> to this. >> >>> >> >>>>>>> >> >>> >> >>>>>>> If we don't do a feature flag like this specifically with >> this >> >>> >> change >> >>> >> >>>>>> then >> >>> >> >>>>>>> what happens is that someone upgrades their brokers with a >> >>> rolling >> >>> >> >>>>>> restart >> >>> >> >>>>>>> in 0.8.3 and every single one of their producer requests >> start >> >>> to >> >>> >> fail >> >>> >> >>>>>> and >> >>> >> >>>>>>> they have a major production outage. eeeek!!!! >> >>> >> >>>>>>> >> >>> >> >>>>>>> I do 100% agree that > 1 makes no sense and we *REALLY* >> need >> >>> >> people to >> >>> >> >>>>>> start >> >>> >> >>>>>>> using 0,1,-1 but we need to-do that in a way that is going >> to >> >>> >> work for >> >>> >> >>>>>>> everyone. >> >>> >> >>>>>>> >> >>> >> >>>>>>> Old producers and consumers must keep working with new >> brokers >> >>> >> and if >> >>> >> >>>>>>> we >> >>> >> >>>>>> are >> >>> >> >>>>>>> not going to support that then I am unclear what the use of >> >>> >> "version" >> >>> >> >>>>>>> is >> >>> >> >>>>>>> based on our original intentions of having it because of >> the >> >>> >> >>>>>>> 0.7=>-0.8. >> >>> >> >>>>>> We >> >>> >> >>>>>>> said no more breaking changes when we did that. >> >>> >> >>>>>>> >> >>> >> >>>>>>> - Joe Stein >> >>> >> >>>>>>> >> >>> >> >>>>>>> On Thu, Jan 15, 2015 at 12:38 PM, Ewen Cheslack-Postava < >> >>> >> >>>>>> e...@confluent.io> >> >>> >> >>>>>>> wrote: >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> Right, so this looks like it could create an issue >> similar to >> >>> >> what's >> >>> >> >>>>>>>> currently being discussed in >> >>> >> >>>>>>>> https://issues.apache.org/jira/browse/KAFKA-1649 where >> users >> >>> >> now get >> >>> >> >>>>>>>> errors >> >>> >> >>>>>>>> under conditions when they previously wouldn't. Old >> clients >> >>> won't >> >>> >> >>>>>>>> even >> >>> >> >>>>>>>> know >> >>> >> >>>>>>>> about the error code, so besides failing they won't even >> be >> >>> able >> >>> >> to >> >>> >> >>>>>>>> log >> >>> >> >>>>>>>> any >> >>> >> >>>>>>>> meaningful error messages. >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> I think there are two options for compatibility: >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> 1. An alternative change is to remove the ack > 1 code, >> but >> >>> >> silently >> >>> >> >>>>>>>> "upgrade" requests with acks > 1 to acks = -1. This isn't >> the >> >>> >> same as >> >>> >> >>>>>>>> other >> >>> >> >>>>>>>> changes to behavior since the interaction between the >> client >> >>> and >> >>> >> >>>>>>>> server >> >>> >> >>>>>>>> remains the same, no error codes change, etc. The client >> might >> >>> >> just >> >>> >> >>>>>>>> see >> >>> >> >>>>>>>> some increased latency since the message might need to be >> >>> >> replicated >> >>> >> >>>>>>>> to >> >>> >> >>>>>>>> more brokers than they requested. >> >>> >> >>>>>>>> 2. Split this into two patches, one that bumps the >> protocol >> >>> >> version >> >>> >> >>>>>>>> on >> >>> >> >>>>>>>> that >> >>> >> >>>>>>>> message to include the new error code but maintains both >> old >> >>> (now >> >>> >> >>>>>>>> deprecated) and new behavior, then a second that would be >> >>> >> applied in >> >>> >> >>>>>>>> a >> >>> >> >>>>>>>> later release that removes the old protocol + code for >> handling >> >>> >> acks >> >>> >> >>>>>> 1. >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> 2 is probably the right thing to do. If we specify the >> release >> >>> >> when >> >>> >> >>>>>> we'll >> >>> >> >>>>>>>> remove the deprecated protocol at the time of deprecation >> it >> >>> >> makes >> >>> >> >>>>>> things >> >>> >> >>>>>>>> a >> >>> >> >>>>>>>> lot easier for people writing non-java clients and could >> give >> >>> >> users >> >>> >> >>>>>> better >> >>> >> >>>>>>>> predictability (e.g. if clients are at most 1 major >> release >> >>> >> behind >> >>> >> >>>>>>>> brokers, >> >>> >> >>>>>>>> they'll remain compatible but possibly use deprecated >> >>> features). >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> On Wed, Jan 14, 2015 at 3:51 PM, Gwen Shapira < >> >>> >> gshap...@cloudera.com> >> >>> >> >>>>>>>> wrote: >> >>> >> >>>>>>>> >> >>> >> >>>>>>>>> Hi Kafka Devs, >> >>> >> >>>>>>>>> >> >>> >> >>>>>>>>> We are working on KAFKA-1697 - remove code related to >> ack>1 on >> >>> >> the >> >>> >> >>>>>>>>> broker. Per Neha's suggestion, I'd like to give everyone >> a >> >>> >> heads up >> >>> >> >>>>>>>>> on >> >>> >> >>>>>>>>> what these changes mean. >> >>> >> >>>>>>>>> >> >>> >> >>>>>>>>> Once this patch is included, any produce requests that >> include >> >>> >> >>>>>>>>> request.required.acks > 1 will result in an exception. >> This >> >>> >> will be >> >>> >> >>>>>>>>> InvalidRequiredAcks in new versions (0.8.3 and up, I >> assume) >> >>> and >> >>> >> >>>>>>>>> UnknownException in existing versions (sorry, but I >> can't add >> >>> >> error >> >>> >> >>>>>>>>> codes retroactively). >> >>> >> >>>>>>>>> >> >>> >> >>>>>>>>> This behavior is already enforced by 0.8.2 producers >> (sync and >> >>> >> >>>>>>>>> new), >> >>> >> >>>>>>>>> but we expect impact on users with older producers that >> relied >> >>> >> on >> >>> >> >>>>>>>>> acks >> >>> >> >>>>>>>>>> 1 and external clients (i.e python, go, etc). >> >>> >> >>>>>>>>> >> >>> >> >>>>>>>>> Users who relied on acks > 1 are expected to switch to >> using >> >>> >> acks = >> >>> >> >>>>>>>>> -1 >> >>> >> >>>>>>>>> and a min.isr parameter than matches their user case. >> >>> >> >>>>>>>>> >> >>> >> >>>>>>>>> This change was discussed in the past in the context of >> >>> >> KAFKA-1555 >> >>> >> >>>>>>>>> (min.isr), but let us know if you have any questions or >> >>> concerns >> >>> >> >>>>>>>>> regarding this change. >> >>> >> >>>>>>>>> >> >>> >> >>>>>>>>> Gwen >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> >> >>> >> >>>>>>>> -- >> >>> >> >>>>>>>> Thanks, >> >>> >> >>>>>>>> Ewen >> >>> >> >>>>>>> >> >>> >> >>>>>>> >> >>> >> >>>>>>> -- >> >>> >> >>>>>>> You received this message because you are subscribed to the >> >>> Google >> >>> >> >>>>>>> Groups >> >>> >> >>>>>>> "kafka-clients" group. >> >>> >> >>>>>>> To unsubscribe from this group and stop receiving emails >> from >> >>> it, >> >>> >> send >> >>> >> >>>>>>> an >> >>> >> >>>>>>> email to kafka-clients+unsubscr...@googlegroups.com. >> >>> >> >>>>>>> To post to this group, send email to >> >>> >> kafka-clie...@googlegroups.com. >> >>> >> >>>>>>> Visit this group at >> >>> http://groups.google.com/group/kafka-clients. >> >>> >> >>>>>>> To view this discussion on the web visit >> >>> >> >>>>>> >> >>> >> >>>>>> >> >>> >> >> >>> >> https://groups.google.com/d/msgid/kafka-clients/CAA7ooCBtH2JjyQsArdx_%3DV25B4O1QJk0YvOu9U6kYt9sB4aqng%40mail.gmail.com >> >>> >> >>>>>> . >> >>> >> >>>>>>> >> >>> >> >>>>>>> For more options, visit https://groups.google.com/d/optout >> . >> >>> >> >>>>>> >> >>> >> >>>>>> -- >> >>> >> >>>>>> You received this message because you are subscribed to the >> >>> Google >> >>> >> >>>>>> Groups >> >>> >> >>>>>> "kafka-clients" group. >> >>> >> >>>>>> To unsubscribe from this group and stop receiving emails >> from it, >> >>> >> send >> >>> >> >>>>>> an >> >>> >> >>>>>> email to kafka-clients+unsubscr...@googlegroups.com. >> >>> >> >>>>>> To post to this group, send email to >> >>> >> kafka-clie...@googlegroups.com. >> >>> >> >>>>>> Visit this group at >> http://groups.google.com/group/kafka-clients >> >>> . >> >>> >> >>>>>> To view this discussion on the web visit >> >>> >> >>>>>> >> >>> >> >>>>>> >> >>> >> >> >>> >> https://groups.google.com/d/msgid/kafka-clients/CAHBV8WeUebxi%2B%2BSbjz8E9Yf4u4hkcPJ80Xsj0XTKcTac%3D%2B613A%40mail.gmail.com >> >>> >> >>>>>> . >> >>> >> >>>>>> For more options, visit https://groups.google.com/d/optout. >> >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>> >> >>> >> >>>> -- >> >>> >> >>>> Thanks, >> >>> >> >>>> Ewen >> >>> >> >> >>> > >> >>> > >> >>> >> >>> >> >>> -- >> >>> Thanks, >> >>> Ewen >> >>> >> >> >> >> >> >> >> >> -- >> >> Thanks, >> >> Neha >> > > -- > You received this message because you are subscribed to the Google Groups > "kafka-clients" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to kafka-clients+unsubscr...@googlegroups.com. > To post to this group, send email to kafka-clie...@googlegroups.com. > Visit this group at http://groups.google.com/group/kafka-clients. > To view this discussion on the web visit > https://groups.google.com/d/msgid/kafka-clients/CAOeJiJh17CYq%3D-qgPu9rnArsPW%3D7RL9AAW_h%3DrrXx0%2BKhhKgNQ%40mail.gmail.com > <https://groups.google.com/d/msgid/kafka-clients/CAOeJiJh17CYq%3D-qgPu9rnArsPW%3D7RL9AAW_h%3DrrXx0%2BKhhKgNQ%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > > For more options, visit https://groups.google.com/d/optout. >