Joel, thanks for your feedback. I updated the wiki based on your comments about the wiki writeup.
On Fri, Jan 29, 2016 at 11:50 AM, Anna Povzner <a...@confluent.io> wrote: > Becket, > > In your scenario with one message from producer A and one message from > producer B, those are two different messages, and they should be tracked as > two different messages. So I would argue for using record CRC -- CRC that > is actually used by the system + it will not require computing a different > CRC again which will add performance overhead. > > If the broker ever changes the CRC, the scenarios when that happens should > be very well defined. As far as I know, the scenarios when CRC is > overwritten by the broker (including KIP-31/32 changes): > -- topic config is LogAppendTime for timestamp type > -- upgrade/downgrade > -- compression codec change (which could be inferred from config). > > Monitoring/audit just needs to know when CRCs are safe to use, which is > most often is known from config. In the future, this can be further > addressed by broker interceptors. > > Thanks, > Anna > > > > > On Fri, Jan 29, 2016 at 11:30 AM, Becket Qin <becket....@gmail.com> wrote: > >> Neha, >> >> CRC is definitely an important type of metadata of a record. I am not >> arguing about that. But I think we should distinguish between two types of >> checksum here, 1) the checksum of user data. and 2) the checksum including >> system appended bytes. >> >> I completely agree that (1) is good to add. But I am not sure if we should >> expose (2) to user, because this means any underlying protocol change will >> give a different CRC for exact same message. For example, let's say >> producer A is sending message with timestamp. Producer B is sending >> message >> without timestamp. Even they are given the exact same message, the CRC >> returned would be different. >> >> Also, Kafka broker will modify the system appended bytes in different >> scenarios, such as compression codec change, message format >> conversion(After KIP-31 and KIP-32). >> >> So my concern is that we are exposing CRC which including system appended >> bytes to user. >> >> Other than this I think everything looks good. Nice work, Anna. >> >> Thanks, >> >> Jiangjie (Becket) Qin >> >> On Fri, Jan 29, 2016 at 8:11 AM, Joel Koshy <jjkosh...@gmail.com> wrote: >> >> > Responding to some of the earlier comments in the thread: >> > >> > @Jay/@Neha, >> > >> > I think any one of onCommit/onAppend/onArrival would work for the >> concrete >> > use-case that I had outlined. I think onArrival is additionally useful >> for >> > custom validation - i.e., reject the message and do not append if it >> > violates some cluster-specific rule (for e.g., if some header timestamp >> is >> > older than xyz). However, the thing with user-supplied validation is we >> > would have to do with a (new) generic error code in the producer >> response. >> > While there is a risk of a broker interceptor having high latency I >> think >> > that is acceptable since it is the user's responsibility to ensure low >> > latency - the producer call-back and onAcknowledgment interceptor are >> > similar in this regard although those are less risky. Even so, I think >> > there are clear use-cases for broker interceptors so I feel the risk >> part >> > is something that just needs to be documented. @Jay that is a good point >> > about moving from Message/MessageSet to Records although that may be >> less >> > difficult to absorb since it is a broker-side interceptor and so people >> > don't need to get a ton of applications in their company to switch to >> use >> > it. >> > >> > Re: onEnqueued: monitoring serialization latency can be done via metrics >> > but this is more useful for recording whether serialization succeeded or >> > not. onAcknowledgment subsumes this but it also subsumes other possible >> > errors (such as produce errors). It is more fine-grained than most >> people >> > need though (i.e., I don't think we will use it even if it is present.) >> > >> > Re: checksums: I think it is a good addition to metadata; and for >> > low-volume or super-critical topics can be used for very strict >> auditing. >> > >> > There are a couple of typos/edits for the wiki itself: >> > >> > - Under Kafka Producer changes: >> > - you have references to KafkaConsumer constructor and >> > ConsumerConfig.originals. >> > - sendRecord -> sentRecord (may be clearer) >> > - Under ProducerInterceptor interface: there is a mention of >> onEnqueued >> > which was rejected >> > - Comment for ConsumerRecord.record should probably be: // NEW: >> record >> > size in bytes (*after decompression*) >> > >> > >> > BTW - Anna, nice work on the KIP! >> > >> > Joel >> > >> > On Fri, Jan 29, 2016 at 6:57 AM, Neha Narkhede <n...@confluent.io> >> wrote: >> > >> > > Becket, >> > > >> > > Is your concern the presence of CRC in the RecordMetadata or do you >> want >> > to >> > > brainstorm how CRC can be used for auditing? I think we shouldn't try >> to >> > > think about the various ways that people can do monitoring using >> > > interceptors and the metadata we provide. The entire point of having >> > > pluggable interceptors is so that people can employ their own creative >> > > mechanisms to make use of interceptors. >> > > >> > > I do think that it is worth discussing whether or not CRC makes sense >> as >> > > record metadata to the user. My take is that the CRC is the best >> > size-bound >> > > summary of serialized record content available to us which is >> expensive >> > to >> > > recompute if the user were to redo it. I'd argue this summary of a >> record >> > > qualifies as its metadata. After all, we use the record CRC for a very >> > > important test of the system durability as it travels through the >> system. >> > > >> > > 1. Isn't the TopicPartition + Offset already uniquely identified a >> > message? >> > > > It seems better than CRC no matter from summary point of view or >> > auditing >> > > > point of view. >> > > >> > > >> > > The offset is a system-assigned value of uniqueness to the message. If >> > you >> > > trusted the system that much, you are not looking to monitor it >> > out-of-band >> > > :-) >> > > >> > > >> > > > 2. Currently CRC only has 4 bytes. So it will have collision when >> there >> > > are >> > > > more than ~4 billion messages. Take LinkedIn as an example, we have >> 1.3 >> > > > trillion messages per day. So there will be at least a couple of >> > hundreds >> > > > collision for each CRC code every day, whereas TopicPartition+Offset >> > will >> > > > not have any collision. >> > > >> > > >> > > The CRC isn't sent over the wire and doesn't add any extra overhead in >> > > processing, so what is your concern? If you aren't convinced about its >> > > usefulness, you can always use the default do-nothing interceptor at >> > > LinkedIn and ignore the CRC. >> > > >> > > Without having >> > > > the entire message bytes, they may not be able to verify its >> > correctness, >> > > > and the CRC could even be invalid if the broker ever overwritten any >> > > field >> > > > or did format conversion. >> > > > >> > > >> > > This doesn't make sense to me. The CRC is used for the most important >> > > durability check by Kafka - to verify that the message was not garbled >> > over >> > > the wire. The system can't change it; it has to match on the consumer >> > side >> > > or we will not return it to the user. >> > > >> > > On Fri, Jan 29, 2016 at 3:23 AM, Becket Qin <becket....@gmail.com> >> > wrote: >> > > >> > > > Anna, >> > > > >> > > > It is still not clear to me why we should expose CRC to end user. >> > > > Followings are my confusions. >> > > > >> > > > 1. Isn't the TopicPartition + Offset already uniquely identified a >> > > message? >> > > > It seems better than CRC no matter from summary point of view or >> > auditing >> > > > point of view. >> > > > >> > > > 2. Currently CRC only has 4 bytes. So it will have collision when >> there >> > > are >> > > > more than ~4 billion messages. Take LinkedIn as an example, we have >> 1.3 >> > > > trillion messages per day. So there will be at least a couple of >> > hundreds >> > > > collision for each CRC code every day, whereas TopicPartition+Offset >> > will >> > > > not have any collision. >> > > > >> > > > 3. CRC is calculated after all the fields have been filled in by >> > > producer, >> > > > including timestamp, attributes, etc. It might also get recomputed >> on >> > > > broker side. So if users only get CRC from record metadata. Without >> > > having >> > > > the entire message bytes, they may not be able to verify its >> > correctness, >> > > > and the CRC could even be invalid if the broker ever overwritten any >> > > field >> > > > or did format conversion. >> > > > >> > > > Thanks, >> > > > >> > > > Jiangjie (Becket) Qin >> > > > >> > > > >> > > > >> > > > >> > > > On Thu, Jan 28, 2016 at 5:58 PM, Anna Povzner <a...@confluent.io> >> > wrote: >> > > > >> > > > > On a second thought, yes, I think we should expose record size >> that >> > > > > represents application bytes. This is Becket's option #1. >> > > > > >> > > > > I updated the KIP wiki with new fields in RecordMetadata and >> > > > > ConsumerRecord. >> > > > > >> > > > > I would like to start a voting thread tomorrow if there are no >> > > objections >> > > > > or more things to discuss. >> > > > > >> > > > > Thanks, >> > > > > Anna >> > > > > >> > > > > >> > > > > >> > > > > On Thu, Jan 28, 2016 at 2:25 PM, Anna Povzner <a...@confluent.io> >> > > wrote: >> > > > > >> > > > > > Regarding record size as bytes sent over the wire, my concern is >> > that >> > > > it >> > > > > > is almost impossible to calculate per-record. We could do as: 1) >> > > > > compressed >> > > > > > bytes / number of records in a compressed message, as Todd >> > mentioned; >> > > > or >> > > > > 2) >> > > > > > or same as #1 but take it proportional to uncompressed record >> size >> > > vs. >> > > > > > total uncompressed size of records. All of these calculations >> give >> > us >> > > > an >> > > > > > estimate. So maybe record size as bytes sent over the wire is >> not a >> > > > > > per-record metadata, but rather per topic/partition measure >> that is >> > > > > better >> > > > > > to be exposed through metrics? >> > > > > > >> > > > > > >> > > > > > On Thu, Jan 28, 2016 at 2:09 PM, Todd Palino <tpal...@gmail.com >> > >> > > > wrote: >> > > > > > >> > > > > >> It may be difficult (or nearly impossible) to get actual >> > compressed >> > > > > bytes >> > > > > >> for a message from a compressed batch, but I do think it’s >> useful >> > > > > >> information to have available for the very reason noted, >> bandwidth >> > > > > >> consumed. Does it make sense to have an interceptor at the >> batch >> > > level >> > > > > >> that >> > > > > >> can provide this? The other option is to estimate it (such as >> > making >> > > > an >> > > > > >> assumption that the messages in a batch are equal in size, >> which >> > is >> > > > not >> > > > > >> necessarily true), which is probably not the right answer. >> > > > > >> >> > > > > >> -Todd >> > > > > >> >> > > > > >> >> > > > > >> On Thu, Jan 28, 2016 at 1:48 PM, Anna Povzner < >> a...@confluent.io> >> > > > > wrote: >> > > > > >> >> > > > > >> > Hi Becket, >> > > > > >> > >> > > > > >> > It will be up to the interceptor to implement their audit or >> > > > > monitoring >> > > > > >> > strategy. I would also imagine there is more than one good >> way >> > to >> > > do >> > > > > >> audit. >> > > > > >> > So, I agree that some of the interceptors may not use CRC, >> and >> > we >> > > > will >> > > > > >> not >> > > > > >> > require it. The question is now whether intercepting CRCs is >> > > > needed. I >> > > > > >> > think they are very useful for monitoring and audit, because >> CRC >> > > > > >> provides >> > > > > >> > an a easy way to get a summary of a message, rather than >> using >> > > > message >> > > > > >> > bytes or key/value objects. >> > > > > >> > >> > > > > >> > Regarding record size, I agree that bandwidth example was >> not a >> > > good >> > > > > >> one. I >> > > > > >> > think it would be hard to get actual bytes sent over the wire >> > > (your >> > > > > #2), >> > > > > >> > since multiple records get compressed together and we would >> need >> > > to >> > > > > >> decide >> > > > > >> > which bytes to account to which record. So I am inclined to >> only >> > > do >> > > > > your >> > > > > >> > #1. However, it still makes more sense to me just to return >> > record >> > > > > size >> > > > > >> > including the header, since this is the actual record size. >> > > > > >> > >> > > > > >> > Thanks, >> > > > > >> > Anna >> > > > > >> > >> > > > > >> > On Thu, Jan 28, 2016 at 11:46 AM, Becket Qin < >> > > becket....@gmail.com> >> > > > > >> wrote: >> > > > > >> > >> > > > > >> > > Anna, >> > > > > >> > > >> > > > > >> > > Using CRC to do end2end auditing might be very costly >> because >> > > you >> > > > > will >> > > > > >> > need >> > > > > >> > > to collect all the CRC from both producer and consumer. >> And it >> > > is >> > > > > >> based >> > > > > >> > on >> > > > > >> > > the assumption that broker does not modify the record. >> > > > > >> > > Can you shed some idea on how end to end auditing will be >> > using >> > > > the >> > > > > >> CRC >> > > > > >> > > before we decide to expose such low level detail to the end >> > > user? >> > > > It >> > > > > >> > would >> > > > > >> > > also be helpful if you can compare it with something like >> > > sequence >> > > > > >> number >> > > > > >> > > based auditing. >> > > > > >> > > >> > > > > >> > > About the record size, one thing worth notice is that the >> size >> > > of >> > > > > >> Record >> > > > > >> > is >> > > > > >> > > not the actual bytes sent over the wire if we use >> compression. >> > > So >> > > > > that >> > > > > >> > does >> > > > > >> > > not really tell user how much bandwidth they are using. >> > > > Personally I >> > > > > >> > think >> > > > > >> > > two kinds of size may be useful. >> > > > > >> > > 1. The record size after serialization, i.e. application >> > bytes. >> > > > (The >> > > > > >> > > uncompressed record size can be easily derived as well) >> > > > > >> > > 2. The actual bytes sent over the wire. >> > > > > >> > > We can get (1) easily, but (2) is difficult to get at >> Record >> > > level >> > > > > >> when >> > > > > >> > we >> > > > > >> > > use compression. >> > > > > >> > > >> > > > > >> > > Thanks, >> > > > > >> > > >> > > > > >> > > Jiangjie (Becket) Qin >> > > > > >> > > >> > > > > >> > > On Thu, Jan 28, 2016 at 10:55 AM, Anna Povzner < >> > > a...@confluent.io >> > > > > >> > > > > >> > wrote: >> > > > > >> > > >> > > > > >> > > > Hi Becket, >> > > > > >> > > > >> > > > > >> > > > The use-case for CRC is end-to-end audit, rather than >> > checking >> > > > > >> whether >> > > > > >> > a >> > > > > >> > > > single message is corrupt or not. >> > > > > >> > > > >> > > > > >> > > > Regarding record size, I was thinking to extract record >> size >> > > > from >> > > > > >> > Record. >> > > > > >> > > > That will include header overhead as well. I think total >> > > record >> > > > > size >> > > > > >> > will >> > > > > >> > > > tell users how much bandwidth their messages take. Since >> > > header >> > > > is >> > > > > >> > > > relatively small and constant, users also will get an >> idea >> > of >> > > > > their >> > > > > >> > > > key/value sizes. >> > > > > >> > > > >> > > > > >> > > > Thanks, >> > > > > >> > > > Anna >> > > > > >> > > > >> > > > > >> > > > On Thu, Jan 28, 2016 at 9:29 AM, Becket Qin < >> > > > becket....@gmail.com >> > > > > > >> > > > > >> > > wrote: >> > > > > >> > > > >> > > > > >> > > > > I am +1 on #1.2 and #3. >> > > > > >> > > > > >> > > > > >> > > > > #2: Regarding CRC, I am not sure if users care about >> CRC. >> > is >> > > > > there >> > > > > >> > any >> > > > > >> > > > > specific use case? Currently we validate messages by >> > calling >> > > > > >> > > > ensureValid() >> > > > > >> > > > > to verify the checksum and throw exception if it does >> not >> > > > match. >> > > > > >> > > > > >> > > > > >> > > > > Message size would be useful. We can add that to >> > > > ConsumerRecord. >> > > > > >> Can >> > > > > >> > > you >> > > > > >> > > > > clarify the message size you are referring to? Does it >> > > include >> > > > > the >> > > > > >> > > > message >> > > > > >> > > > > header overhead or not? From user's point of view, they >> > > > probably >> > > > > >> > don't >> > > > > >> > > > care >> > > > > >> > > > > about header size. >> > > > > >> > > > > >> > > > > >> > > > > Thanks, >> > > > > >> > > > > >> > > > > >> > > > > Jiangjie (Becket) Qin >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > >> > > > > On Wed, Jan 27, 2016 at 8:26 PM, Neha Narkhede < >> > > > > n...@confluent.io >> > > > > >> > >> > > > > >> > > > wrote: >> > > > > >> > > > > >> > > > > >> > > > > > Anna, >> > > > > >> > > > > > >> > > > > >> > > > > > Thanks for being diligent. >> > > > > >> > > > > > >> > > > > >> > > > > > +1 on #1.2 and sounds good on #3. I recommend adding >> > > > checksum >> > > > > >> and >> > > > > >> > > size >> > > > > >> > > > > > fields to RecordMetadata and ConsumerRecord instead >> of >> > > > > exposing >> > > > > >> > > > metadata >> > > > > >> > > > > > piecemeal in the interceptor APIs. >> > > > > >> > > > > > >> > > > > >> > > > > > Thanks, >> > > > > >> > > > > > Neha >> > > > > >> > > > > > >> > > > > >> > > > > > On Wed, Jan 27, 2016 at 4:10 PM, Anna Povzner < >> > > > > >> a...@confluent.io> >> > > > > >> > > > wrote: >> > > > > >> > > > > > >> > > > > >> > > > > > > Hi All, >> > > > > >> > > > > > > >> > > > > >> > > > > > > The KIP wiki page is now up-to-date with the scope >> we >> > > have >> > > > > >> agreed >> > > > > >> > > on: >> > > > > >> > > > > > > Producer and Consumer Interceptors with a minimal >> set >> > of >> > > > > >> mutable >> > > > > >> > > API >> > > > > >> > > > > that >> > > > > >> > > > > > > are not dependent on producer and consumer internal >> > > > > >> > implementation. >> > > > > >> > > > > > > >> > > > > >> > > > > > > I have few more API details that I would like to >> bring >> > > > > >> attention >> > > > > >> > to >> > > > > >> > > > > > or/and >> > > > > >> > > > > > > discuss: >> > > > > >> > > > > > > >> > > > > >> > > > > > > 1. Handling exceptions >> > > > > >> > > > > > > >> > > > > >> > > > > > > Exceptions can provide an additional level of >> control. >> > > For >> > > > > >> > example, >> > > > > >> > > > we >> > > > > >> > > > > > can >> > > > > >> > > > > > > filter messages on consumer side or stop messages >> on >> > > > > producer >> > > > > >> if >> > > > > >> > > they >> > > > > >> > > > > > don’t >> > > > > >> > > > > > > have the right field. >> > > > > >> > > > > > > >> > > > > >> > > > > > > I see two options: >> > > > > >> > > > > > > 1.1. For callbacks that can mutate records (onSend >> and >> > > > > >> > onConsume), >> > > > > >> > > > > > > propagate exceptions through the original calls >> > > > > >> > > (KafkaProducer.send() >> > > > > >> > > > > and >> > > > > >> > > > > > > KafkaConsumer.poll() respectively). For other >> > callbacks, >> > > > > catch >> > > > > >> > > > > exception, >> > > > > >> > > > > > > log, and ignore. >> > > > > >> > > > > > > 1.2. Catch exceptions from all the interceptor >> > callbacks >> > > > and >> > > > > >> > > ignore. >> > > > > >> > > > > > > >> > > > > >> > > > > > > The issue with 1.1. is that it effectively changes >> > > > > >> > > > KafkaProducer.send() >> > > > > >> > > > > > and >> > > > > >> > > > > > > KafkaConsumer.poll() API, since now they may throw >> > > > > exceptions >> > > > > >> > that >> > > > > >> > > > are >> > > > > >> > > > > > not >> > > > > >> > > > > > > documented in KafkaProducer/Consumer API. Another >> > option >> > > > is >> > > > > to >> > > > > >> > > allow >> > > > > >> > > > to >> > > > > >> > > > > > > propagate some exceptions, and ignore others. >> > > > > >> > > > > > > >> > > > > >> > > > > > > I think our use-cases do not require propagating >> > > > exceptions. >> > > > > >> So, >> > > > > >> > I >> > > > > >> > > > > > propose >> > > > > >> > > > > > > option 1.2. Unless someone has suggestion/use-cases >> > for >> > > > > >> > propagating >> > > > > >> > > > > > > exceptions. Please let me know. >> > > > > >> > > > > > > >> > > > > >> > > > > > > 2. Intercepting record CRC and record size >> > > > > >> > > > > > > >> > > > > >> > > > > > > Since we decided not to add any intermediate >> callbacks >> > > > (such >> > > > > >> as >> > > > > >> > > > > onEnqueue >> > > > > >> > > > > > > or onReceive) to interceptors, I think it is still >> > > > valuable >> > > > > to >> > > > > >> > > > > intercept >> > > > > >> > > > > > > record CRC and record size in bytes for monitoring >> and >> > > > audit >> > > > > >> > > > use-cases. >> > > > > >> > > > > > > >> > > > > >> > > > > > > I propose to add checksum and size fields to >> > > > RecordMetadata >> > > > > >> and >> > > > > >> > > > > > > ConsumerRecord. Another option would be to add >> them as >> > > > > >> parameters >> > > > > >> > > in >> > > > > >> > > > > > > onAcknowledgement() and onConsume() callbacks. >> > > > > >> > > > > > > >> > > > > >> > > > > > > 3. Callbacks that allow to modify records look as >> > > follows: >> > > > > >> > > > > > > ProducerRecord<K, V> onSend(ProducerRecord<K, V> >> > > record); >> > > > > >> > > > > > > ConsumerRecords<K, V> onConsume(ConsumerRecords<K, >> V> >> > > > > >> records); >> > > > > >> > > > > > > >> > > > > >> > > > > > > This means that interceptors can potentially modify >> > > > > >> > topic/partition >> > > > > >> > > > in >> > > > > >> > > > > > > ProducerRecord and topic/partition/offset in >> > > > > ConsumerRecord. I >> > > > > >> > > > propose >> > > > > >> > > > > > that >> > > > > >> > > > > > > it is up to the interceptor implementation to >> ensure >> > > that >> > > > > >> > > > > > topic/partition, >> > > > > >> > > > > > > etc is correct. KafkaProducer.send() will use >> topic, >> > > > > >> partition, >> > > > > >> > > key, >> > > > > >> > > > > and >> > > > > >> > > > > > > value from ProducerRecord returned from the >> onSend(). >> > > > > >> Similarly, >> > > > > >> > > > > > > ConsumerRecords returned from KafkaConsumer.poll() >> > would >> > > > be >> > > > > >> the >> > > > > >> > > ones >> > > > > >> > > > > > > returned from the interceptor. >> > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > > > Please let me know if you have any suggestions or >> > > > objections >> > > > > >> to >> > > > > >> > the >> > > > > >> > > > > > above. >> > > > > >> > > > > > > >> > > > > >> > > > > > > Thanks, >> > > > > >> > > > > > > Anna >> > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > > > On Wed, Jan 27, 2016 at 2:56 PM, Anna Povzner < >> > > > > >> a...@confluent.io >> > > > > >> > > >> > > > > >> > > > > wrote: >> > > > > >> > > > > > > >> > > > > >> > > > > > > > Hi Mayuresh, >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > I see why you would want to check for messages >> left >> > in >> > > > the >> > > > > >> > > > > > > > RecordAccumulator. However, I don't think this >> will >> > > > > >> completely >> > > > > >> > > > solve >> > > > > >> > > > > > the >> > > > > >> > > > > > > > problem. Messages could be in-flight somewhere >> else, >> > > > like >> > > > > in >> > > > > >> > the >> > > > > >> > > > > > socket, >> > > > > >> > > > > > > or >> > > > > >> > > > > > > > there maybe in-flight messages on the consumer >> side >> > of >> > > > the >> > > > > >> > > > > MirrorMaker. >> > > > > >> > > > > > > So, >> > > > > >> > > > > > > > if we go the route of checking whether there are >> any >> > > > > >> in-flight >> > > > > >> > > > > messages >> > > > > >> > > > > > > for >> > > > > >> > > > > > > > topic deletion use-case, maybe it is better count >> > them >> > > > > with >> > > > > >> > > > onSend() >> > > > > >> > > > > > and >> > > > > >> > > > > > > > onAcknowledge() -- whether all messages sent were >> > > > > >> > acknowledged. I >> > > > > >> > > > > also >> > > > > >> > > > > > > > think that it would be better to solve this >> without >> > > > > >> > interceptors, >> > > > > >> > > > > such >> > > > > >> > > > > > as >> > > > > >> > > > > > > > fix error handling in this scenario. However, I >> do >> > not >> > > > > have >> > > > > >> any >> > > > > >> > > > good >> > > > > >> > > > > > > > proposal right now, so these are just general >> > > thoughts. >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > Thanks, >> > > > > >> > > > > > > > Anna >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > On Wed, Jan 27, 2016 at 11:18 AM, Mayuresh >> Gharat < >> > > > > >> > > > > > > > gharatmayures...@gmail.com> wrote: >> > > > > >> > > > > > > > >> > > > > >> > > > > > > >> Calling producer.flush(), flushes all the data. >> So >> > > this >> > > > > is >> > > > > >> OK. >> > > > > >> > > But >> > > > > >> > > > > > when >> > > > > >> > > > > > > >> you >> > > > > >> > > > > > > >> are running Mirror maker, I am not sure there >> is a >> > > way >> > > > to >> > > > > >> > > flush() >> > > > > >> > > > > from >> > > > > >> > > > > > > >> outside. >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> Thanks, >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> Mayuresh >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> On Wed, Jan 27, 2016 at 11:08 AM, Becket Qin < >> > > > > >> > > > becket....@gmail.com> >> > > > > >> > > > > > > >> wrote: >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> > Mayuresh, >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> > Regarding your use case about mirror maker. >> Is it >> > > > good >> > > > > >> > enough >> > > > > >> > > as >> > > > > >> > > > > > long >> > > > > >> > > > > > > >> as we >> > > > > >> > > > > > > >> > know there is no message for the topic in the >> > > > producer >> > > > > >> > > anymore? >> > > > > >> > > > If >> > > > > >> > > > > > > that >> > > > > >> > > > > > > >> is >> > > > > >> > > > > > > >> > the case, call producer.flush() is sufficient. >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> > Thanks, >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> > Jiangjie (Becket) Qin >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> > On Tue, Jan 26, 2016 at 6:18 PM, Mayuresh >> Gharat >> > < >> > > > > >> > > > > > > >> > gharatmayures...@gmail.com >> > > > > >> > > > > > > >> > > wrote: >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> > > Hi Anna, >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > Thanks a lot for summarizing the discussion >> on >> > > this >> > > > > >> kip. >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > It LGTM. >> > > > > >> > > > > > > >> > > This is really nice : >> > > > > >> > > > > > > >> > > We decided not to add any callbacks to >> producer >> > > and >> > > > > >> > consumer >> > > > > >> > > > > > > >> > > interceptors that will depend on internal >> > > > > >> implementation >> > > > > >> > as >> > > > > >> > > > part >> > > > > >> > > > > > of >> > > > > >> > > > > > > >> this >> > > > > >> > > > > > > >> > > KIP. >> > > > > >> > > > > > > >> > > *However, it is possible to add them later >> as >> > > part >> > > > of >> > > > > >> > > another >> > > > > >> > > > > KIP >> > > > > >> > > > > > if >> > > > > >> > > > > > > >> > there >> > > > > >> > > > > > > >> > > are good use-cases.* >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > Do you agree with the use case I explained >> > > earlier >> > > > > for >> > > > > >> > > knowing >> > > > > >> > > > > the >> > > > > >> > > > > > > >> number >> > > > > >> > > > > > > >> > > of records left in the RecordAccumulator >> for a >> > > > > >> particular >> > > > > >> > > > topic. >> > > > > >> > > > > > It >> > > > > >> > > > > > > >> might >> > > > > >> > > > > > > >> > > be orthogonal to this KIP, but will be >> helpful. >> > > > What >> > > > > do >> > > > > >> > you >> > > > > >> > > > > think? >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > Thanks, >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > Mayuresh >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > On Tue, Jan 26, 2016 at 2:46 PM, Todd >> Palino < >> > > > > >> > > > tpal...@gmail.com >> > > > > >> > > > > > >> > > > > >> > > > > > > >> wrote: >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > > This looks good. As noted, having one >> mutable >> > > > > >> > interceptor >> > > > > >> > > on >> > > > > >> > > > > > each >> > > > > >> > > > > > > >> side >> > > > > >> > > > > > > >> > > > allows for the use cases we can envision >> > right >> > > > now, >> > > > > >> and >> > > > > >> > I >> > > > > >> > > > > think >> > > > > >> > > > > > > >> that’s >> > > > > >> > > > > > > >> > > > going to provide a great deal of >> opportunity >> > > for >> > > > > >> > > > implementing >> > > > > >> > > > > > > things >> > > > > >> > > > > > > >> > like >> > > > > >> > > > > > > >> > > > audit, especially within a multi-tenant >> > > > > environment. >> > > > > >> > > Looking >> > > > > >> > > > > > > >> forward to >> > > > > >> > > > > > > >> > > > getting this available in the clients. >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > Thanks! >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > -Todd >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > On Tue, Jan 26, 2016 at 2:36 PM, Anna >> > Povzner < >> > > > > >> > > > > > a...@confluent.io> >> > > > > >> > > > > > > >> > wrote: >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > > Hi All, >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > Here is meeting notes from today’s KIP >> > > meeting: >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > 1. We agreed to keep the scope of this >> KIP >> > to >> > > > be >> > > > > >> > > producer >> > > > > >> > > > > and >> > > > > >> > > > > > > >> > consumer >> > > > > >> > > > > > > >> > > > > interceptors only. Broker-side >> interceptor >> > > will >> > > > > be >> > > > > >> > added >> > > > > >> > > > > later >> > > > > >> > > > > > > as >> > > > > >> > > > > > > >> a >> > > > > >> > > > > > > >> > > > > separate KIP. The reasons were already >> > > > mentioned >> > > > > in >> > > > > >> > this >> > > > > >> > > > > > thread, >> > > > > >> > > > > > > >> but >> > > > > >> > > > > > > >> > > the >> > > > > >> > > > > > > >> > > > > summary is: >> > > > > >> > > > > > > >> > > > > * Broker interceptor is riskier and >> > requires >> > > > > >> careful >> > > > > >> > > > > > > >> consideration >> > > > > >> > > > > > > >> > > about >> > > > > >> > > > > > > >> > > > > overheads, whether to intercept leaders >> vs. >> > > > > >> > > > > leaders/replicas, >> > > > > >> > > > > > > >> what to >> > > > > >> > > > > > > >> > > do >> > > > > >> > > > > > > >> > > > on >> > > > > >> > > > > > > >> > > > > leader failover and so on. >> > > > > >> > > > > > > >> > > > > * Broker interceptors increase >> monitoring >> > > > > >> resolution, >> > > > > >> > > but >> > > > > >> > > > > not >> > > > > >> > > > > > > >> > > including >> > > > > >> > > > > > > >> > > > it >> > > > > >> > > > > > > >> > > > > in this KIP does not reduce usefulness >> of >> > > > > producer >> > > > > >> and >> > > > > >> > > > > > consumer >> > > > > >> > > > > > > >> > > > > interceptors that enable end-to-end >> > > monitoring >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > 2. We agreed to scope >> ProducerInterceptor >> > and >> > > > > >> > > > > > > ConsumerInterceptor >> > > > > >> > > > > > > >> > > > callbacks >> > > > > >> > > > > > > >> > > > > to minimal set of mutable API that are >> not >> > > > > >> dependent >> > > > > >> > on >> > > > > >> > > > > > producer >> > > > > >> > > > > > > >> and >> > > > > >> > > > > > > >> > > > > consumer internal implementation. >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > ProducerInterceptor: >> > > > > >> > > > > > > >> > > > > *ProducerRecord<K, V> >> > > onSend(ProducerRecord<K, >> > > > V> >> > > > > >> > > > record);* >> > > > > >> > > > > > > >> > > > > *void onAcknowledgement(RecordMetadata >> > > > metadata, >> > > > > >> > > Exception >> > > > > >> > > > > > > >> > exception);* >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > ConsumerInterceptor: >> > > > > >> > > > > > > >> > > > > *ConsumerRecords<K, V> >> > > > > >> onConsume(ConsumerRecords<K, V> >> > > > > >> > > > > > > records);* >> > > > > >> > > > > > > >> > > > > *void onCommit(Map<TopicPartition, >> > > > > >> OffsetAndMetadata> >> > > > > >> > > > > > offsets);* >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > We will allow interceptors to modify >> > > > > >> ProducerRecord on >> > > > > >> > > > > > producer >> > > > > >> > > > > > > >> side, >> > > > > >> > > > > > > >> > > and >> > > > > >> > > > > > > >> > > > > modify ConsumerRecords on consumer side. >> > This >> > > > > will >> > > > > >> > > support >> > > > > >> > > > > > > >> end-to-end >> > > > > >> > > > > > > >> > > > > monitoring and auditing and support the >> > > ability >> > > > > to >> > > > > >> add >> > > > > >> > > > > > metadata >> > > > > >> > > > > > > >> for a >> > > > > >> > > > > > > >> > > > > message. This will support Todd’s >> Auditing >> > > and >> > > > > >> Routing >> > > > > >> > > > > > > use-cases. >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > We did not find any use-case for >> modifying >> > > > > records >> > > > > >> in >> > > > > >> > > > > > > onConsume() >> > > > > >> > > > > > > >> > > > callback, >> > > > > >> > > > > > > >> > > > > but decided to enable modification of >> > > consumer >> > > > > >> records >> > > > > >> > > for >> > > > > >> > > > > > > >> symmetry >> > > > > >> > > > > > > >> > > with >> > > > > >> > > > > > > >> > > > > onSend(). >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > 3. We agreed to ensure compatibility >> > when/if >> > > we >> > > > > add >> > > > > >> > new >> > > > > >> > > > > > methods >> > > > > >> > > > > > > to >> > > > > >> > > > > > > >> > > > > ProducerInterceptor and >> ConsumerInterceptor >> > > by >> > > > > >> using >> > > > > >> > > > default >> > > > > >> > > > > > > >> methods >> > > > > >> > > > > > > >> > > with >> > > > > >> > > > > > > >> > > > > an empty implementation. Ok to assume >> Java >> > 8. >> > > > > >> (This is >> > > > > >> > > > > > Ismael’s >> > > > > >> > > > > > > >> > method >> > > > > >> > > > > > > >> > > > #2). >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > 4. We decided not to add any callbacks >> to >> > > > > producer >> > > > > >> and >> > > > > >> > > > > > consumer >> > > > > >> > > > > > > >> > > > > interceptors that will depend on >> internal >> > > > > >> > implementation >> > > > > >> > > > as >> > > > > >> > > > > > part >> > > > > >> > > > > > > >> of >> > > > > >> > > > > > > >> > > this >> > > > > >> > > > > > > >> > > > > KIP. However, it is possible to add them >> > > later >> > > > as >> > > > > >> part >> > > > > >> > > of >> > > > > >> > > > > > > another >> > > > > >> > > > > > > >> KIP >> > > > > >> > > > > > > >> > > if >> > > > > >> > > > > > > >> > > > > there are good use-cases. >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > *Reasoning.* We did not have concrete >> > > use-cases >> > > > > >> that >> > > > > >> > > > > justified >> > > > > >> > > > > > > >> more >> > > > > >> > > > > > > >> > > > methods >> > > > > >> > > > > > > >> > > > > at this point. Some of the use-cases >> were >> > for >> > > > > more >> > > > > >> > > > > fine-grain >> > > > > >> > > > > > > >> latency >> > > > > >> > > > > > > >> > > > > collection, which could be done with >> Kafka >> > > > > Metrics. >> > > > > >> > > > Another >> > > > > >> > > > > > > >> use-case >> > > > > >> > > > > > > >> > > was >> > > > > >> > > > > > > >> > > > > encryption. However, there are several >> > design >> > > > > >> options >> > > > > >> > > for >> > > > > >> > > > > > > >> encryption. >> > > > > >> > > > > > > >> > > One >> > > > > >> > > > > > > >> > > > > is to do per-record encryption which >> would >> > > > > require >> > > > > >> > > adding >> > > > > >> > > > > > > >> > > > > ProducerInterceptor.onEnqueued() and >> > > > > >> > > > > > > >> ConsumerInterceptor.onReceive(). >> > > > > >> > > > > > > >> > > One >> > > > > >> > > > > > > >> > > > > could argue that in that case encryption >> > > could >> > > > be >> > > > > >> done >> > > > > >> > > by >> > > > > >> > > > > > > adding a >> > > > > >> > > > > > > >> > > custom >> > > > > >> > > > > > > >> > > > > serializer/deserializer. Another option >> is >> > to >> > > > do >> > > > > >> > > > encryption >> > > > > >> > > > > > > after >> > > > > >> > > > > > > >> > > message >> > > > > >> > > > > > > >> > > > > gets compressed, but there are issues >> that >> > > > arise >> > > > > >> > > regarding >> > > > > >> > > > > > > broker >> > > > > >> > > > > > > >> > doing >> > > > > >> > > > > > > >> > > > > re-compression. We decided that it is >> > better >> > > to >> > > > > >> have >> > > > > >> > > that >> > > > > >> > > > > > > >> discussion >> > > > > >> > > > > > > >> > > in a >> > > > > >> > > > > > > >> > > > > separate KIP and decide that this is >> > > something >> > > > we >> > > > > >> want >> > > > > >> > > to >> > > > > >> > > > do >> > > > > >> > > > > > > with >> > > > > >> > > > > > > >> > > > > interceptors or by other means. >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > Todd, Mayuresh and others who missed the >> > KIP >> > > > > >> meeting, >> > > > > >> > > > please >> > > > > >> > > > > > let >> > > > > >> > > > > > > >> me >> > > > > >> > > > > > > >> > > know >> > > > > >> > > > > > > >> > > > > your thoughts on the scope we agreed on >> > > during >> > > > > the >> > > > > >> > > > meeting. >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > I will update the KIP proposal with the >> > > current >> > > > > >> > decision >> > > > > >> > > > by >> > > > > >> > > > > > end >> > > > > >> > > > > > > of >> > > > > >> > > > > > > >> > > today. >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > Thanks, >> > > > > >> > > > > > > >> > > > > Anna >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > On Tue, Jan 26, 2016 at 11:41 AM, >> Mayuresh >> > > > > Gharat < >> > > > > >> > > > > > > >> > > > > gharatmayures...@gmail.com> wrote: >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > > > Hi, >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > I won't be able to make it to KIP >> hangout >> > > due >> > > > > to >> > > > > >> > > > conflict. >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > Anna, here is the use case where >> knowing >> > if >> > > > > there >> > > > > >> > are >> > > > > >> > > > > > messages >> > > > > >> > > > > > > >> in >> > > > > >> > > > > > > >> > the >> > > > > >> > > > > > > >> > > > > > RecordAccumulator left to be sent to >> the >> > > > kafka >> > > > > >> > cluster >> > > > > >> > > > > for a >> > > > > >> > > > > > > >> topic >> > > > > >> > > > > > > >> > is >> > > > > >> > > > > > > >> > > > > > useful. >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > 1) Consider a pipeline : >> > > > > >> > > > > > > >> > > > > > A ---> Mirror-maker -----> B >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > 2) We have a topic T in cluster A >> > mirrored >> > > to >> > > > > >> > cluster >> > > > > >> > > B. >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > 3) Now if we delete topic T in A and >> > > > > immediately >> > > > > >> > > proceed >> > > > > >> > > > > to >> > > > > >> > > > > > > >> delete >> > > > > >> > > > > > > >> > > the >> > > > > >> > > > > > > >> > > > > > topic in cluster B, some of the the >> > > > > Mirror-maker >> > > > > >> > > > machines >> > > > > >> > > > > > die >> > > > > >> > > > > > > >> > because >> > > > > >> > > > > > > >> > > > > > atleast one of the batches in >> > > > RecordAccumulator >> > > > > >> for >> > > > > >> > > > topic >> > > > > >> > > > > T >> > > > > >> > > > > > > >> fail to >> > > > > >> > > > > > > >> > > be >> > > > > >> > > > > > > >> > > > > > produced to cluster B. We have seen >> this >> > > > > >> happening >> > > > > >> > in >> > > > > >> > > > our >> > > > > >> > > > > > > >> clusters. >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > If we know that there are no more >> > messages >> > > > left >> > > > > >> in >> > > > > >> > the >> > > > > >> > > > > > > >> > > > RecordAccumulator >> > > > > >> > > > > > > >> > > > > to >> > > > > >> > > > > > > >> > > > > > be produced to cluster B, we can >> safely >> > > > delete >> > > > > >> the >> > > > > >> > > topic >> > > > > >> > > > > in >> > > > > >> > > > > > > >> > cluster B >> > > > > >> > > > > > > >> > > > > > without disturbing the pipeline. >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > Mayuresh >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > On Tue, Jan 26, 2016 at 10:31 AM, Anna >> > > > Povzner >> > > > > < >> > > > > >> > > > > > > >> a...@confluent.io> >> > > > > >> > > > > > > >> > > > > wrote: >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > > Thanks Ismael and Todd for your >> > feedback! >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > I agree about coming up with lean, >> but >> > > > useful >> > > > > >> > > > interfaces >> > > > > >> > > > > > > that >> > > > > >> > > > > > > >> > will >> > > > > >> > > > > > > >> > > be >> > > > > >> > > > > > > >> > > > > > easy >> > > > > >> > > > > > > >> > > > > > > to extend later. >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > When we discuss the minimal set of >> > > producer >> > > > > and >> > > > > >> > > > consumer >> > > > > >> > > > > > > >> > > interceptor >> > > > > >> > > > > > > >> > > > > API >> > > > > >> > > > > > > >> > > > > > in >> > > > > >> > > > > > > >> > > > > > > today’s KIP meeting (discussion >> item #2 >> > > in >> > > > my >> > > > > >> > > previous >> > > > > >> > > > > > > email), >> > > > > >> > > > > > > >> > lets >> > > > > >> > > > > > > >> > > > > > compare >> > > > > >> > > > > > > >> > > > > > > two options: >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > *1. Minimal set of immutable API for >> > > > producer >> > > > > >> and >> > > > > >> > > > > consumer >> > > > > >> > > > > > > >> > > > > interceptors* >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > ProducerInterceptor: >> > > > > >> > > > > > > >> > > > > > > public void >> onSend(ProducerRecord<K, V> >> > > > > >> record); >> > > > > >> > > > > > > >> > > > > > > public void >> > > > onAcknowledgement(RecordMetadata >> > > > > >> > > metadata, >> > > > > >> > > > > > > >> Exception >> > > > > >> > > > > > > >> > > > > > > exception); >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > ConsumerInterceptor: >> > > > > >> > > > > > > >> > > > > > > public void >> > onConsume(ConsumerRecords<K, >> > > V> >> > > > > >> > > records); >> > > > > >> > > > > > > >> > > > > > > public void >> > onCommit(Map<TopicPartition, >> > > > > >> > > > > > OffsetAndMetadata> >> > > > > >> > > > > > > >> > > offsets); >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > Use-cases: >> > > > > >> > > > > > > >> > > > > > > — end-to-end monitoring; custom >> tracing >> > > and >> > > > > >> > logging >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > *2. Minimal set of mutable API for >> > > producer >> > > > > and >> > > > > >> > > > consumer >> > > > > >> > > > > > > >> > > > interceptors* >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > ProducerInterceptor: >> > > > > >> > > > > > > >> > > > > > > ProducerRecord<K, V> >> > > > onSend(ProducerRecord<K, >> > > > > >> V> >> > > > > >> > > > > record); >> > > > > >> > > > > > > >> > > > > > > void >> onAcknowledgement(RecordMetadata >> > > > > metadata, >> > > > > >> > > > > Exception >> > > > > >> > > > > > > >> > > exception); >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > ConsumerInterceptor: >> > > > > >> > > > > > > >> > > > > > > void onConsume(ConsumerRecords<K, V> >> > > > > records); >> > > > > >> > > > > > > >> > > > > > > void onCommit(Map<TopicPartition, >> > > > > >> > OffsetAndMetadata> >> > > > > >> > > > > > > offsets); >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > Additional use-cases to #1: >> > > > > >> > > > > > > >> > > > > > > — Ability to add metadata to a >> message >> > or >> > > > > fill >> > > > > >> in >> > > > > >> > > > > standard >> > > > > >> > > > > > > >> fields >> > > > > >> > > > > > > >> > > for >> > > > > >> > > > > > > >> > > > > > audit >> > > > > >> > > > > > > >> > > > > > > and routing. >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > Implications >> > > > > >> > > > > > > >> > > > > > > — Partition assignment will be done >> > based >> > > > on >> > > > > >> > > modified >> > > > > >> > > > > > > >> key/value >> > > > > >> > > > > > > >> > > > instead >> > > > > >> > > > > > > >> > > > > > of >> > > > > >> > > > > > > >> > > > > > > original key/value. If key/value >> > > > > >> transformation is >> > > > > >> > > not >> > > > > >> > > > > > > >> consistent >> > > > > >> > > > > > > >> > > > (same >> > > > > >> > > > > > > >> > > > > > key >> > > > > >> > > > > > > >> > > > > > > and value does not mutate to the >> same, >> > > but >> > > > > >> > modified, >> > > > > >> > > > > > > >> key/value), >> > > > > >> > > > > > > >> > > then >> > > > > >> > > > > > > >> > > > > log >> > > > > >> > > > > > > >> > > > > > > compaction would not work. However, >> > audit >> > > > and >> > > > > >> > > routing >> > > > > >> > > > > > > >> use-cases >> > > > > >> > > > > > > >> > > from >> > > > > >> > > > > > > >> > > > > Todd >> > > > > >> > > > > > > >> > > > > > > will likely do consistent >> > transformation. >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > *Additional callbacks (discussion >> item >> > #3 >> > > > in >> > > > > my >> > > > > >> > > > previous >> > > > > >> > > > > > > >> email):* >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > If we want to support encryption, we >> > > would >> > > > > >> want to >> > > > > >> > > be >> > > > > >> > > > > able >> > > > > >> > > > > > > to >> > > > > >> > > > > > > >> > > modify >> > > > > >> > > > > > > >> > > > > > > serialized key/value, rather than >> key >> > and >> > > > > value >> > > > > >> > > > objects. >> > > > > >> > > > > > > This >> > > > > >> > > > > > > >> > will >> > > > > >> > > > > > > >> > > > add >> > > > > >> > > > > > > >> > > > > > the >> > > > > >> > > > > > > >> > > > > > > following API to producer and >> consumer >> > > > > >> > interceptors: >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > ProducerInterceptor: >> > > > > >> > > > > > > >> > > > > > > SerializedKeyValue >> > > > onEnqueued(TopicPartition >> > > > > >> tp, >> > > > > >> > > > > > > >> > ProducerRecord<K, >> > > > > >> > > > > > > >> > > V> >> > > > > >> > > > > > > >> > > > > > > record, SerializedKeyValue >> > > > > serializedKeyValue); >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > ConsumerInterceptor: >> > > > > >> > > > > > > >> > > > > > > SerializedKeyValue >> > > onReceive(TopicPartition >> > > > > tp, >> > > > > >> > > > > > > >> > SerializedKeyValue >> > > > > >> > > > > > > >> > > > > > > serializedKeyValue); >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > I am leaning towards implementing >> the >> > > > minimal >> > > > > >> set >> > > > > >> > of >> > > > > >> > > > > > > >> immutable or >> > > > > >> > > > > > > >> > > > > mutable >> > > > > >> > > > > > > >> > > > > > > interfaces, making sure that we >> have a >> > > > > >> > compatibility >> > > > > >> > > > > plan >> > > > > >> > > > > > > that >> > > > > >> > > > > > > >> > > allows >> > > > > >> > > > > > > >> > > > > us >> > > > > >> > > > > > > >> > > > > > to >> > > > > >> > > > > > > >> > > > > > > add more callbacks in the future >> (per >> > > > Ismael >> > > > > >> > > comment), >> > > > > >> > > > > and >> > > > > >> > > > > > > add >> > > > > >> > > > > > > >> > more >> > > > > >> > > > > > > >> > > > > APIs >> > > > > >> > > > > > > >> > > > > > > later. E.g., for encryption >> use-case, >> > > there >> > > > > >> could >> > > > > >> > be >> > > > > >> > > > an >> > > > > >> > > > > > > >> argument >> > > > > >> > > > > > > >> > in >> > > > > >> > > > > > > >> > > > > doing >> > > > > >> > > > > > > >> > > > > > > encryption after message compression >> > vs. >> > > > > >> > per-record >> > > > > >> > > > > > > encryption >> > > > > >> > > > > > > >> > that >> > > > > >> > > > > > > >> > > > > could >> > > > > >> > > > > > > >> > > > > > > be done using the above additional >> API. >> > > > There >> > > > > >> is >> > > > > >> > > also >> > > > > >> > > > > more >> > > > > >> > > > > > > >> > > > implications >> > > > > >> > > > > > > >> > > > > > for >> > > > > >> > > > > > > >> > > > > > > every API that modifies records: >> > > modifying >> > > > > >> > > serialized >> > > > > >> > > > > > > >> key/value >> > > > > >> > > > > > > >> > > will >> > > > > >> > > > > > > >> > > > > > again >> > > > > >> > > > > > > >> > > > > > > impact partition assignment (we will >> > > likely >> > > > > do >> > > > > >> > that >> > > > > >> > > > > after >> > > > > >> > > > > > > >> > partition >> > > > > >> > > > > > > >> > > > > > > assignment), which may impact log >> > > > compaction >> > > > > >> and >> > > > > >> > > > mirror >> > > > > >> > > > > > > maker >> > > > > >> > > > > > > >> > > > > > partitioning. >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > Anna >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > On Tue, Jan 26, 2016 at 7:26 AM, >> Todd >> > > > Palino >> > > > > < >> > > > > >> > > > > > > >> tpal...@gmail.com> >> > > > > >> > > > > > > >> > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > > > Finally got a chance to take a >> look >> > at >> > > > > this. >> > > > > >> I >> > > > > >> > > won’t >> > > > > >> > > > > be >> > > > > >> > > > > > > >> able to >> > > > > >> > > > > > > >> > > > make >> > > > > >> > > > > > > >> > > > > > the >> > > > > >> > > > > > > >> > > > > > > > KIP meeting due to a conflict. >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > I’m somewhat disappointed in this >> > > > > proposal. I >> > > > > >> > > think >> > > > > >> > > > > that >> > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > explicit >> > > > > >> > > > > > > >> > > > > > > > exclusion of modification of the >> > > messages >> > > > > is >> > > > > >> > > > > > > short-sighted, >> > > > > >> > > > > > > >> and >> > > > > >> > > > > > > >> > > not >> > > > > >> > > > > > > >> > > > > > > > accounting for it now is going to >> > bite >> > > us >> > > > > >> later. >> > > > > >> > > > Jay, >> > > > > >> > > > > > > aren’t >> > > > > >> > > > > > > >> > you >> > > > > >> > > > > > > >> > > > the >> > > > > >> > > > > > > >> > > > > > one >> > > > > >> > > > > > > >> > > > > > > > railing against public interfaces >> and >> > > how >> > > > > >> > > difficult >> > > > > >> > > > > they >> > > > > >> > > > > > > >> are to >> > > > > >> > > > > > > >> > > > work >> > > > > >> > > > > > > >> > > > > > with >> > > > > >> > > > > > > >> > > > > > > > when you don’t get them right? The >> > > > “simple” >> > > > > >> > change >> > > > > >> > > > to >> > > > > >> > > > > > one >> > > > > >> > > > > > > of >> > > > > >> > > > > > > >> > > these >> > > > > >> > > > > > > >> > > > > > > > interfaces to make it able to >> return >> > a >> > > > > >> record is >> > > > > >> > > > going >> > > > > >> > > > > > to >> > > > > >> > > > > > > >> be a >> > > > > >> > > > > > > >> > > > > > > significant >> > > > > >> > > > > > > >> > > > > > > > change and is going to require all >> > > > clients >> > > > > to >> > > > > >> > > > rewrite >> > > > > >> > > > > > > their >> > > > > >> > > > > > > >> > > > > > interceptors. >> > > > > >> > > > > > > >> > > > > > > > If we’re not willing to put the >> time >> > to >> > > > > think >> > > > > >> > > > through >> > > > > >> > > > > > > >> > > manipulation >> > > > > >> > > > > > > >> > > > > now, >> > > > > >> > > > > > > >> > > > > > > > then this KIP should be shelved >> until >> > > we >> > > > > are. >> > > > > >> > > > > > Implementing >> > > > > >> > > > > > > >> > > > something >> > > > > >> > > > > > > >> > > > > > > > halfway is going to be worse than >> > > taking >> > > > a >> > > > > >> > little >> > > > > >> > > > > > longer. >> > > > > >> > > > > > > In >> > > > > >> > > > > > > >> > > > > addition, >> > > > > >> > > > > > > >> > > > > > I >> > > > > >> > > > > > > >> > > > > > > > don’t believe that manipulation >> > > requires >> > > > > >> > anything >> > > > > >> > > > more >> > > > > >> > > > > > > than >> > > > > >> > > > > > > >> > > > > > interceptors >> > > > > >> > > > > > > >> > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > receive the full record, and then >> to >> > > > return >> > > > > >> it. >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > There are 3 use case I can think >> of >> > > right >> > > > > now >> > > > > >> > > > without >> > > > > >> > > > > > any >> > > > > >> > > > > > > >> deep >> > > > > >> > > > > > > >> > > > > > discussion >> > > > > >> > > > > > > >> > > > > > > > that can make use of interceptors >> > with >> > > > > >> > > modification: >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > 1. Auditing. The ability to add >> > > metadata >> > > > > to a >> > > > > >> > > > message >> > > > > >> > > > > > for >> > > > > >> > > > > > > >> > > auditing >> > > > > >> > > > > > > >> > > > is >> > > > > >> > > > > > > >> > > > > > > > critical. Hostname, service name, >> > > > > timestamps, >> > > > > >> > etc. >> > > > > >> > > > are >> > > > > >> > > > > > all >> > > > > >> > > > > > > >> > pieces >> > > > > >> > > > > > > >> > > > of >> > > > > >> > > > > > > >> > > > > > data >> > > > > >> > > > > > > >> > > > > > > > that can be used on the other >> side of >> > > the >> > > > > >> > pipeline >> > > > > >> > > > to >> > > > > >> > > > > > > >> > categorize >> > > > > >> > > > > > > >> > > > > > > messages, >> > > > > >> > > > > > > >> > > > > > > > determine loss and transport time, >> > and >> > > > pin >> > > > > >> down >> > > > > >> > > > > issues. >> > > > > >> > > > > > > You >> > > > > >> > > > > > > >> may >> > > > > >> > > > > > > >> > > say >> > > > > >> > > > > > > >> > > > > > that >> > > > > >> > > > > > > >> > > > > > > > these things can just be part of >> the >> > > > > message >> > > > > >> > > schema, >> > > > > >> > > > > but >> > > > > >> > > > > > > >> anyone >> > > > > >> > > > > > > >> > > who >> > > > > >> > > > > > > >> > > > > has >> > > > > >> > > > > > > >> > > > > > > > worked with a multi-user data >> system >> > > > > >> (especially >> > > > > >> > > > those >> > > > > >> > > > > > who >> > > > > >> > > > > > > >> have >> > > > > >> > > > > > > >> > > > been >> > > > > >> > > > > > > >> > > > > > > > involved with LinkedIn) know how >> > > > difficult >> > > > > >> it is >> > > > > >> > > to >> > > > > >> > > > > > > maintain >> > > > > >> > > > > > > >> > > > > consistent >> > > > > >> > > > > > > >> > > > > > > > message schemas and to get other >> > people >> > > > to >> > > > > >> put >> > > > > >> > in >> > > > > >> > > > > fields >> > > > > >> > > > > > > for >> > > > > >> > > > > > > >> > your >> > > > > >> > > > > > > >> > > > > use. >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > 2. Encryption. This is probably >> the >> > > most >> > > > > >> obvious >> > > > > >> > > > case >> > > > > >> > > > > > for >> > > > > >> > > > > > > >> > record >> > > > > >> > > > > > > >> > > > > > > > manipulation on both sides. The >> > ability >> > > > to >> > > > > >> tie >> > > > > >> > in >> > > > > >> > > > end >> > > > > >> > > > > to >> > > > > >> > > > > > > end >> > > > > >> > > > > > > >> > > > > encryption >> > > > > >> > > > > > > >> > > > > > > is >> > > > > >> > > > > > > >> > > > > > > > important for data that requires >> > > external >> > > > > >> > > compliance >> > > > > >> > > > > > (PCI, >> > > > > >> > > > > > > >> > HIPAA, >> > > > > >> > > > > > > >> > > > > > etc.). >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > 3. Routing. By being able to add a >> > bit >> > > of >> > > > > >> > > > information >> > > > > >> > > > > > > about >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > > > > source >> > > > > >> > > > > > > >> > > > > > or >> > > > > >> > > > > > > >> > > > > > > > destination of a message to the >> > > metadata, >> > > > > you >> > > > > >> > can >> > > > > >> > > > > easily >> > > > > >> > > > > > > >> > > construct >> > > > > >> > > > > > > >> > > > an >> > > > > >> > > > > > > >> > > > > > > > intelligent mirror maker that can >> > > prevent >> > > > > >> loops. >> > > > > >> > > > This >> > > > > >> > > > > > has >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > > > > > opportunity >> > > > > >> > > > > > > >> > > > > > > > to result in significant >> operational >> > > > > >> savings, as >> > > > > >> > > you >> > > > > >> > > > > can >> > > > > >> > > > > > > get >> > > > > >> > > > > > > >> > rid >> > > > > >> > > > > > > >> > > of >> > > > > >> > > > > > > >> > > > > the >> > > > > >> > > > > > > >> > > > > > > > need for tiered clusters in order >> to >> > > > > prevent >> > > > > >> > loops >> > > > > >> > > > in >> > > > > >> > > > > > > >> mirroring >> > > > > >> > > > > > > >> > > > > > messages. >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > All three of these share the >> feature >> > > that >> > > > > >> they >> > > > > >> > add >> > > > > >> > > > > > > metadata >> > > > > >> > > > > > > >> to >> > > > > >> > > > > > > >> > > > > > messages. >> > > > > >> > > > > > > >> > > > > > > > With the pushback on having >> arbitrary >> > > > > >> metadata >> > > > > >> > as >> > > > > >> > > an >> > > > > >> > > > > > > >> “envelope” >> > > > > >> > > > > > > >> > > to >> > > > > >> > > > > > > >> > > > > the >> > > > > >> > > > > > > >> > > > > > > > message, this is a way to provide >> it >> > > and >> > > > > >> make it >> > > > > >> > > the >> > > > > >> > > > > > > >> > > responsibility >> > > > > >> > > > > > > >> > > > > of >> > > > > >> > > > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > client, and not the Kafka broker >> and >> > > > system >> > > > > >> > > itself. >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > -Todd >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > On Tue, Jan 26, 2016 at 2:30 AM, >> > Ismael >> > > > > Juma >> > > > > >> < >> > > > > >> > > > > > > >> > ism...@juma.me.uk> >> > > > > >> > > > > > > >> > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > Hi Anna and Neha, >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > I think it makes a lot of sense >> to >> > > try >> > > > > and >> > > > > >> > keep >> > > > > >> > > > the >> > > > > >> > > > > > > >> interface >> > > > > >> > > > > > > >> > > > lean >> > > > > >> > > > > > > >> > > > > > and >> > > > > >> > > > > > > >> > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > add more methods later when/if >> > there >> > > > is a >> > > > > >> > need. >> > > > > >> > > > What >> > > > > >> > > > > > is >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > > > current >> > > > > >> > > > > > > >> > > > > > > > > thinking with regards to >> > > compatibility >> > > > > >> when/if >> > > > > >> > > we >> > > > > >> > > > > add >> > > > > >> > > > > > > new >> > > > > >> > > > > > > >> > > > methods? >> > > > > >> > > > > > > >> > > > > A >> > > > > >> > > > > > > >> > > > > > > few >> > > > > >> > > > > > > >> > > > > > > > > options come to mind: >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > 1. Change the interface to an >> > > abstract >> > > > > >> class >> > > > > >> > > with >> > > > > >> > > > > > empty >> > > > > >> > > > > > > >> > > > > > implementations >> > > > > >> > > > > > > >> > > > > > > > for >> > > > > >> > > > > > > >> > > > > > > > > all the methods. This means that >> > the >> > > > path >> > > > > >> to >> > > > > >> > > > adding >> > > > > >> > > > > > new >> > > > > >> > > > > > > >> > methods >> > > > > >> > > > > > > >> > > > is >> > > > > >> > > > > > > >> > > > > > > clear. >> > > > > >> > > > > > > >> > > > > > > > > 2. Hope we have moved to Java 8 >> by >> > > the >> > > > > >> time we >> > > > > >> > > > need >> > > > > >> > > > > to >> > > > > >> > > > > > > add >> > > > > >> > > > > > > >> > new >> > > > > >> > > > > > > >> > > > > > methods >> > > > > >> > > > > > > >> > > > > > > > and >> > > > > >> > > > > > > >> > > > > > > > > use default methods with an >> empty >> > > > > >> > implementation >> > > > > >> > > > for >> > > > > >> > > > > > any >> > > > > >> > > > > > > >> new >> > > > > >> > > > > > > >> > > > method >> > > > > >> > > > > > > >> > > > > > > (and >> > > > > >> > > > > > > >> > > > > > > > > potentially make existing >> methods >> > > > default >> > > > > >> > > methods >> > > > > >> > > > > too >> > > > > >> > > > > > at >> > > > > >> > > > > > > >> that >> > > > > >> > > > > > > >> > > > point >> > > > > >> > > > > > > >> > > > > > for >> > > > > >> > > > > > > >> > > > > > > > > consistency) >> > > > > >> > > > > > > >> > > > > > > > > 3. Introduce a new interface >> that >> > > > > inherits >> > > > > >> > from >> > > > > >> > > > the >> > > > > >> > > > > > > >> existing >> > > > > >> > > > > > > >> > > > > > > Interceptor >> > > > > >> > > > > > > >> > > > > > > > > interface when we need to add >> new >> > > > > methods. >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > Option 1 is the easiest and it >> also >> > > > means >> > > > > >> that >> > > > > >> > > > > > > interceptor >> > > > > >> > > > > > > >> > > users >> > > > > >> > > > > > > >> > > > > only >> > > > > >> > > > > > > >> > > > > > > > need >> > > > > >> > > > > > > >> > > > > > > > > to override the methods that >> they >> > are >> > > > > >> > interested >> > > > > >> > > > > (more >> > > > > >> > > > > > > >> useful >> > > > > >> > > > > > > >> > > if >> > > > > >> > > > > > > >> > > > > the >> > > > > >> > > > > > > >> > > > > > > > number >> > > > > >> > > > > > > >> > > > > > > > > of methods grows). The downside >> is >> > > that >> > > > > >> > > > interceptor >> > > > > >> > > > > > > >> > > > implementations >> > > > > >> > > > > > > >> > > > > > > > cannot >> > > > > >> > > > > > > >> > > > > > > > > inherit from another class (a >> > > > > >> straightforward >> > > > > >> > > > > > workaround >> > > > > >> > > > > > > >> is >> > > > > >> > > > > > > >> > to >> > > > > >> > > > > > > >> > > > make >> > > > > >> > > > > > > >> > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > interceptor a forwarder that >> calls >> > > > > another >> > > > > >> > > class). >> > > > > >> > > > > > Also, >> > > > > >> > > > > > > >> our >> > > > > >> > > > > > > >> > > > > existing >> > > > > >> > > > > > > >> > > > > > > > > callbacks are interfaces, so >> seems >> > a >> > > > bit >> > > > > >> > > > > inconsistent. >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > Option 2 may be the most >> appealing >> > > one >> > > > as >> > > > > >> both >> > > > > >> > > > users >> > > > > >> > > > > > and >> > > > > >> > > > > > > >> > > > ourselves >> > > > > >> > > > > > > >> > > > > > > retain >> > > > > >> > > > > > > >> > > > > > > > > flexibility. The main downside >> is >> > > that >> > > > it >> > > > > >> > relies >> > > > > >> > > > on >> > > > > >> > > > > us >> > > > > >> > > > > > > >> moving >> > > > > >> > > > > > > >> > > to >> > > > > >> > > > > > > >> > > > > Java >> > > > > >> > > > > > > >> > > > > > > 8, >> > > > > >> > > > > > > >> > > > > > > > > which may be more than a year >> away >> > > > > >> potentially >> > > > > >> > > (if >> > > > > >> > > > > we >> > > > > >> > > > > > > >> support >> > > > > >> > > > > > > >> > > the >> > > > > >> > > > > > > >> > > > > > last >> > > > > >> > > > > > > >> > > > > > > 2 >> > > > > >> > > > > > > >> > > > > > > > > Java releases). >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > Thoughts? >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > Ismael >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > On Tue, Jan 26, 2016 at 4:59 AM, >> > Neha >> > > > > >> > Narkhede < >> > > > > >> > > > > > > >> > > > n...@confluent.io> >> > > > > >> > > > > > > >> > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > Anna, >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > I'm also in favor of including >> > just >> > > > the >> > > > > >> APIs >> > > > > >> > > for >> > > > > >> > > > > > which >> > > > > >> > > > > > > >> we >> > > > > >> > > > > > > >> > > have >> > > > > >> > > > > > > >> > > > a >> > > > > >> > > > > > > >> > > > > > > clear >> > > > > >> > > > > > > >> > > > > > > > > use >> > > > > >> > > > > > > >> > > > > > > > > > case. If more use cases for >> finer >> > > > > >> monitoring >> > > > > >> > > > show >> > > > > >> > > > > up >> > > > > >> > > > > > > in >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > > > > future, >> > > > > >> > > > > > > >> > > > > > > we >> > > > > >> > > > > > > >> > > > > > > > > can >> > > > > >> > > > > > > >> > > > > > > > > > always update the interface. >> > Would >> > > > you >> > > > > >> > please >> > > > > >> > > > > > > highlight >> > > > > >> > > > > > > >> in >> > > > > >> > > > > > > >> > > the >> > > > > >> > > > > > > >> > > > > KIP >> > > > > >> > > > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > APIs >> > > > > >> > > > > > > >> > > > > > > > > > that you think we have an >> > immediate >> > > > use >> > > > > >> for? >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > Joel, >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > Broker-side monitoring makes a >> > lot >> > > of >> > > > > >> sense >> > > > > >> > in >> > > > > >> > > > the >> > > > > >> > > > > > > long >> > > > > >> > > > > > > >> > term >> > > > > >> > > > > > > >> > > > > > though I >> > > > > >> > > > > > > >> > > > > > > > > don't >> > > > > >> > > > > > > >> > > > > > > > > > think it is a requirement for >> > > > > end-to-end >> > > > > >> > > > > monitoring. >> > > > > >> > > > > > > >> With >> > > > > >> > > > > > > >> > the >> > > > > >> > > > > > > >> > > > > > > producer >> > > > > >> > > > > > > >> > > > > > > > > and >> > > > > >> > > > > > > >> > > > > > > > > > consumer interceptors, you >> have >> > the >> > > > > >> ability >> > > > > >> > to >> > > > > >> > > > get >> > > > > >> > > > > > > full >> > > > > >> > > > > > > >> > > > > > > > > > publish-to-subscribe >> end-to-end >> > > > > >> monitoring. >> > > > > >> > > The >> > > > > >> > > > > > broker >> > > > > >> > > > > > > >> > > > > interceptor >> > > > > >> > > > > > > >> > > > > > > > > > certainly improves the >> resolution >> > > of >> > > > > >> > > monitoring >> > > > > >> > > > > but >> > > > > >> > > > > > it >> > > > > >> > > > > > > >> is >> > > > > >> > > > > > > >> > > also >> > > > > >> > > > > > > >> > > > a >> > > > > >> > > > > > > >> > > > > > > > riskier >> > > > > >> > > > > > > >> > > > > > > > > > change. I prefer an >> incremental >> > > > > approach >> > > > > >> > over >> > > > > >> > > a >> > > > > >> > > > > > > big-bang >> > > > > >> > > > > > > >> > and >> > > > > >> > > > > > > >> > > > > > > recommend >> > > > > >> > > > > > > >> > > > > > > > > > taking baby-steps. Let's first >> > make >> > > > > sure >> > > > > >> the >> > > > > >> > > > > > > >> > > producer/consumer >> > > > > >> > > > > > > >> > > > > > > > > interceptors >> > > > > >> > > > > > > >> > > > > > > > > > are successful. And then come >> > back >> > > > and >> > > > > >> add >> > > > > >> > the >> > > > > >> > > > > > broker >> > > > > >> > > > > > > >> > > > interceptor >> > > > > >> > > > > > > >> > > > > > > > > > carefully. >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > Having said that, it would be >> > great >> > > > to >> > > > > >> > > > understand >> > > > > >> > > > > > your >> > > > > >> > > > > > > >> > > proposal >> > > > > >> > > > > > > >> > > > > for >> > > > > >> > > > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > broker interceptor >> independently. >> > > We >> > > > > can >> > > > > >> > > either >> > > > > >> > > > > add >> > > > > >> > > > > > an >> > > > > >> > > > > > > >> > > > > interceptor >> > > > > >> > > > > > > >> > > > > > > > > > on-append or on-commit. If >> people >> > > > want >> > > > > to >> > > > > >> > use >> > > > > >> > > > this >> > > > > >> > > > > > for >> > > > > >> > > > > > > >> > > > > monitoring, >> > > > > >> > > > > > > >> > > > > > > then >> > > > > >> > > > > > > >> > > > > > > > > > possibly on-commit might be >> more >> > > > > useful? >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > Neha >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > On Mon, Jan 25, 2016 at 6:47 >> PM, >> > > Jay >> > > > > >> Kreps < >> > > > > >> > > > > > > >> > j...@confluent.io >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > Hey Joel, >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > What is the interface you >> are >> > > > > thinking >> > > > > >> of? >> > > > > >> > > > > > Something >> > > > > >> > > > > > > >> like >> > > > > >> > > > > > > >> > > > this: >> > > > > >> > > > > > > >> > > > > > > > > > > onAppend(String topic, >> int >> > > > > >> partition, >> > > > > >> > > > > Records >> > > > > >> > > > > > > >> > records, >> > > > > >> > > > > > > >> > > > long >> > > > > >> > > > > > > >> > > > > > > time) >> > > > > >> > > > > > > >> > > > > > > > > > > ? >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > One challenge right now is >> that >> > > we >> > > > > are >> > > > > >> > still >> > > > > >> > > > > using >> > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > old >> > > > > >> > > > > > > >> > > > > > > > > > > Message/MessageSet classes >> on >> > the >> > > > > >> broker >> > > > > >> > > which >> > > > > >> > > > > I'm >> > > > > >> > > > > > > not >> > > > > >> > > > > > > >> > sure >> > > > > >> > > > > > > >> > > > if >> > > > > >> > > > > > > >> > > > > > we'd >> > > > > >> > > > > > > >> > > > > > > > > want >> > > > > >> > > > > > > >> > > > > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > > > support over the long haul >> but >> > it >> > > > > >> might be >> > > > > >> > > > okay >> > > > > >> > > > > > just >> > > > > >> > > > > > > >> to >> > > > > >> > > > > > > >> > > > create >> > > > > >> > > > > > > >> > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > records >> > > > > >> > > > > > > >> > > > > > > > > > > instance for this interface. >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > -Jay >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > On Mon, Jan 25, 2016 at >> 12:37 >> > PM, >> > > > > Joel >> > > > > >> > > Koshy < >> > > > > >> > > > > > > >> > > > > > jjkosh...@gmail.com> >> > > > > >> > > > > > > >> > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > I'm definitely in favor of >> > > having >> > > > > >> such >> > > > > >> > > hooks >> > > > > >> > > > > in >> > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > produce/consume >> > > > > >> > > > > > > >> > > > > > > > > > > > life-cycle. Not sure if >> > people >> > > > > >> remember >> > > > > >> > > this >> > > > > >> > > > > but >> > > > > >> > > > > > > in >> > > > > >> > > > > > > >> > Kafka >> > > > > >> > > > > > > >> > > > 0.7 >> > > > > >> > > > > > > >> > > > > > > this >> > > > > >> > > > > > > >> > > > > > > > > was >> > > > > >> > > > > > > >> > > > > > > > > > > > pretty much how it was: >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> > > > > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > > > >> > > >> > > > > >> > >> > > > > >> >> > > > > >> > > > >> > > >> > >> https://github.com/apache/kafka/blob/0.7/core/src/main/scala/kafka/producer/async/CallbackHandler.scala >> > > > > >> > > > > > > >> > > > > > > > > > > > i.e., we had something >> > similar >> > > to >> > > > > the >> > > > > >> > > > > > interceptor >> > > > > >> > > > > > > >> > > proposal >> > > > > >> > > > > > > >> > > > > for >> > > > > >> > > > > > > >> > > > > > > > > various >> > > > > >> > > > > > > >> > > > > > > > > > > > stages of the producer >> > request. >> > > > The >> > > > > >> > > producer >> > > > > >> > > > > > > >> provided >> > > > > >> > > > > > > >> > > > > > call-backs >> > > > > >> > > > > > > >> > > > > > > > for >> > > > > >> > > > > > > >> > > > > > > > > > > > beforeEnqueue, >> afterEnqueue, >> > > > > >> > > afterDequeuing, >> > > > > >> > > > > > > >> > > beforeSending, >> > > > > >> > > > > > > >> > > > > > etc. >> > > > > >> > > > > > > >> > > > > > > So >> > > > > >> > > > > > > >> > > > > > > > > at >> > > > > >> > > > > > > >> > > > > > > > > > > > LinkedIn we in fact did >> > > auditing >> > > > > >> within >> > > > > >> > > > these >> > > > > >> > > > > > > >> > call-backs >> > > > > >> > > > > > > >> > > > (and >> > > > > >> > > > > > > >> > > > > > not >> > > > > >> > > > > > > >> > > > > > > > > > > > explicitly in the >> wrapper). >> > > Over >> > > > > time >> > > > > >> > and >> > > > > >> > > > with >> > > > > >> > > > > > 0.8 >> > > > > >> > > > > > > >> we >> > > > > >> > > > > > > >> > > moved >> > > > > >> > > > > > > >> > > > > > that >> > > > > >> > > > > > > >> > > > > > > > out >> > > > > >> > > > > > > >> > > > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > > wrapper libraries. >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > On a side-note while audit >> > and >> > > > > other >> > > > > >> > > > > monitoring >> > > > > >> > > > > > > can >> > > > > >> > > > > > > >> be >> > > > > >> > > > > > > >> > > done >> > > > > >> > > > > > > >> > > > > > > > > internally >> > > > > >> > > > > > > >> > > > > > > > > > > in a >> > > > > >> > > > > > > >> > > > > > > > > > > > convenient way I think it >> > > should >> > > > be >> > > > > >> > > > clarified >> > > > > >> > > > > > that >> > > > > >> > > > > > > >> > > having a >> > > > > >> > > > > > > >> > > > > > > wrapper >> > > > > >> > > > > > > >> > > > > > > > > is >> > > > > >> > > > > > > >> > > > > > > > > > in >> > > > > >> > > > > > > >> > > > > > > > > > > > general not a bad idea >> and I >> > > > would >> > > > > >> even >> > > > > >> > > > > consider >> > > > > >> > > > > > > it >> > > > > >> > > > > > > >> to >> > > > > >> > > > > > > >> > > be a >> > > > > >> > > > > > > >> > > > > > > > > > > best-practice. >> > > > > >> > > > > > > >> > > > > > > > > > > > Even with 0.7 we still >> had a >> > > > > wrapper >> > > > > >> > > library >> > > > > >> > > > > and >> > > > > >> > > > > > > >> that >> > > > > >> > > > > > > >> > API >> > > > > >> > > > > > > >> > > > has >> > > > > >> > > > > > > >> > > > > > > > largely >> > > > > >> > > > > > > >> > > > > > > > > > > > stayed the same and has >> > helped >> > > > > >> protect >> > > > > >> > > > against >> > > > > >> > > > > > > >> > (sometimes >> > > > > >> > > > > > > >> > > > > > > backwards >> > > > > >> > > > > > > >> > > > > > > > > > > > incompatible) changes in >> open >> > > > > source. >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > While we are on this >> topic I >> > > have >> > > > > one >> > > > > >> > > > comment >> > > > > >> > > > > > and >> > > > > >> > > > > > > >> Anna, >> > > > > >> > > > > > > >> > > you >> > > > > >> > > > > > > >> > > > > may >> > > > > >> > > > > > > >> > > > > > > > have >> > > > > >> > > > > > > >> > > > > > > > > > > > already considered this >> but I >> > > > don't >> > > > > >> see >> > > > > >> > > > > mention >> > > > > >> > > > > > of >> > > > > >> > > > > > > >> it >> > > > > >> > > > > > > >> > in >> > > > > >> > > > > > > >> > > > the >> > > > > >> > > > > > > >> > > > > > KIP: >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > Add a custom message >> > > > > >> > interceptor/validator >> > > > > >> > > > on >> > > > > >> > > > > > the >> > > > > >> > > > > > > >> > broker >> > > > > >> > > > > > > >> > > on >> > > > > >> > > > > > > >> > > > > > > message >> > > > > >> > > > > > > >> > > > > > > > > > > > arrival. >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > We decompress and do basic >> > > > > >> validation of >> > > > > >> > > > > > messages >> > > > > >> > > > > > > on >> > > > > >> > > > > > > >> > > > > arrival. I >> > > > > >> > > > > > > >> > > > > > > > think >> > > > > >> > > > > > > >> > > > > > > > > > > there >> > > > > >> > > > > > > >> > > > > > > > > > > > is value in supporting >> custom >> > > > > >> validation >> > > > > >> > > and >> > > > > >> > > > > > > expand >> > > > > >> > > > > > > >> it >> > > > > >> > > > > > > >> > to >> > > > > >> > > > > > > >> > > > > > support >> > > > > >> > > > > > > >> > > > > > > > > > custom >> > > > > >> > > > > > > >> > > > > > > > > > > > on-arrival processing. >> Here >> > is >> > > a >> > > > > >> > specific >> > > > > >> > > > > > > use-case I >> > > > > >> > > > > > > >> > have >> > > > > >> > > > > > > >> > > > in >> > > > > >> > > > > > > >> > > > > > > mind. >> > > > > >> > > > > > > >> > > > > > > > > The >> > > > > >> > > > > > > >> > > > > > > > > > > blog >> > > > > >> > > > > > > >> > > > > > > > > > > > that James referenced >> > describes >> > > > our >> > > > > >> > > auditing >> > > > > >> > > > > > > >> > > > infrastructure. >> > > > > >> > > > > > > >> > > > > In >> > > > > >> > > > > > > >> > > > > > > > order >> > > > > >> > > > > > > >> > > > > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > > > > audit the Kafka cluster >> > itself >> > > we >> > > > > >> need >> > > > > >> > to >> > > > > >> > > > run >> > > > > >> > > > > a >> > > > > >> > > > > > > >> > "console >> > > > > >> > > > > > > >> > > > > > auditor" >> > > > > >> > > > > > > >> > > > > > > > > > service >> > > > > >> > > > > > > >> > > > > > > > > > > > that consumes everything >> and >> > > > spits >> > > > > >> out >> > > > > >> > > audit >> > > > > >> > > > > > > events >> > > > > >> > > > > > > >> > back >> > > > > >> > > > > > > >> > > to >> > > > > >> > > > > > > >> > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > cluster. >> > > > > >> > > > > > > >> > > > > > > > > > > I >> > > > > >> > > > > > > >> > > > > > > > > > > > would prefer not having to >> > run >> > > > this >> > > > > >> > > service >> > > > > >> > > > > > > because: >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > - Well, it is one more >> > > service >> > > > > >> that >> > > > > >> > we >> > > > > >> > > > have >> > > > > >> > > > > > to >> > > > > >> > > > > > > >> run >> > > > > >> > > > > > > >> > and >> > > > > >> > > > > > > >> > > > > > monitor >> > > > > >> > > > > > > >> > > > > > > > > > > > - Consuming everything >> > takes >> > > > up >> > > > > >> > > bandwidth >> > > > > >> > > > > > which >> > > > > >> > > > > > > >> can >> > > > > >> > > > > > > >> > be >> > > > > >> > > > > > > >> > > > > > avoided >> > > > > >> > > > > > > >> > > > > > > > > > > > - The console auditor >> > > consumer >> > > > > >> itself >> > > > > >> > > can >> > > > > >> > > > > lag >> > > > > >> > > > > > > and >> > > > > >> > > > > > > >> > > cause >> > > > > >> > > > > > > >> > > > > > > > temporary >> > > > > >> > > > > > > >> > > > > > > > > > > audit >> > > > > >> > > > > > > >> > > > > > > > > > > > discrepancies >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > One way we can mitigate >> this >> > is >> > > > by >> > > > > >> > having >> > > > > >> > > > > > > >> mirror-makers >> > > > > >> > > > > > > >> > > in >> > > > > >> > > > > > > >> > > > > > > between >> > > > > >> > > > > > > >> > > > > > > > > > > clusters >> > > > > >> > > > > > > >> > > > > > > > > > > > emit audit events. The >> > problem >> > > is >> > > > > >> that >> > > > > >> > the >> > > > > >> > > > > very >> > > > > >> > > > > > > last >> > > > > >> > > > > > > >> > > > cluster >> > > > > >> > > > > > > >> > > > > in >> > > > > >> > > > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > > pipeline will not have any >> > > audit >> > > > > >> which >> > > > > >> > is >> > > > > >> > > > why >> > > > > >> > > > > we >> > > > > >> > > > > > > >> need >> > > > > >> > > > > > > >> > to >> > > > > >> > > > > > > >> > > > have >> > > > > >> > > > > > > >> > > > > > > > > something >> > > > > >> > > > > > > >> > > > > > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > > > > audit the cluster. >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > If we had a custom message >> > > > > validator >> > > > > >> > then >> > > > > >> > > > the >> > > > > >> > > > > > > audit >> > > > > >> > > > > > > >> can >> > > > > >> > > > > > > >> > > be >> > > > > >> > > > > > > >> > > > > done >> > > > > >> > > > > > > >> > > > > > > > > > > on-arrival >> > > > > >> > > > > > > >> > > > > > > > > > > > and we won't need a >> console >> > > > > auditor. >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > One potential issue in >> this >> > > > > approach >> > > > > >> and >> > > > > >> > > any >> > > > > >> > > > > > > >> elaborate >> > > > > >> > > > > > > >> > > > > > on-arrival >> > > > > >> > > > > > > >> > > > > > > > > > > > processing for that >> matter is >> > > > that >> > > > > >> you >> > > > > >> > may >> > > > > >> > > > > need >> > > > > >> > > > > > to >> > > > > >> > > > > > > >> > > > > deserialize >> > > > > >> > > > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > message >> > > > > >> > > > > > > >> > > > > > > > > > > > as well which can drive up >> > > > produce >> > > > > >> > request >> > > > > >> > > > > > > handling >> > > > > >> > > > > > > >> > > times. >> > > > > >> > > > > > > >> > > > > > > However >> > > > > >> > > > > > > >> > > > > > > > > I'm >> > > > > >> > > > > > > >> > > > > > > > > > > not >> > > > > >> > > > > > > >> > > > > > > > > > > > terribly concerned about >> that >> > > > > >> especially >> > > > > >> > > if >> > > > > >> > > > > the >> > > > > >> > > > > > > >> audit >> > > > > >> > > > > > > >> > > > header >> > > > > >> > > > > > > >> > > > > > can >> > > > > >> > > > > > > >> > > > > > > be >> > > > > >> > > > > > > >> > > > > > > > > > > > separated out easily or >> even >> > > > > >> > deserialized >> > > > > >> > > > > > > partially >> > > > > >> > > > > > > >> as >> > > > > >> > > > > > > >> > > this >> > > > > >> > > > > > > >> > > > > > Avro >> > > > > >> > > > > > > >> > > > > > > > > thread >> > > > > >> > > > > > > >> > > > > > > > > > > > touches on >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> > > > > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > > > >> > > >> > > > > >> > >> > > > > >> >> > > > > >> > > > >> > > >> > >> http://search-hadoop.com/m/F2svI1HDLY12W8tnH1&subj=Re+any+optimization+in+reading+a+partial+schema+in+the+decoder+ >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > Joel >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > On Mon, Jan 25, 2016 at >> 12:02 >> > > PM, >> > > > > >> > Mayuresh >> > > > > >> > > > > > Gharat >> > > > > >> > > > > > > < >> > > > > >> > > > > > > >> > > > > > > > > > > > >> gharatmayures...@gmail.com> >> > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > Nice KIP. Excellent >> idea. >> > > > > >> > > > > > > >> > > > > > > > > > > > > Was just thinking if we >> can >> > > add >> > > > > >> > > onDequed() >> > > > > >> > > > > to >> > > > > >> > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > ProducerIterceptor >> > > > > >> > > > > > > >> > > > > > > > > > > > > interface. Since we have >> > the >> > > > > >> > > onEnqueued(), >> > > > > >> > > > > it >> > > > > >> > > > > > > will >> > > > > >> > > > > > > >> > help >> > > > > >> > > > > > > >> > > > the >> > > > > >> > > > > > > >> > > > > > > > client >> > > > > >> > > > > > > >> > > > > > > > > or >> > > > > >> > > > > > > >> > > > > > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > > > tools to know how much >> time >> > > the >> > > > > >> > message >> > > > > >> > > > > spent >> > > > > >> > > > > > in >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > > > > > > > > > RecordAccumulator. >> > > > > >> > > > > > > >> > > > > > > > > > > > > Also an API to check if >> > there >> > > > are >> > > > > >> any >> > > > > >> > > > > messages >> > > > > >> > > > > > > >> left >> > > > > >> > > > > > > >> > > for a >> > > > > >> > > > > > > >> > > > > > > > > particular >> > > > > >> > > > > > > >> > > > > > > > > > > > topic >> > > > > >> > > > > > > >> > > > > > > > > > > > > in the RecordAccumulator >> > > would >> > > > > >> help. >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > Mayuresh >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > On Mon, Jan 25, 2016 at >> > 11:29 >> > > > AM, >> > > > > >> Todd >> > > > > >> > > > > Palino >> > > > > >> > > > > > < >> > > > > >> > > > > > > >> > > > > > > tpal...@gmail.com >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > Great idea. I’ve been >> > > talking >> > > > > >> about >> > > > > >> > > this >> > > > > >> > > > > > for 2 >> > > > > >> > > > > > > >> > years, >> > > > > >> > > > > > > >> > > > and >> > > > > >> > > > > > > >> > > > > > I’m >> > > > > >> > > > > > > >> > > > > > > > > glad >> > > > > >> > > > > > > >> > > > > > > > > > > > > someone >> > > > > >> > > > > > > >> > > > > > > > > > > > > > is finally picking it >> up. >> > > > Will >> > > > > >> take >> > > > > >> > a >> > > > > >> > > > look >> > > > > >> > > > > > at >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > KIP >> > > > > >> > > > > > > >> > > > at >> > > > > >> > > > > > > >> > > > > > some >> > > > > >> > > > > > > >> > > > > > > > > point >> > > > > >> > > > > > > >> > > > > > > > > > > > > > shortly. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > -Todd >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > On Mon, Jan 25, 2016 >> at >> > > 11:24 >> > > > > AM, >> > > > > >> > Jay >> > > > > >> > > > > Kreps >> > > > > >> > > > > > < >> > > > > >> > > > > > > >> > > > > > > j...@confluent.io> >> > > > > >> > > > > > > >> > > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > Hey Becket, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > Yeah this is really >> > > similar >> > > > > to >> > > > > >> the >> > > > > >> > > > > > callback. >> > > > > >> > > > > > > >> The >> > > > > >> > > > > > > >> > > > > > difference >> > > > > >> > > > > > > >> > > > > > > > is >> > > > > >> > > > > > > >> > > > > > > > > > > really >> > > > > >> > > > > > > >> > > > > > > > > > > > > in >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > who sets the >> behavior. >> > > The >> > > > > >> idea of >> > > > > >> > > the >> > > > > >> > > > > > > >> > interceptor >> > > > > >> > > > > > > >> > > is >> > > > > >> > > > > > > >> > > > > > that >> > > > > >> > > > > > > >> > > > > > > it >> > > > > >> > > > > > > >> > > > > > > > > > > doesn't >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > require any code >> change >> > > in >> > > > > >> apps so >> > > > > >> > > you >> > > > > >> > > > > can >> > > > > >> > > > > > > >> > globally >> > > > > >> > > > > > > >> > > > add >> > > > > >> > > > > > > >> > > > > > > > > behavior >> > > > > >> > > > > > > >> > > > > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > > > > > your >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > Kafka usage without >> > > > changing >> > > > > >> app >> > > > > >> > > code. >> > > > > >> > > > > > > Whereas >> > > > > >> > > > > > > >> > the >> > > > > >> > > > > > > >> > > > > > callback >> > > > > >> > > > > > > >> > > > > > > > is >> > > > > >> > > > > > > >> > > > > > > > > > > added >> > > > > >> > > > > > > >> > > > > > > > > > > > by >> > > > > >> > > > > > > >> > > > > > > > > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > app. The idea is to >> > kind >> > > of >> > > > > >> > obviate >> > > > > >> > > > the >> > > > > >> > > > > > need >> > > > > >> > > > > > > >> for >> > > > > >> > > > > > > >> > > the >> > > > > >> > > > > > > >> > > > > > > wrapper >> > > > > >> > > > > > > >> > > > > > > > > code >> > > > > >> > > > > > > >> > > > > > > > > > > > that >> > > > > >> > > > > > > >> > > > > > > > > > > > > > e.g. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > LinkedIn maintains >> to >> > > hold >> > > > > this >> > > > > >> > kind >> > > > > >> > > > of >> > > > > >> > > > > > > stuff. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > -Jay >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > On Sun, Jan 24, >> 2016 at >> > > > 4:21 >> > > > > >> PM, >> > > > > >> > > > Becket >> > > > > >> > > > > > Qin >> > > > > >> > > > > > > < >> > > > > >> > > > > > > >> > > > > > > > > > becket....@gmail.com> >> > > > > >> > > > > > > >> > > > > > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > This could be a >> > useful >> > > > > >> feature. >> > > > > >> > > And >> > > > > >> > > > I >> > > > > >> > > > > > > think >> > > > > >> > > > > > > >> > there >> > > > > >> > > > > > > >> > > > are >> > > > > >> > > > > > > >> > > > > > > some >> > > > > >> > > > > > > >> > > > > > > > > use >> > > > > >> > > > > > > >> > > > > > > > > > > > cases >> > > > > >> > > > > > > >> > > > > > > > > > > > > to >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > mutate the data >> like >> > > > > rejected >> > > > > >> > > > > > alternative >> > > > > >> > > > > > > >> one >> > > > > >> > > > > > > >> > > > > > mentioned. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > I am wondering if >> > there >> > > > is >> > > > > >> > > > functional >> > > > > >> > > > > > > >> > overlapping >> > > > > >> > > > > > > >> > > > > > between >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > ProducerInterceptor.onAcknowledgement() >> > > > > >> > > > > > > and >> > > > > >> > > > > > > >> the >> > > > > >> > > > > > > >> > > > > > producer >> > > > > >> > > > > > > >> > > > > > > > > > > callback? >> > > > > >> > > > > > > >> > > > > > > > > > > > I >> > > > > >> > > > > > > >> > > > > > > > > > > > > > can >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > see that the >> Callback >> > > > could >> > > > > >> be a >> > > > > >> > > per >> > > > > >> > > > > > > record >> > > > > >> > > > > > > >> > > setting >> > > > > >> > > > > > > >> > > > > > while >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> onAcknowledgement() >> > is >> > > a >> > > > > >> > producer >> > > > > >> > > > > level >> > > > > >> > > > > > > >> > setting. >> > > > > >> > > > > > > >> > > > > Other >> > > > > >> > > > > > > >> > > > > > > than >> > > > > >> > > > > > > >> > > > > > > > > > that, >> > > > > >> > > > > > > >> > > > > > > > > > > > is >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > there >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > any difference >> > between >> > > > > them? >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > Jiangjie (Becket) >> Qin >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > On Fri, Jan 22, >> 2016 >> > at >> > > > > 6:21 >> > > > > >> PM, >> > > > > >> > > > Neha >> > > > > >> > > > > > > >> Narkhede >> > > > > >> > > > > > > >> > < >> > > > > >> > > > > > > >> > > > > > > > > > > n...@confluent.io> >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > James, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > That is one of >> the >> > > many >> > > > > >> > > monitoring >> > > > > >> > > > > use >> > > > > >> > > > > > > >> cases >> > > > > >> > > > > > > >> > > for >> > > > > >> > > > > > > >> > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > interceptor >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > interface. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > Neha >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > On Fri, Jan 22, >> > 2016 >> > > at >> > > > > >> 6:18 >> > > > > >> > PM, >> > > > > >> > > > > James >> > > > > >> > > > > > > >> Cheng >> > > > > >> > > > > > > >> > < >> > > > > >> > > > > > > >> > > > > > > > > > jch...@tivo.com> >> > > > > >> > > > > > > >> > > > > > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > Anna, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > I'm trying to >> > > > > understand >> > > > > >> a >> > > > > >> > > > > concrete >> > > > > >> > > > > > > use >> > > > > >> > > > > > > >> > case. >> > > > > >> > > > > > > >> > > > It >> > > > > >> > > > > > > >> > > > > > > sounds >> > > > > >> > > > > > > >> > > > > > > > > > like >> > > > > >> > > > > > > >> > > > > > > > > > > > > > producer >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > interceptors >> > could >> > > be >> > > > > >> used >> > > > > >> > to >> > > > > >> > > > > > > implement >> > > > > >> > > > > > > >> > part >> > > > > >> > > > > > > >> > > of >> > > > > >> > > > > > > >> > > > > > > > > LinkedIn's >> > > > > >> > > > > > > >> > > > > > > > > > > > Kafak >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > Audit >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > tool? >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > >> > > > > >> > https://engineering.linkedin.com/kafka/running-kafka-scale >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > Part of that >> is >> > > done >> > > > > by a >> > > > > >> > > > wrapper >> > > > > >> > > > > > > >> library >> > > > > >> > > > > > > >> > > > around >> > > > > >> > > > > > > >> > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > kafka >> > > > > >> > > > > > > >> > > > > > > > > > > > > producer >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > that >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > keeps a count >> of >> > > the >> > > > > >> number >> > > > > >> > of >> > > > > >> > > > > > > messages >> > > > > >> > > > > > > >> > > > produced, >> > > > > >> > > > > > > >> > > > > > and >> > > > > >> > > > > > > >> > > > > > > > > then >> > > > > >> > > > > > > >> > > > > > > > > > > > sends >> > > > > >> > > > > > > >> > > > > > > > > > > > > > that >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > count >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > to a >> side-topic. >> > It >> > > > > >> sounds >> > > > > >> > > like >> > > > > >> > > > > the >> > > > > >> > > > > > > >> > producer >> > > > > >> > > > > > > >> > > > > > > > interceptors >> > > > > >> > > > > > > >> > > > > > > > > > > could >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > possibly >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > be >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > used to >> implement >> > > > that? >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > -James >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > On Jan 22, >> > 2016, >> > > at >> > > > > >> 4:33 >> > > > > >> > PM, >> > > > > >> > > > > Anna >> > > > > >> > > > > > > >> > Povzner < >> > > > > >> > > > > > > >> > > > > > > > > > > a...@confluent.io >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > wrote: >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > Hi, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > I just >> created >> > a >> > > > > KIP-42 >> > > > > >> > for >> > > > > >> > > > > adding >> > > > > >> > > > > > > >> > producer >> > > > > >> > > > > > > >> > > > and >> > > > > >> > > > > > > >> > > > > > > > > consumer >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > interceptors >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > for >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > intercepting >> > > > messages >> > > > > >> at >> > > > > >> > > > > different >> > > > > >> > > > > > > >> points >> > > > > >> > > > > > > >> > > on >> > > > > >> > > > > > > >> > > > > > > producer >> > > > > >> > > > > > > >> > > > > > > > > and >> > > > > >> > > > > > > >> > > > > > > > > > > > > > consumer. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> > > > > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > > > >> > > >> > > > > >> > >> > > > > >> >> > > > > >> > > > >> > > >> > >> https://cwiki.apache.org/confluence/display/KAFKA/KIP-42%3A+Add+Producer+and+Consumer+Interceptors >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > Comments and >> > > > > >> suggestions >> > > > > >> > are >> > > > > >> > > > > > > welcome! >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > > Anna >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > ________________________________ >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > This email and >> > any >> > > > > >> > attachments >> > > > > >> > > > may >> > > > > >> > > > > > > >> contain >> > > > > >> > > > > > > >> > > > > > > confidential >> > > > > >> > > > > > > >> > > > > > > > > and >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > privileged >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > material for >> the >> > > sole >> > > > > >> use of >> > > > > >> > > the >> > > > > >> > > > > > > >> intended >> > > > > >> > > > > > > >> > > > > > recipient. >> > > > > >> > > > > > > >> > > > > > > > Any >> > > > > >> > > > > > > >> > > > > > > > > > > > review, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > copying, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > or >> distribution >> > of >> > > > this >> > > > > >> > email >> > > > > >> > > > (or >> > > > > >> > > > > > any >> > > > > >> > > > > > > >> > > > > attachments) >> > > > > >> > > > > > > >> > > > > > by >> > > > > >> > > > > > > >> > > > > > > > > > others >> > > > > >> > > > > > > >> > > > > > > > > > > is >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > prohibited. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > If you are not >> > the >> > > > > >> intended >> > > > > >> > > > > > recipient, >> > > > > >> > > > > > > >> > please >> > > > > >> > > > > > > >> > > > > > contact >> > > > > >> > > > > > > >> > > > > > > > the >> > > > > >> > > > > > > >> > > > > > > > > > > > sender >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > immediately >> and >> > > > > >> permanently >> > > > > >> > > > delete >> > > > > >> > > > > > > this >> > > > > >> > > > > > > >> > email >> > > > > >> > > > > > > >> > > > and >> > > > > >> > > > > > > >> > > > > > any >> > > > > >> > > > > > > >> > > > > > > > > > > > > attachments. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > No >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > employee or >> agent >> > > of >> > > > > TiVo >> > > > > >> > Inc. >> > > > > >> > > > is >> > > > > >> > > > > > > >> > authorized >> > > > > >> > > > > > > >> > > to >> > > > > >> > > > > > > >> > > > > > > > conclude >> > > > > >> > > > > > > >> > > > > > > > > > any >> > > > > >> > > > > > > >> > > > > > > > > > > > > > binding >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > agreement on >> > behalf >> > > > of >> > > > > >> TiVo >> > > > > >> > > Inc. >> > > > > >> > > > > by >> > > > > >> > > > > > > >> email. >> > > > > >> > > > > > > >> > > > > Binding >> > > > > >> > > > > > > >> > > > > > > > > > agreements >> > > > > >> > > > > > > >> > > > > > > > > > > > > with >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > TiVo >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > Inc. may only >> be >> > > made >> > > > > by >> > > > > >> a >> > > > > >> > > > signed >> > > > > >> > > > > > > >> written >> > > > > >> > > > > > > >> > > > > > agreement. >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > -- >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > Neha >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > -- >> > > > > >> > > > > > > >> > > > > > > > > > > > > > *—-* >> > > > > >> > > > > > > >> > > > > > > > > > > > > > *Todd Palino* >> > > > > >> > > > > > > >> > > > > > > > > > > > > > Staff Site Reliability >> > > > Engineer >> > > > > >> > > > > > > >> > > > > > > > > > > > > > Data Infrastructure >> > > Streaming >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > linkedin.com/in/toddpalino >> > > > > >> > > > > > > >> > > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > > -- >> > > > > >> > > > > > > >> > > > > > > > > > > > > -Regards, >> > > > > >> > > > > > > >> > > > > > > > > > > > > Mayuresh R. Gharat >> > > > > >> > > > > > > >> > > > > > > > > > > > > (862) 250-7125 >> > > > > >> > > > > > > >> > > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > > -- >> > > > > >> > > > > > > >> > > > > > > > > > Thanks, >> > > > > >> > > > > > > >> > > > > > > > > > Neha >> > > > > >> > > > > > > >> > > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > -- >> > > > > >> > > > > > > >> > > > > > > > *—-* >> > > > > >> > > > > > > >> > > > > > > > *Todd Palino* >> > > > > >> > > > > > > >> > > > > > > > Staff Site Reliability Engineer >> > > > > >> > > > > > > >> > > > > > > > Data Infrastructure Streaming >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > > linkedin.com/in/toddpalino >> > > > > >> > > > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > > -- >> > > > > >> > > > > > > >> > > > > > -Regards, >> > > > > >> > > > > > > >> > > > > > Mayuresh R. Gharat >> > > > > >> > > > > > > >> > > > > > (862) 250-7125 >> > > > > >> > > > > > > >> > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > -- >> > > > > >> > > > > > > >> > > > *—-* >> > > > > >> > > > > > > >> > > > *Todd Palino* >> > > > > >> > > > > > > >> > > > Staff Site Reliability Engineer >> > > > > >> > > > > > > >> > > > Data Infrastructure Streaming >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > > linkedin.com/in/toddpalino >> > > > > >> > > > > > > >> > > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > > -- >> > > > > >> > > > > > > >> > > -Regards, >> > > > > >> > > > > > > >> > > Mayuresh R. Gharat >> > > > > >> > > > > > > >> > > (862) 250-7125 >> > > > > >> > > > > > > >> > > >> > > > > >> > > > > > > >> > >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > >> -- >> > > > > >> > > > > > > >> -Regards, >> > > > > >> > > > > > > >> Mayuresh R. Gharat >> > > > > >> > > > > > > >> (862) 250-7125 >> > > > > >> > > > > > > >> >> > > > > >> > > > > > > > >> > > > > >> > > > > > > > >> > > > > >> > > > > > > >> > > > > >> > > > > > >> > > > > >> > > > > > >> > > > > >> > > > > > >> > > > > >> > > > > > -- >> > > > > >> > > > > > Thanks, >> > > > > >> > > > > > Neha >> > > > > >> > > > > > >> > > > > >> > > > > >> > > > > >> > > > >> > > > > >> > > >> > > > > >> > >> > > > > >> >> > > > > >> >> > > > > >> >> > > > > >> -- >> > > > > >> *—-* >> > > > > >> *Todd Palino* >> > > > > >> Staff Site Reliability Engineer >> > > > > >> Data Infrastructure Streaming >> > > > > >> >> > > > > >> >> > > > > >> >> > > > > >> linkedin.com/in/toddpalino >> > > > > >> >> > > > > > >> > > > > > >> > > > > >> > > > >> > > >> > > >> > > >> > > -- >> > > Thanks, >> > > Neha >> > > >> > >> > >