Sorry, my mistake. The consumer interceptor is per batch, though I'm not sure that's an actual limitation since you still have access to the individual records.
-Jason On Fri, Feb 17, 2017 at 10:39 AM, Jason Gustafson <ja...@confluent.io> wrote: > Re headers as byte array and future use by broker. This doesn't take away >> from that at all. Nor makes it difficult at all in my opinion. > > > Yeah, I didn't say it was difficult, only awkward. You wouldn't write the > schema that way if you were planning to use it on the brokers from the > beginning. Note also that one of the benefits of letting the broker > understand headers is that it can validate that they are properly > formatted. If cost is the only concern, we should confirm its impact > through performance testing. > > One of the key use cases requires access on consume at per event/message >> level at the point that message is being processed, as such the batch >> interceptors and batch consume api isn't suitable. It needs to be at the >> record level. > > > I'm not sure I understand the point about batching. Interceptors are > applied per-message, right? > > My intent on interceptors is to keep the usage of headers well-defined so > that they don't start leaking unnecessarily into applications. My guess is > that it's probably inevitable, but isolating it in the interceptors would > at least give people a second thought before deciding to use it. The main > challenge in my mind is figuring out how an MM use case would work. It > would be more cumbersome to replicate headers through an interceptor, > though arguably MM should be working at a lower level anyway. > > -Jason > > On Fri, Feb 17, 2017 at 10:16 AM, Michael Pearce <michael.pea...@ig.com> > wrote: > >> Re headers available on the record va interceptors only >> >> One of the key use cases requires access on consume at per event/message >> level at the point that message is being processed, as such the batch >> interceptors and batch consume api isn't suitable. It needs to be at the >> record level. >> >> This anyhow is similar to jms/http/amqp where headers are available to >> consuming applications. >> >> Re headers as byte array and future use by broker. This doesn't take away >> from that at all. Nor makes it difficult at all in my opinion. >> >> >> >> Sent using OWA for iPhone >> ________________________________________ >> From: Jason Gustafson <ja...@confluent.io> >> Sent: Friday, February 17, 2017 5:55:42 PM >> To: dev@kafka.apache.org >> Subject: Re: [DISCUSS] KIP-82 - Add Record Headers >> >> > >> > Would you be proposing in KIP-98 to convert the other message int’s (key >> > length, value length) also to varint to keep it uniform. >> > Also I assume there will be a static or helper method made to write/read >> > these in the client and server. >> >> >> Yes, that is what we are proposing, so using varints for headers would be >> consistent with the rest of the message. We have used static helper >> methods >> in our prototype implementation. >> >> The cost of parsing, we want to parse/interpret the headers lazily (this >> is >> > a key point brought up earlier in discussions) >> >> >> I'm a bit skeptical of this. Has anyone done the performance testing? I >> can >> probably implement it and test it if no one else has. I was also under the >> impression that there may be use cases down the road where the broker >> would >> need to interpret headers. That wouldn't be off the table in the future if >> it's represented as bytes, but it would be quite a bit more awkward, >> right? >> >> By the way, one question I have been wondering about. My understanding is >> that headers are primarily for use cases where a third-party components >> wants to enrich messages without needing to understand or modify the >> schema >> of the message key and value. For the applications which directly produce >> and consume the messages and control the key/value schema directly, it >> seems we would rather have them implement headers directly in their own >> schema. Supposing for the sake of argument that it was possible, my >> question is whether it be sufficient to expose the headers in the >> interceptor API and not in the common API? >> >> -Jason >> >> On Fri, Feb 17, 2017 at 3:26 AM, Michael Pearce <michael.pea...@ig.com> >> wrote: >> >> > On the point of varInts >> > >> > Would you be proposing in KIP-98 to convert the other message int’s (key >> > length, value length) also to varint to keep it uniform. >> > Also I assume there will be a static or helper method made to write/read >> > these in the client and server. >> > >> > Cheers >> > Mike >> > >> > >> > >> > On 17/02/2017, 11:22, "Michael Pearce" <michael.pea...@ig.com> wrote: >> > >> > On the point re: headers in the message protocol being a byte array >> > and not a count of elements followed by the elements. Again this was >> > discussed/argued previously. >> > >> > It was agreed on for a few reasons some of which you have obviously >> > picked up on: >> > >> > Broker is able to pass it through opaquely >> > The cost of parsing, we want to parse/interpret the headers lazily >> > (this is a key point brought up earlier in discussions) >> > Headers can be copied from consumer record to producer record (aka >> > mirror makers etc) without parsing if no changes are being made or being >> > looked at. >> > Keeps the broker agnostic to the format >> > You need an int32 either for the byte size of the headers, or for >> the >> > count of elements, so overheads are the same, but with going with an >> opaque >> > byte array has the above advantages. >> > >> > Cheers >> > Mike >> > >> > >> > On 17/02/2017, 02:50, "Jason Gustafson" <ja...@confluent.io> wrote: >> > >> > Sorry, should have noted that the performance testing was done >> > using the >> > producer performance tool shipped with Kafka. >> > >> > -Jason >> > >> > On Thu, Feb 16, 2017 at 6:44 PM, Jason Gustafson < >> > ja...@confluent.io> wrote: >> > >> > > Hey Nacho, >> > > >> > > I've compared performance of our KIP-98 implementation with >> and >> > without >> > > varints. For messages around 128 bytes, we see an increase in >> > throughput of >> > > about 30% using the default configuration settings. At 256 >> > bytes, the >> > > increase is around 16%. Obviously the performance converge as >> > messages get >> > > larger, but it seems well worth the cost. Note that we are >> also >> > seeing a >> > > substantial performance increase against trunk primarily >> because >> > of the >> > > much more efficient packing that varints provide us. Anything >> > adding to >> > > message overhead, such as record headers, would only increase >> > the relative >> > > difference. (Of course take these numbers with a grain of salt >> > since I have >> > > only used the default settings with both the producer and >> broker >> > on my >> > > local machine. We intend to provide more extensive performance >> > details as >> > > part of the work for KIP-98.) >> > > >> > > The implementation we are using is from protobuf ( >> > > https://developers.google.com/protocol-buffers/docs/encoding >> ), >> > which is >> > > also used in HBase. It is trivial to implement and as far as I >> > know doesn't >> > > suffer from the aliasing problem you are describing. I checked >> > with Magnus >> > > (the author of librdkafka) and he agreed that the savings >> seemed >> > worth the >> > > cost of implementation. >> > > >> > > -Jason >> > > >> > > On Thu, Feb 16, 2017 at 4:32 PM, Ignacio Solis < >> iso...@igso.net> >> > wrote: >> > > >> > >> -VarInts >> > >> >> > >> I'm one of the people (if not the most) opposed to VarInts. >> > VarInts >> > >> have a place, but this is not it. (We had a large >> discussion >> > about >> > >> them at the beginning of KIP-82 time) >> > >> >> > >> If anybody has real life performance numbers of VarInts >> > improving >> > >> things or significantly reducing resources I would like to >> know >> > what >> > >> that case may be. Yes, you can save some bytes here and >> there, >> > but >> > >> this is probably insignificant to the overall system behavior >> > and >> > >> storage requirements. -- I say this with respect to using >> > VarInts in >> > >> the protocol itself, not as part of the data. >> > >> >> > >> VarInts require you to parse the Int before using it and >> > depending on >> > >> the encoding they can suffer from aliasing (multiple >> > representations >> > >> for the same value). >> > >> >> > >> Why add complexity? >> > >> >> > >> Nacho >> > >> >> > >> >> > >> On Thu, Feb 16, 2017 at 10:29 AM, Colin McCabe < >> > cmcc...@apache.org> >> > >> wrote: >> > >> > +1 for varints here-- it would save quite a bit of space. >> > They are >> > >> > pretty quick to implement as well. >> > >> > >> > >> > I think it makes sense for values to be byte arrays. Users >> > might want >> > >> > to attach arbitrary payloads; they shouldn't be forced to >> > serialize >> > >> > everything to Java strings. >> > >> > >> > >> > best, >> > >> > Colin >> > >> > >> > >> > >> > >> > On Thu, Feb 16, 2017, at 09:52, Jason Gustafson wrote: >> > >> >> Hey Michael, >> > >> >> >> > >> >> Hmm, I guess the point of representing it as bytes is to >> > allow the >> > >> broker >> > >> >> to pass it through opaquely? Is the cost of parsing them a >> > concern, or >> > >> >> are >> > >> >> we simply trying to ensure that the broker stays agnostic >> to >> > the >> > >> format? >> > >> >> >> > >> >> On varints, I think adding support for them makes less >> sense >> > for an >> > >> >> isolated use case, but as part of a more holistic change >> > (such as what >> > >> we >> > >> >> have proposed in KIP-98), I think they are justifiable. If >> > we add them, >> > >> >> then the need to use attributes becomes quite a bit >> weaker, >> > right? The >> > >> >> other thing I find slightly odd is the fact that null >> > headers has no >> > >> >> actual >> > >> >> semantic meaning for the message (unlike null keys and >> > values). It is >> > >> >> just >> > >> >> a space optimization. It seems a bit better to always use >> > size 0 to >> > >> >> indicate having no headers. >> > >> >> >> > >> >> Overall, the main point is ensuring that the message >> schema >> > remains >> > >> >> consistent, either within the larger protocol, or at a >> > minimum within >> > >> the >> > >> >> message itself. >> > >> >> >> > >> >> -Jason >> > >> >> >> > >> >> On Thu, Feb 16, 2017 at 6:39 AM, Michael Pearce < >> > michael.pea...@ig.com >> > >> > >> > >> >> wrote: >> > >> >> >> > >> >> > Hi Jason, >> > >> >> > >> > >> >> > On point 1) in the message protocol the headers are >> simply >> > a byte >> > >> array, >> > >> >> > as like the key or value, this is to clearly demarcate >> the >> > header in >> > >> the >> > >> >> > core message. Then the header byte array in the core >> > message is an >> > >> array of >> > >> >> > key, value pairs. This is what it is denoting. >> > >> >> > >> > >> >> > Then this would be I guess in the given notation: >> > >> >> > >> > >> >> > Headers => [KeyLength, Key, ValueLength, Value] >> > >> >> > KeyLength => int32 <-----------------NEW size of the >> > byte[] of >> > >> the >> > >> >> > serialised key value >> > >> >> > Key => bytes <---------------------- NEW serialised >> > string (UTF8) >> > >> >> > bytes of the header key >> > >> >> > ValueLength => int32 <-------------- NEW size of the >> > byte[] of >> > >> the >> > >> >> > serialised header value >> > >> >> > Value => bytes <-------------------- NEW serialised >> > form of the >> > >> header >> > >> >> > value >> > >> >> > >> > >> >> > The key length and value length is matching the way the >> > protocol is >> > >> >> > defined in the core message currently. >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> > On point 2) >> > >> >> > Var sized ints, this was discussed much earlier on, in >> > fact I had >> > >> >> > suggested it myself (with Hadoop references), the >> > complexity of this >> > >> >> > compared to having a simpler protocol was argued and >> > agreed it >> > >> wasn’t worth >> > >> >> > the complexity as all other clients in other languages >> > would need to >> > >> ensure >> > >> >> > theyre using the right var size algorithm, as there is a >> > few. >> > >> >> > >> > >> >> > On point 3) >> > >> >> > We did the attributes, optional approach as originally >> > there was >> > >> marked >> > >> >> > concern that headers would cause a message size overhead >> > for others, >> > >> who >> > >> >> > don’t want them. As such this is the clean solution to >> > achieve that. >> > >> If >> > >> >> > that no longer holds, and we don’t care that we add >> 4bytes >> > overhead, >> > >> then >> > >> >> > im happy to remove. >> > >> >> > >> > >> >> > I’m personally in favour of keeping the message as small >> > as possible >> > >> so >> > >> >> > people don’t get shocks in perf and throughputs dues to >> > message size, >> > >> >> > unless they actively use the feature, as such I do >> prefer >> > the >> > >> attribute bit >> > >> >> > wise feature flag approach myself. >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> > On 16/02/2017, 05:40, "Jason Gustafson" < >> > ja...@confluent.io> wrote: >> > >> >> > >> > >> >> > We have proposed a few significant changes to the >> > message format >> > >> in >> > >> >> > KIP-98 >> > >> >> > which now seems likely to pass (perhaps with some >> > iterations on >> > >> >> > implementation details). It would be good to try and >> > coordinate >> > >> the >> > >> >> > changes >> > >> >> > in both of the proposals to make sure they are >> > consistent and >> > >> >> > compatible. >> > >> >> > >> > >> >> > I think using the attributes to indicate null >> headers >> > is a >> > >> reasonable >> > >> >> > approach. We have proposed to do the same thing for >> > the message >> > >> key and >> > >> >> > value. That said, I sympathize with Jay's argument. >> > Having >> > >> multiple >> > >> >> > ways to >> > >> >> > specify a null value increases the overall >> complexity >> > of the >> > >> protocol. >> > >> >> > You >> > >> >> > can see this just from the fact that you need the >> > extra verbiage >> > >> in the >> > >> >> > protocol specification in this KIP and in KIP-98 to >> > describe the >> > >> >> > dependence >> > >> >> > between the fields and the attributes. It seems >> like a >> > slippery >> > >> slope >> > >> >> > if >> > >> >> > you start allowing different request types to >> > implement the >> > >> protocol >> > >> >> > specification differently. >> > >> >> > >> > >> >> > You can also argue that the messages already are and >> > are likely >> > >> to >> > >> >> > remain a >> > >> >> > special case. For example, there is currently no >> > generality in >> > >> how >> > >> >> > compressed message sets are represented that would >> be >> > applicable >> > >> for >> > >> >> > other >> > >> >> > request types. Some might see this divergence as an >> > unfortunate >> > >> >> > protocol >> > >> >> > deficiency which should be fixed; others might see >> it >> > as sort of >> > >> the >> > >> >> > inevitability of needing to optimize where it counts >> > most. I'm >> > >> probably >> > >> >> > somewhere in between, but I think we probably all >> > share the >> > >> intuition >> > >> >> > that >> > >> >> > the protocol should be kept as consistent as >> possible. >> > With that >> > >> in >> > >> >> > mind, >> > >> >> > here are a few comments: >> > >> >> > >> > >> >> > 1. One thing I found a little odd when reading the >> > current >> > >> proposal is >> > >> >> > that >> > >> >> > the headers are both represented as an array of >> bytes >> > and as an >> > >> array >> > >> >> > of >> > >> >> > key/value pairs. I'd probably suggest something like >> > this: >> > >> >> > >> > >> >> > Headers => [HeaderKey HeaderValue] >> > >> >> > HeaderKey => String >> > >> >> > HeaderValue => Bytes >> > >> >> > >> > >> >> > An array in the Kafka protocol is represented as a >> > 4-byte integer >> > >> >> > indicating the number of elements in the array >> > followed by the >> > >> >> > serialization of the elements. Unless I'm >> > misunderstanding, what >> > >> you >> > >> >> > have >> > >> >> > instead is the total size of the headers in bytes >> > followed by the >> > >> >> > elements. >> > >> >> > I'm not sure I see any reason for this >> inconsistency. >> > >> >> > >> > >> >> > 2. In KIP-98, we've introduced variable-length >> integer >> > fields. >> > >> >> > Effectively, >> > >> >> > we've enriched (or "complicated" as Jay might say ;) >> > the protocol >> > >> >> > specification to include the following types: >> VarInt, >> > VarLong, >> > >> >> > UnsignedVarInt and UnsignedVarLong. >> > >> >> > >> > >> >> > Along with these primitives, we could introduce the >> > following >> > >> types: >> > >> >> > >> > >> >> > VarSizeArray => NumberOfItems Item1 Item2 .. ItemN >> > >> >> > NumberOfItems => UnsignedVarInt >> > >> >> > >> > >> >> > VarSizeNullableArray => NumberOfItemsOrNull Item1 >> > Item2 .. ItemN >> > >> >> > NumberOfItemsOrNull => VarInt (-1 means null) >> > >> >> > >> > >> >> > And similarly for the `String` and `Bytes` types. >> > These types >> > >> can save >> > >> >> > a >> > >> >> > considerable amount of space in this proposal >> because >> > they can >> > >> be used >> > >> >> > for >> > >> >> > both the number of headers included in the message >> and >> > the >> > >> lengths of >> > >> >> > the >> > >> >> > header keys and values. We could do this instead: >> > >> >> > >> > >> >> > Headers => VarSizeArray[HeaderKey HeaderValue] >> > >> >> > HeaderKey => VarSizeString >> > >> >> > HeaderValue => VarSizeBytes >> > >> >> > >> > >> >> > Combining the savings from the use of variable >> length >> > fields, the >> > >> >> > benefit >> > >> >> > of using the attributes to represent null seems >> pretty >> > small. >> > >> >> > >> > >> >> > 3. Whichever way we go (whether we use the >> attributes >> > or not), we >> > >> >> > should at >> > >> >> > least be consistent between this KIP and KIP-98. It >> > would be very >> > >> >> > strange >> > >> >> > to have two ways to represent null values in the >> same >> > schema. >> > >> Either >> > >> >> > way is >> > >> >> > OK with me. I think some message-level optimizations >> > are >> > >> justifiable, >> > >> >> > but >> > >> >> > the savings here seem minimal (a few bytes per >> > message), so >> > >> maybe it's >> > >> >> > not >> > >> >> > worth the cost of letting the message diverge even >> > further from >> > >> the >> > >> >> > rest of >> > >> >> > the protocol. >> > >> >> > >> > >> >> > -Jason >> > >> >> > >> > >> >> > >> > >> >> > On Wed, Feb 15, 2017 at 8:52 AM, radai < >> > >> radai.rosenbl...@gmail.com> >> > >> >> > wrote: >> > >> >> > >> > >> >> > > I've trimmed the inline contents as this mail is >> > getting too >> > >> big for >> > >> >> > the >> > >> >> > > apache mailing list software to deliver :-( >> > >> >> > > >> > >> >> > > 1. the important thing for interoperability is for >> > different >> > >> >> > "interested >> > >> >> > > parties" (plugins, infra layers/wrappers, >> user-code) >> > to be >> > >> able to >> > >> >> > stick >> > >> >> > > pieces of metadata onto msgs without getting in >> each >> > other's >> > >> way. a >> > >> >> > common >> > >> >> > > key scheme (Strings, as of the time of this >> > writing?) is all >> > >> thats >> > >> >> > required >> > >> >> > > for that. it is assumed that the other end >> > interested in any >> > >> such >> > >> >> > piece of >> > >> >> > > metadata knows the encoding, and byte[] provides >> for >> > the most >> > >> >> > flexibility. >> > >> >> > > i believe this is the same logic behind core kafka >> > being >> > >> >> > byte[]/byte[] - >> > >> >> > > Strings are more "usable" but bytes are flexible >> and >> > so were >> > >> chosen. >> > >> >> > > Also - core kafka doesnt even do that good of a >> job >> > on >> > >> usability of >> > >> >> > the >> > >> >> > > payload (example - i have to specify the nop >> byte[] >> > "decoders" >> > >> >> > explicitly >> > >> >> > > in conf), and again sacrificies usability for the >> > sake of >> > >> >> > performance (no >> > >> >> > > convenient single-record processing as poll is a >> > batch, lots of >> > >> >> > obscure >> > >> >> > > little config details exposing internals of the >> > batching >> > >> mechanism, >> > >> >> > etc) >> > >> >> > > >> > >> >> > > this is also why i really dislike the idea of a >> > "type system" >> > >> for >> > >> >> > header >> > >> >> > > values, it further degrades the usability, adds >> > complexity and >> > >> will >> > >> >> > > eventually get in people's way, also, it would be >> > the 2nd/3rd >> > >> >> > home-group >> > >> >> > > serialization mechanism in core kafka (counting 2 >> > iterations >> > >> of the >> > >> >> > "type >> > >> >> > > definition DSL") >> > >> >> > > >> > >> >> > > 2. this is an implementation detail, and not even >> a >> > very "user >> > >> >> > facing" one? >> > >> >> > > to the best of my understanding the vote process >> is >> > on proposed >> > >> >> > > API/behaviour. also - since we're willing to go >> with >> > strings >> > >> just >> > >> >> > serialize >> > >> >> > > a 0-sized header blob and IIUC you dont need any >> > optionals >> > >> anymore. >> > >> >> > > >> > >> >> > > 3. yes, we can :-) >> > >> >> > > >> > >> >> > > On Tue, Feb 14, 2017 at 11:56 PM, Michael Pearce < >> > >> >> > michael.pea...@ig.com> >> > >> >> > > wrote: >> > >> >> > > >> > >> >> > > > Hi Jay, >> > >> >> > > > >> > >> >> > > > 1) There was some initial debate on the value >> > part, as youll >> > >> note >> > >> >> > String, >> > >> >> > > > String headers were discounted early on. The >> > reason for this >> > >> is >> > >> >> > > flexibility >> > >> >> > > > and keeping in line with the flexibility of key, >> > value of the >> > >> >> > message >> > >> >> > > > object itself. I don’t think it takes away from >> an >> > ecosystem >> > >> as >> > >> >> > each >> > >> >> > > plugin >> > >> >> > > > will care for their own key, this way ints, >> > booleans , exotic >> > >> >> > custom >> > >> >> > > binary >> > >> >> > > > can all be catered for=. >> > >> >> > > > a. If you really wanted to push for a typed >> value >> > interface, >> > >> I >> > >> >> > wouldn’t >> > >> >> > > > want just String values supported, but the the >> > primatives >> > >> plus >> > >> >> > string and >> > >> >> > > > also still keeping the ability to have a binary >> > for custom >> > >> >> > binaries that >> > >> >> > > > some organisations may have. >> > >> >> > > > i. I have written this slight alternative here, >> > >> >> > > https://cwiki.apache.org/ >> > >> >> > > > confluence/display/KAFKA/KIP- >> > 82+-+Add+Record+Headers+-+Typed >> > >> >> > > > ii. Essentially the value bytes, has a leading >> > byte overhead. >> > >> >> > > > 1. This tells you what type the value is, >> before >> > reading >> > >> the rest >> > >> >> > of the >> > >> >> > > > bytes, allowing serialisation/deserialization to >> > and from the >> > >> >> > primitives, >> > >> >> > > > string and byte[]. This is akin to some other >> > messaging >> > >> systems. >> > >> >> > > > 2) We are making it optional, so that for those >> > not wanting >> > >> >> > headers have >> > >> >> > > 0 >> > >> >> > > > bytes overhead (think of it as a feature flag), >> I >> > don’t >> > >> think this >> > >> >> > is >> > >> >> > > > complex, especially if comparing to changes >> > proposed in >> > >> other kips >> > >> >> > like >> > >> >> > > > kip-98. >> > >> >> > > > a. If you really really don’t like this, we can >> > drop it, but >> > >> it >> > >> >> > would >> > >> >> > > mean >> > >> >> > > > buying into 4 bytes extra overhead for users who >> > do not want >> > >> to use >> > >> >> > > headers. >> > >> >> > > > 3) In the summary yes, it is at a higher level, >> > but I think >> > >> this >> > >> >> > is well >> > >> >> > > > documented in the proposed changes section. >> > >> >> > > > a. Added getHeaders method to Producer/Consumer >> > record (that >> > >> is it) >> > >> >> > > > b. We’ve also detailed the new Headers class >> that >> > this method >> > >> >> > returns >> > >> >> > > that >> > >> >> > > > encapsulates the headers protocol and logic. >> > >> >> > > > >> > >> >> > > > Best, >> > >> >> > > > Mike >> > >> >> > > > >> > >> >> > > > ==Original questions from the vote thread from >> > Jay.== >> > >> >> > > > >> > >> >> > > > Couple of things I think we still need to work >> out: >> > >> >> > > > >> > >> >> > > > 1. I think we agree about the key, but I >> think >> > we haven't >> > >> >> > talked about >> > >> >> > > > the value yet. I think if our goal is an open >> > ecosystem >> > >> of these >> > >> >> > > header >> > >> >> > > > spread across many plugins from many systems >> we >> > should >> > >> consider >> > >> >> > making >> > >> >> > > > this >> > >> >> > > > a string as well so it can be printed, set >> via >> > a UI, set >> > >> in >> > >> >> > config, >> > >> >> > > etc. >> > >> >> > > > Basically encouraging pluggable serialization >> > formats >> > >> here will >> > >> >> > lead >> > >> >> > > to >> > >> >> > > > a >> > >> >> > > > bit of a tower of babel. >> > >> >> > > > 2. This proposal still includes a pretty big >> > change to our >> > >> >> > > serialization >> > >> >> > > > and protocol definition layer. Essentially >> it is >> > >> introducing an >> > >> >> > > optional >> > >> >> > > > type, where the format is data dependent. I >> > think this is >> > >> >> > actually a >> > >> >> > > big >> > >> >> > > > change though it doesn't seem like it. It >> means >> > you can no >> > >> >> > longer >> > >> >> > > > specify >> > >> >> > > > this type with our type definition DSL, and >> > likewise it >> > >> requires >> > >> >> > > custom >> > >> >> > > > handling in client libs. This isn't a huge >> > thing, since >> > >> the >> > >> >> > Record >> > >> >> > > > definition is custom anyway, but I think this >> > kind of >> > >> protocol >> > >> >> > > > inconsistency is very non-desirable and ties >> > you to >> > >> hand-coding >> > >> >> > > things. >> > >> >> > > > I >> > >> >> > > > think the type should instead by [Key Value] >> in >> > our BNF, >> > >> where >> > >> >> > key and >> > >> >> > > > value are both short strings as used >> elsewhere. >> > This >> > >> brings it >> > >> >> > in line >> > >> >> > > > with >> > >> >> > > > the rest of the protocol. >> > >> >> > > > 3. Could we get more specific about the exact >> > Java API >> > >> change to >> > >> >> > > > ProducerRecord, ConsumerRecord, Record, etc? >> > >> >> > > > >> > >> >> > > > -Jay >> > >> >> > > > >> > >> >> > > >> > >> >> > >> > >> >> > >> > >> >> > The information contained in this email is strictly >> > confidential and >> > >> for >> > >> >> > the use of the addressee only, unless otherwise >> indicated. >> > If you >> > >> are not >> > >> >> > the intended recipient, please do not read, copy, use or >> > disclose to >> > >> others >> > >> >> > this message or any attachment. Please also notify the >> > sender by >> > >> replying >> > >> >> > to this email or by telephone (+44(020 7896 0011) and >> then >> > delete >> > >> the email >> > >> >> > and any copies of it. Opinions, conclusion (etc) that do >> > not relate >> > >> to the >> > >> >> > official business of this company shall be understood as >> > neither >> > >> given nor >> > >> >> > endorsed by it. IG is a trading name of IG Markets >> Limited >> > (a company >> > >> >> > registered in England and Wales, company number >> 04008957) >> > and IG >> > >> Index >> > >> >> > Limited (a company registered in England and Wales, >> > company number >> > >> >> > 01190902). Registered address at Cannon Bridge House, 25 >> > Dowgate >> > >> Hill, >> > >> >> > London EC4R 2YA. Both IG Markets Limited (register >> number >> > 195355) >> > >> and IG >> > >> >> > Index Limited (register number 114059) are authorised >> and >> > regulated >> > >> by the >> > >> >> > Financial Conduct Authority. >> > >> >> > >> > >> >> > >> >> > >> >> > >> -- >> > >> Nacho - Ignacio Solis - iso...@igso.net >> > >> >> > > >> > > >> > >> > >> > >> > >> > The information contained in this email is strictly confidential and for >> > the use of the addressee only, unless otherwise indicated. If you are >> not >> > the intended recipient, please do not read, copy, use or disclose to >> others >> > this message or any attachment. Please also notify the sender by >> replying >> > to this email or by telephone (+44(020 7896 0011) and then delete the >> email >> > and any copies of it. Opinions, conclusion (etc) that do not relate to >> the >> > official business of this company shall be understood as neither given >> nor >> > endorsed by it. IG is a trading name of IG Markets Limited (a company >> > registered in England and Wales, company number 04008957) and IG Index >> > Limited (a company registered in England and Wales, company number >> > 01190902). Registered address at Cannon Bridge House, 25 Dowgate Hill, >> > London EC4R 2YA. Both IG Markets Limited (register number 195355) and IG >> > Index Limited (register number 114059) are authorised and regulated by >> the >> > Financial Conduct Authority. >> > >> The information contained in this email is strictly confidential and for >> the use of the addressee only, unless otherwise indicated. If you are not >> the intended recipient, please do not read, copy, use or disclose to others >> this message or any attachment. Please also notify the sender by replying >> to this email or by telephone (+44(020 7896 0011) and then delete the email >> and any copies of it. Opinions, conclusion (etc) that do not relate to the >> official business of this company shall be understood as neither given nor >> endorsed by it. IG is a trading name of IG Markets Limited (a company >> registered in England and Wales, company number 04008957) and IG Index >> Limited (a company registered in England and Wales, company number >> 01190902). Registered address at Cannon Bridge House, 25 Dowgate Hill, >> London EC4R 2YA. Both IG Markets Limited (register number 195355) and IG >> Index Limited (register number 114059) are authorised and regulated by the >> Financial Conduct Authority. >> > >