and we can start with {namespace, id} and no re-mapping support and always add it later on if/when collisions actually happen (i dont think they'd be a problem).
every interested party (so orgs or individuals) could then register a prefix (0 = reserved, 1 = confluent ... 666 = me :-) ) and do whatever with the 2nd ID - so once linkedin registers, say 3, then linkedin devs are free to use {3, *} with a reasonable expectation to to collide with anything else. further partitioning of that * becomes linkedin's problem, but the "upstream registration" of a namespace only has to happen once. On Tue, Nov 8, 2016 at 9:03 PM, James Cheng <wushuja...@gmail.com> wrote: > > > > > On 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, if I understand your example right, an application deployer might > decide to use 0x01 in one deployment, and that means that once the message > is written into the broker, it will be saved on the broker with that > specific namespace (0x01). > > If you were to mirror that message into another cluster, the 0x01 would > accompany the message, right? What if the deployers of the same app in the > other cluster uses 0x57? They won't understand each other? > > I'm not sure that's an avoidable problem. I think it simply means that in > order to share data, you have to also have a shared (agreed upon) > understanding of what the namespaces mean. Which I think makes sense, > because the alternate (sharing *nothing* at all) would mean that there > would be no way to understand each other. > > -James > > > 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 > >