headers dont "leak" into application code. they are useful to application code as well. IIUC samze currently has headers "in-V" and would just switch over to kafka headers if they exist. im sure plenty of other users of kafka would have a use for headers. im pretty sure use cases exist around shuffling data into/out-of kafka (kafka connect or equivalent) where metadata from one end could copied over to the other (S3, for example uses http headers for user-accessible metadata). it will be kafka client code getting/setting those headers. not an interceptor.
On Fri, Feb 17, 2017 at 1:41 PM, Michael Pearce <michael.pea...@ig.com> wrote: > For APM single event tracing, need access to the header at the point of > processing on the processing thread. > > As such interceptors will not work/be suitable for these, due to the fact > they act on the ConsumerRecords as a batch, before the handling thread can > split out and process per message which is the point these tools will need > to continue to transaction tracing. > > Like wise tools and infra pieces will need access to the message outside > the interceptor realm. > > > > On 17/02/2017, 21:26, "Jason Gustafson" <ja...@confluent.io> wrote: > > > > > That’s exactly what we’re doing the headers are a slice of bytes, > which > > then gets parsed later if needed, or can be parsed right away, the > headers > > is part of the protocol, so can still be validated if wanted. > > If you had a header count then you would have to go through each > header > > key and value length value to work out how much to skip to get to > say the > > value or any future component in the message after the headers. > Having it > > as a byte[] with length value makes this a lot easier to skip. > > > So the broker will parse the headers and validate them. Good. The only > reason remaining that I can see to leave the headers as a byte array > is to > make it easier for the client to skip past them. Are we sure this is > not > premature optimization? Are there any performance results which show > that > this is worthwhile? > > What’s the issue with exposing a method getHeaders on the > producer/consumer > > record? It doesn’t break anything. We don’t need any special version. > > > See my previous explanation. What I am trying to resist is the headers > becoming a general application-level facility. The primary use case as > far > as I can tell is middleware, which is the use case that the > interceptors > are providing. > > Current batch consumer model and consumer interceptors don’t work where > > headers need to be acted on at per message level at time of > processing, > > very case is APM (the core one), where the header value is used to > continue > > tracing. > > > I still don't understand the point about batching. The consumer > records are > exposed as a batch in the consumer interceptor, but you can still > iterate > them individually. It is no different for the consumer API itself. > > -Jason > > On Fri, Feb 17, 2017 at 12:48 PM, Michael Pearce < > michael.pea...@ig.com> > wrote: > > > Re: > > > > “ The point about creation of maps seems orthogonal. We can still > > represent > > the headers as a slice of bytes until the time it is accessed.” > > > > That’s exactly what we’re doing the headers are a slice of bytes, > which > > then gets parsed later if needed, or can be parsed right away, the > headers > > is part of the protocol, so can still be validated if wanted. > > > > If you had a header count then you would have to go through each > header > > key and value length value to work out how much to skip to get to > say the > > value or any future component in the message after the headers. > Having it > > as a byte[] with length value makes this a lot easier to skip. > > > > > > On 17/02/2017, 20:37, "Michael Pearce" <michael.pea...@ig.com> > wrote: > > > > What’s the issue with exposing a method getHeaders on the > > producer/consumer record? It doesn’t break anything. We don’t need > any > > special version. > > > > Current batch consumer model and consumer interceptors don’t work > > where headers need to be acted on at per message level at time of > > processing, very case is APM (the core one), where the header value > is used > > to continue tracing. JMS/HTTP etc all expose these, without issues. > I would > > NOT want to lock this down to only be usable accessible via > interceptors, > > as we’d fail on one of the main goals. > > > > Regards > > Mike > > > > > > > > > > On 17/02/2017, 20:21, "Jason Gustafson" <ja...@confluent.io> > wrote: > > > > The point about creation of maps seems orthogonal. We can > still > > represent > > the headers as a slice of bytes until the time it is > accessed. > > > > > > > Yes exactly we have access to the records thus why the > header > > should be > > > accessible via it and not hidden for only interceptors to > access. > > > > > > As explained above, the point is to make the intended usage > clear. > > Applications should continue to rely on the key/value fields > to > > serialize > > their own headers, and it would be more ideal if we can avoid > > leaking > > third-party headers into applications. This is difficult to > do > > with the > > current interceptors because they share the record objects > with > > the common > > API. What I had in mind is something like an extension of the > > current > > interceptors which exposed a different object (e.g. > > `RecordAndHeaders`). > > The challenge is for MM-like use cases. Let me see if I can > come > > up with a > > concrete proposal for that problem. > > > > -Jason > > > > > > > > On Fri, Feb 17, 2017 at 11:55 AM, Michael Pearce < > > michael.pea...@ig.com> > > wrote: > > > > > I am happy to move the definition of the header into the > message > > body, but > > > would cause us not to lazy initialise/parse the headers, as > > obviously, we > > > would have to traverse these reading the message. > > > > > > This was actually one of Jay’s requests: > > > > > > “ 2. I think we should think about creating the Map > lazily to > > avoid > > > parsing out all the headers into little objects. > HashMaps > > themselves > > > are > > > kind of expensive and the consumer is very perf > sensitive so > > and making > > > gazillions of hashmaps that may or may not get used is > > probably a bad > > > idea.” > > > > > > > > > > > > > > > > > > On 17/02/2017, 19:44, "Michael Pearce" < > michael.pea...@ig.com> > > wrote: > > > > > > Yes exactly we have access to the records thus why the > > header should > > > be accessible via it and not hidden for only interceptors > to > > access. > > > > > > Sent using OWA for iPhone > > > ________________________________________ > > > From: Magnus Edenhill <mag...@edenhill.se> > > > Sent: Friday, February 17, 2017 7:34:49 PM > > > To: dev@kafka.apache.org > > > Subject: Re: [DISCUSS] KIP-82 - Add Record Headers > > > > > > Big +1 on VarInts. > > > CPUs are fast, memory is slow. > > > > > > I agree with Jason that we'll want to continue > verifying > > messages, > > > including their headers, so while I appreciate the > idea of > > the opaque > > > header blob it won't be useful in practice. > > > > > > /Magnus > > > > > > 2017-02-17 10:41 GMT-08:00 Jason Gustafson < > > ja...@confluent.io>: > > > > > > > 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. > > > > >> > > > > > > > > > > > > > > > > > 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. > > > > > > > > > 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. >