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.
> >>
> >
> >
>

Reply via email to