+1 for {namespace, plugin}, would definitely cut down on registration overhead.
On Tue, Nov 8, 2016 at 5:54 PM, Gwen Shapira <g...@confluent.io> wrote: > Thank you so much for this clear and fair summary of the arguments. > > I'm in favor of ints. Not a deal-breaker, but in favor. > > Even more in favor of Magnus's decentralized suggestion with Roger's > tweak: add a namespace for headers. This will allow each app to just > use whatever IDs it wants internally, and then let the admin deploying > the app figure out an available namespace ID for the app to live in. > So io.confluent.schema-registry can be namespace 0x01 on my deployment > and 0x57 on yours, and the poor guys developing the app don't need to > worry about that. > > Gwen > > On Tue, Nov 8, 2016 at 4:23 PM, radai <radai.rosenbl...@gmail.com> wrote: > > +1 for sean's document. it covers pretty much all the trade-offs and > > provides concrete figures to argue about :-) > > (nit-picking - used the same xkcd twice, also trove has been superceded > for > > purposes of high performance collections: look at > > https://github.com/leventov/Koloboke) > > > > so to sum up the string vs int debate: > > > > performance - you can do 140k ops/sec _per thread_ with string headers. > you > > could do x2-3 better with ints. there's no arguing the relative diff > > between the two, there's only the question of whether or not _the rest of > > kafka_ operates fast enough to care. if we want to make choices solely > > based on performance we need ints. if we are willing to settle/compromise > > for a nicer (to some) API than strings are good enough for the current > > state of affairs. > > > > message size - with batching and compression it comes down to a ~5% > > difference (internal testing, not in the doc. maybe would help adding if > > this becomes a point of contention?). this means it wont really affect > > kafka in "throughput mode" (large, compressed batches). in "low latency" > > mode (meaning less/no batching and compression) the difference can be > > extreme (it'll easily be an order of magnitude with small payloads like > > stock ticks and header keys of the form > > "com.acme.infraTeam.kafka.hiMom.auditPlugin"). we have a few such > topics at > > linkedin where actual payloads are ~2 ints and are eclipsed by our > in-house > > audit "header" which is why we liked ints to begin with. > > > > "ease of use" - strings would probably still require _some_ degree of > > partitioning by convention (imagine if everyone used the key "infra"...) > > but its very intuitive for java devs to do anyway (reverse-domain is > > ingrained into java developers at a young age :-) ). also most java devs > > find Map<String, whatever> more intuitive than Map<Integer, whatever> - > > probably because of other text-based protocols like http. ints would > > require a number registry. if you think number registries are hard just > > look at the wiki page for KIPs (specifically the number for next > available > > KIP) and think again - we are probably talking about the same volume of > > requests. also this would only be "required" (good citizenship, more > like) > > if you want to publish your plugin for others to use. within your org do > > whatever you want - just know that if you use [some "reserved" range] > and a > > future kafka update breaks it its your problem. RTFM. > > > > personally im in favor of ints. > > > > having said that (and like nacho) I will settle if int vs string remains > > the only obstacle to this. > > > > On Tue, Nov 8, 2016 at 3:53 PM, Nacho Solis <nso...@linkedin.com.invalid > > > > wrote: > > > >> I think it's well known I've been pushing for ints (and I could switch > to > >> 16 bit shorts if pressed). > >> > >> - efficient (space) > >> - efficient (processing) > >> - easily partitionable > >> > >> > >> However, if the only thing that is keeping us from adopting headers is > the > >> use of strings vs ints as keys, then I would cave in and accept > strings. If > >> we do so, I would like to limit string keys to 128 bytes in length. > This > >> way 1) I could use a 3 letter string if I wanted (effectively using 4 > total > >> bytes), 2) limit overall impact of possible keys (don't really want > people > >> to send a 16K header string key). > >> > >> Nacho > >> > >> > >> On Tue, Nov 8, 2016 at 3:35 PM, Gwen Shapira <g...@confluent.io> wrote: > >> > >> > Forgot to mention: Thank you for quantifying the trade-off - it is > >> > helpful and important regardless of what we end up deciding. > >> > > >> > On Tue, Nov 8, 2016 at 3:12 PM, Sean McCauliff > >> > <smccaul...@linkedin.com.invalid> wrote: > >> > > On Tue, Nov 8, 2016 at 2:15 PM, Gwen Shapira <g...@confluent.io> > >> wrote: > >> > > > >> > >> Since Kafka specifically targets high-throughput, low-latency > >> > >> use-cases, I don't think we should trade them off that easily. > >> > >> > >> > > > >> > > I find these kind of design goals not to be really helpful unless > it's > >> > > quantified in someway. Because it's always possible to argue > against > >> > > something as either being not performant or just an implementation > >> > detail. > >> > > > >> > > This is a single threaded benchmarks so all the measurements are per > >> > > thread. > >> > > > >> > > For 1M messages/s/thread if header keys are int and you had even a > >> > single > >> > > header key, value pair then it's still about 2^-2 microseconds which > >> > means > >> > > you only have another 0.75 microseconds to do everything else you > want > >> to > >> > > do with a message (1M messages/s means 1 micro second per message). > >> With > >> > > string header keys there is still 0.5 micro seconds to process a > >> message. > >> > > > >> > > > >> > > > >> > > I love strings as much as the next guy (we had them in Flume), but I > >> > >> was convinced by Magnus/Michael/Radai that strings don't actually > have > >> > >> strong benefits as opposed to ints (you'll need a string registry > >> > >> anyway - otherwise, how will you know what does the "profile_id" > >> > >> header refers to?) and I want to keep closer to our original design > >> > >> goals for Kafka. > >> > >> > >> > > > >> > > "confluent.profile_id" > >> > > > >> > > > >> > >> > >> > >> If someone likes strings in the headers and doesn't do millions of > >> > >> messages a sec, they probably have lots of other systems they can > use > >> > >> instead. > >> > >> > >> > > > >> > > None of them will scale like Kafka. Horizontal scaling is still > good. > >> > > > >> > > > >> > >> > >> > >> > >> > >> On Tue, Nov 8, 2016 at 1:22 PM, Sean McCauliff > >> > >> <smccaul...@linkedin.com.invalid> wrote: > >> > >> > +1 for String keys. > >> > >> > > >> > >> > I've been doing some bechmarking and it seems like the speedup > for > >> > using > >> > >> > integer keys is about 2-5 depending on the length of the strings > and > >> > what > >> > >> > collections are being used. The overall amount of time spent > >> parsing > >> > a > >> > >> set > >> > >> > of header key, value pairs probably does not matter unless you > are > >> > >> getting > >> > >> > close to 1M messages per consumer. In which case probably don't > use > >> > >> > headers. There is also the option to use very short strings; > some > >> > that > >> > >> are > >> > >> > even shorter than integers. > >> > >> > > >> > >> > Partitioning the string key space will be easier than > partitioning > >> an > >> > >> > integer key space. We won't need a global registry. Kafka > >> internally > >> > can > >> > >> > reserve some prefix like "_" as its namespace. Everyone else can > >> use > >> > >> their > >> > >> > company or project name as namespace prefix and life should be > good. > >> > >> > > >> > >> > Here's the link to some of the benchmarking info: > >> > >> > https://docs.google.com/document/d/1tfT- > >> > 6SZdnKOLyWGDH82kS30PnUkmgb7nPL > >> > >> dw6p65pAI/edit?usp=sharing > >> > >> > > >> > >> > > >> > >> > > >> > >> > -- > >> > >> > Sean McCauliff > >> > >> > Staff Software Engineer > >> > >> > Kafka > >> > >> > > >> > >> > smccaul...@linkedin.com > >> > >> > linkedin.com/in/sean-mccauliff-b563192 > >> > >> > > >> > >> > On Mon, Nov 7, 2016 at 11:51 PM, Michael Pearce < > >> > michael.pea...@ig.com> > >> > >> > wrote: > >> > >> > > >> > >> >> +1 on this slimmer version of our proposal > >> > >> >> > >> > >> >> I def think the Id space we can reduce from the proposed > >> > int32(4bytes) > >> > >> >> down to int16(2bytes) it saves on space and as headers we > wouldn't > >> > >> expect > >> > >> >> the number of headers being used concurrently being that high. > >> > >> >> > >> > >> >> I would wonder if we should make the value byte array length > still > >> > int32 > >> > >> >> though as This is the standard Max array length in Java saying > that > >> > it > >> > >> is a > >> > >> >> header and I guess limiting the size is sensible and would work > for > >> > all > >> > >> the > >> > >> >> use cases we have in mind so happy with limiting this. > >> > >> >> > >> > >> >> Do people generally concur on Magnus's slimmer version? Anyone > see > >> > any > >> > >> >> issues if we moved from int32 to int16? > >> > >> >> > >> > >> >> Re configurable ids per plugin over a global registry also would > >> work > >> > >> for > >> > >> >> us. As such if this has better concensus over the proposed > global > >> > >> registry > >> > >> >> I'd be happy to change that. > >> > >> >> > >> > >> >> I was already sold on ints over strings for keys ;) > >> > >> >> > >> > >> >> Cheers > >> > >> >> Mike > >> > >> >> > >> > >> >> ________________________________________ > >> > >> >> From: Magnus Edenhill <mag...@edenhill.se> > >> > >> >> Sent: Monday, November 7, 2016 10:10:21 PM > >> > >> >> To: dev@kafka.apache.org > >> > >> >> Subject: Re: [DISCUSS] KIP-82 - Add Record Headers > >> > >> >> > >> > >> >> Hi, > >> > >> >> > >> > >> >> I'm +1 for adding generic message headers, but I do share the > >> > concerns > >> > >> >> previously aired on this thread and during the KIP meeting. > >> > >> >> > >> > >> >> So let me propose a slimmer alternative that does not require > any > >> > sort > >> > >> of > >> > >> >> global header registry, does not affect broker performance or > >> > >> operations, > >> > >> >> and adds as little overhead as possible. > >> > >> >> > >> > >> >> > >> > >> >> Message > >> > >> >> ------------ > >> > >> >> The protocol Message type is extended with a Headers array > consting > >> > of > >> > >> >> Tags, where a Tag is defined as: > >> > >> >> int16 Id > >> > >> >> int16 Len // binary_data length > >> > >> >> binary_data[Len] // opaque binary data > >> > >> >> > >> > >> >> > >> > >> >> Ids > >> > >> >> --- > >> > >> >> The Id space is not centrally managed, so whenever an > application > >> > needs > >> > >> to > >> > >> >> add headers, or use an eco-system plugin that does, its Id > >> allocation > >> > >> will > >> > >> >> need to be manually configured. > >> > >> >> This moves the allocation concern from the global space down to > >> > >> >> organization level and avoids the risk for id conflicts. > >> > >> >> Example pseudo-config for some app: > >> > >> >> sometrackerplugin.tag.sourcev3.id=1000 > >> > >> >> dbthing.tag.tablename.id=1001 > >> > >> >> myschemareg.tag.schemaname.id=1002 > >> > >> >> myschemareg.tag.schemaversion.id=1003 > >> > >> >> > >> > >> >> > >> > >> >> Each header-writing or header-reading plugin must provide means > >> > >> (typically > >> > >> >> through configuration) to specify the tag for each header it > uses. > >> > >> Defaults > >> > >> >> should be avoided. > >> > >> >> A consumer silently ignores tags it does not have a mapping for > >> > (since > >> > >> the > >> > >> >> binary_data can't be parsed without knowing what it is). > >> > >> >> > >> > >> >> Id range 0..999 is reserved for future use by the broker and > must > >> > not be > >> > >> >> used by plugins. > >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> Broker > >> > >> >> --------- > >> > >> >> The broker does not process the tags (other than the standard > >> > protocol > >> > >> >> syntax verification), it simply stores and forwards them as > opaque > >> > data. > >> > >> >> > >> > >> >> Standard message translation (removal of Headers) kicks in for > >> older > >> > >> >> clients. > >> > >> >> > >> > >> >> > >> > >> >> Why not string ids? > >> > >> >> ------------------------- > >> > >> >> String ids might seem like a good idea, but: > >> > >> >> * does not really solve uniqueness > >> > >> >> * consumes a lot of space (2 byte string length + string, per > >> > header) > >> > >> to > >> > >> >> be meaningful > >> > >> >> * doesn't really say anything how to parse the tag's data, so > it > >> is > >> > in > >> > >> >> effect useless on its own. > >> > >> >> > >> > >> >> > >> > >> >> Regards, > >> > >> >> Magnus > >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> > >> > >> >> 2016-11-07 18:32 GMT+01:00 Michael Pearce < > michael.pea...@ig.com>: > >> > >> >> > >> > >> >> > Hi Roger, > >> > >> >> > > >> > >> >> > Thanks for the support. > >> > >> >> > > >> > >> >> > I think the key thing is to have a common key space to make an > >> > >> ecosystem, > >> > >> >> > there does have to be some level of contract for people to > play > >> > >> nicely. > >> > >> >> > > >> > >> >> > Having map<String, byte[]> or as per current proposed in kip > of > >> > >> having a > >> > >> >> > numerical key space of map<int, byte[]> is a level of the > >> contract > >> > >> that > >> > >> >> > most people would expect. > >> > >> >> > > >> > >> >> > I think the example in a previous comment someone else made > >> > linking to > >> > >> >> AWS > >> > >> >> > blog and also implemented api where originally they didn’t > have a > >> > >> header > >> > >> >> > space but not they do, where keys are uniform but the value > can > >> be > >> > >> >> string, > >> > >> >> > int, anything is a good example. > >> > >> >> > > >> > >> >> > Having a custom MetadataSerializer is something we had played > >> with, > >> > >> but > >> > >> >> > discounted the idea, as if you wanted everyone to work the > same > >> > way in > >> > >> >> the > >> > >> >> > ecosystem, having to have this also customizable makes it a > bit > >> > >> harder. > >> > >> >> > Think about making the whole message record custom > serializable, > >> > this > >> > >> >> would > >> > >> >> > make it fairly tricky (though it would not be impossible) to > have > >> > made > >> > >> >> work > >> > >> >> > nicely. Having the value customizable we thought is a > reasonable > >> > >> tradeoff > >> > >> >> > here of flexibility over contract of interaction between > >> different > >> > >> >> parties. > >> > >> >> > > >> > >> >> > Is there a particular case or benefit of having serialization > >> > >> >> customizable > >> > >> >> > that you have in mind? > >> > >> >> > > >> > >> >> > Saying this it is obviously something that could be > implemented, > >> if > >> > >> there > >> > >> >> > is a need. If we did go this avenue I think a defaulted > >> serializer > >> > >> >> > implementation should exist so for the 80:20 rule, people can > >> just > >> > >> have > >> > >> >> the > >> > >> >> > broker and clients get default behavior. > >> > >> >> > > >> > >> >> > Cheers > >> > >> >> > Mike > >> > >> >> > > >> > >> >> > On 11/6/16, 5:25 PM, "radai" <radai.rosenbl...@gmail.com> > wrote: > >> > >> >> > > >> > >> >> > making header _key_ serialization configurable potentially > >> > >> undermines > >> > >> >> > the > >> > >> >> > board usefulness of the feature (any point along the path > >> must > >> > be > >> > >> >> able > >> > >> >> > to > >> > >> >> > read the header keys. the values may be whatever and > require > >> > more > >> > >> >> > intimate > >> > >> >> > knowledge of the code that produced specific headers, but > >> keys > >> > >> should > >> > >> >> > be > >> > >> >> > universally readable). > >> > >> >> > > >> > >> >> > it would also make it hard to write really portable > plugins - > >> > say > >> > >> i > >> > >> >> > wrote a > >> > >> >> > large message splitter/combiner - if i rely on key > >> > "largeMessage" > >> > >> and > >> > >> >> > values of the form "1/20" someone who uses (contrived > >> example) > >> > >> >> > Map<Byte[], > >> > >> >> > Double> wouldnt be able to re-use my code. > >> > >> >> > > >> > >> >> > not the end of a the world within an organization, but > >> > >> problematic if > >> > >> >> > you > >> > >> >> > want to enable an ecosystem > >> > >> >> > > >> > >> >> > On Thu, Nov 3, 2016 at 2:04 PM, Roger Hoover < > >> > >> roger.hoo...@gmail.com > >> > >> >> > > >> > >> >> > wrote: > >> > >> >> > > >> > >> >> > > As others have laid out, I see strong reasons for a > common > >> > >> message > >> > >> >> > > metadata structure for the Kafka ecosystem. In > particular, > >> > I've > >> > >> >> > seen that > >> > >> >> > > even within a single organization, infrastructure teams > >> often > >> > >> own > >> > >> >> the > >> > >> >> > > message metadata while application teams own the > >> > >> application-level > >> > >> >> > data > >> > >> >> > > format. Allowing metadata and content to have different > >> > >> structure > >> > >> >> > and > >> > >> >> > > evolve separately is very helpful for this. Also, I > think > >> > >> there's > >> > >> >> a > >> > >> >> > lot of > >> > >> >> > > value to having a common metadata structure shared > across > >> the > >> > >> Kafka > >> > >> >> > > ecosystem so that tools which leverage metadata can more > >> > easily > >> > >> be > >> > >> >> > shared > >> > >> >> > > across organizations and integrated together. > >> > >> >> > > > >> > >> >> > > The question is, where does the metadata structure > belong? > >> > >> Here's > >> > >> >> > my take: > >> > >> >> > > > >> > >> >> > > We change the Kafka wire and on-disk format to from a > (key, > >> > >> value) > >> > >> >> > model to > >> > >> >> > > a (key, metadata, value) model where all three are byte > >> > arrays > >> > >> from > >> > >> >> > the > >> > >> >> > > brokers point of view. The primary reason for this is > that > >> > it > >> > >> >> > provides a > >> > >> >> > > backward compatible migration path forward. Producers > can > >> > start > >> > >> >> > populating > >> > >> >> > > metadata fields before all consumers understand the > >> metadata > >> > >> >> > structure. > >> > >> >> > > For people who already have custom envelope structures, > >> they > >> > can > >> > >> >> > populate > >> > >> >> > > their existing structure and the new structure for a > while > >> as > >> > >> they > >> > >> >> > make the > >> > >> >> > > transition. > >> > >> >> > > > >> > >> >> > > We could stop there and let the clients plug in a > >> > KeySerializer, > >> > >> >> > > MetadataSerializer, and ValueSerializer but I think it > is > >> > also > >> > >> be > >> > >> >> > useful to > >> > >> >> > > have a default MetadataSerializer that implements a > >> key-value > >> > >> model > >> > >> >> > similar > >> > >> >> > > to AMQP or HTTP headers. Or we could go even further > and > >> > >> >> prescribe a > >> > >> >> > > Map<String, byte[]> or Map<String, String> data model > for > >> > >> headers > >> > >> >> in > >> > >> >> > the > >> > >> >> > > clients (while still allowing custom serialization of > the > >> > header > >> > >> >> data > >> > >> >> > > model). > >> > >> >> > > > >> > >> >> > > I think this would address Radai's concerns: > >> > >> >> > > 1. All client code would not need to be updated to know > >> about > >> > >> the > >> > >> >> > > container. > >> > >> >> > > 2. Middleware friendly clients would have a standard > header > >> > data > >> > >> >> > model to > >> > >> >> > > work with. > >> > >> >> > > 3. KIP is required both b/c of broker changes and > because > >> of > >> > >> client > >> > >> >> > API > >> > >> >> > > changes. > >> > >> >> > > > >> > >> >> > > Cheers, > >> > >> >> > > > >> > >> >> > > Roger > >> > >> >> > > > >> > >> >> > > > >> > >> >> > > On Wed, Nov 2, 2016 at 4:38 PM, radai < > >> > >> radai.rosenbl...@gmail.com> > >> > >> >> > wrote: > >> > >> >> > > > >> > >> >> > > > my biggest issues with a "standard" wrapper format: > >> > >> >> > > > > >> > >> >> > > > 1. _ALL_ client _CODE_ (as opposed to kafka lib > version) > >> > must > >> > >> be > >> > >> >> > updated > >> > >> >> > > to > >> > >> >> > > > know about the container, because any old naive code > >> > trying to > >> > >> >> > directly > >> > >> >> > > > deserialize its own payload would keel over and die > (it > >> > needs > >> > >> to > >> > >> >> > know to > >> > >> >> > > > deserialize a container, and then dig in there for its > >> > >> payload). > >> > >> >> > > > 2. in order to write middleware-friendly clients that > >> > utilize > >> > >> >> such > >> > >> >> > a > >> > >> >> > > > container one would basically have to write their own > >> > >> >> > producer/consumer > >> > >> >> > > API > >> > >> >> > > > on top of the open source kafka one. > >> > >> >> > > > 3. if you were going to go with a wrapper format you > >> really > >> > >> dont > >> > >> >> > need to > >> > >> >> > > > bother with a kip (just open source your own client > stack > >> > >> from #2 > >> > >> >> > above > >> > >> >> > > so > >> > >> >> > > > others could stop re-inventing it) > >> > >> >> > > > > >> > >> >> > > > On Wed, Nov 2, 2016 at 4:25 PM, James Cheng < > >> > >> >> wushuja...@gmail.com> > >> > >> >> > > wrote: > >> > >> >> > > > > >> > >> >> > > > > How exactly would this work? Or maybe that's out of > >> scope > >> > >> for > >> > >> >> > this > >> > >> >> > > email. > >> > >> >> > > > > >> > >> >> > > > >> > >> >> > > >> > >> >> > > >> > >> >> > 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. > >> > >> >> > >> > >> > >> > >> > >> > >> > >> > >> -- > >> > >> Gwen Shapira > >> > >> Product Manager | Confluent > >> > >> 650.450.2760 | @gwenshap > >> > >> Follow us: Twitter | blog > >> > >> > >> > > >> > > >> > > >> > -- > >> > Gwen Shapira > >> > Product Manager | Confluent > >> > 650.450.2760 | @gwenshap > >> > Follow us: Twitter | blog > >> > > >> > >> > >> > >> -- > >> Nacho (Ignacio) Solis > >> Kafka > >> nso...@linkedin.com > >> > > > > -- > Gwen Shapira > Product Manager | Confluent > 650.450.2760 | @gwenshap > Follow us: Twitter | blog >