Hello everyone! (Wow, it's been a while since I dropped by and said hello... )
Super-interesting discussion. Adrian: "What is the approach you envision regarding the IDL? Should we strive for a pure IDL definition of the service? That could be an interesting approach that would make it possible for a third party to generate their own infinispan grpc client in any new language that we do not already offer support, just based on the IDL. And maybe using a different grpc implementation if they do not find suitable the one from google." This is spot-on, and where I see value in gRPC being incorporated into Infinispan: making use of open(-ish) standards of RPC communication and applying that to how we do client/server. Good discussion on handling payload types in the interface definition. I've made use of some of the ideas discussed here when creating a proto-defined IDL to look up ... more serialized proto definitions for given types! Keen to see what your PoC looks like. - M On Wed, 30 May 2018 at 08:19 Galder Zamarreno <gal...@redhat.com> wrote: > On Wed, May 30, 2018 at 5:00 PM Radim Vansa <rva...@redhat.com> wrote: > >> On 05/30/2018 02:53 PM, Sanne Grinovero wrote: >> > On 30 May 2018 at 13:26, Adrian Nistor <anis...@redhat.com> wrote: >> >> Yest, the client needs that hash but that does not necessarily mean it >> >> has to compute it itself. >> >> The hash should be applied to the storage format which might be >> >> different from the format the client sees. So hash computation could be >> >> done on the server, just a thought. >> > Unless we want to explore some form of hybrid gRPC which benefits from >> > Hot Rod intelligence level 3? >> >> Since Tristan said that gRPC is viable only if the performance is >> comparable - I concluded that this involves the smart routing. I was >> hoping that gRPC networking layer would provide some hook to specify the >> destination. > > > It does, via SubchannelPicker implementations. It requires key to be sent > as HTTP header down the stack so that the SubchannelPicker can extract it. > > SubchannelPicker impl can then apply hash on it and decide based on > available channels. > > >> An alternative would be a proxy hosted on the same node >> that would do the routing. > > >> If we're to replace Hot Rod I was expecting the (generated) gRPC client >> to be extensible enough to allow us add client-side features (like near >> cache, maybe listeners would need client-side code too) but saving us >> most of the hassle with networking and parsing, while providing basic >> client in languages we don't embrace without additional cost. >> >> R. >> >> > >> > In which case the client will need to compute the hash before it can >> > hint the network layer were to connect to. >> > >> > Thanks, >> > Sanne >> > >> >> On 05/30/2018 02:47 PM, Radim Vansa wrote: >> >>> On 05/30/2018 12:46 PM, Adrian Nistor wrote: >> >>>> Thanks for clarifying this Galder. >> >>>> Yes, the network layer is indeed the culprit and the purpose of this >> >>>> experiment. >> >>>> >> >>>> What is the approach you envision regarding the IDL? Should we strive >> >>>> for a pure IDL definition of the service? That could be an >> interesting >> >>>> approach that would make it possible for a third party to generate >> >>>> their own infinispan grpc client in any new language that we do not >> >>>> already offer support, just based on the IDL. And maybe using a >> >>>> different grpc implementation if they do not find suitable the one >> >>>> from google. >> >>>> >> >>>> I was not suggesting we should do type transformation or anything on >> >>>> the client side that would require an extra layer of code on top of >> >>>> what grpc generates for the client, so maybe a pure IDL based service >> >>>> definition would indeed be possible, without extra helpers. No type >> >>>> transformation, just type information. Exposing the type info that >> >>>> comes from the server would be enough, a lot better than dumbing >> >>>> everything down to a byte[]. >> >>> I may be wrong but key transformation on client is necessary for >> correct >> >>> hash-aware routing, isn't it? We need to get byte array for each key >> and >> >>> apply murmur hash there (IIUC even when we use protobuf as the storage >> >>> format, segment is based on the raw protobuf bytes, right?). >> >>> >> >>> Radim >> >>> >> >>>> Adrian >> >>>> >> >>>> On 05/30/2018 12:16 PM, Galder Zamarreno wrote: >> >>>>> On Tue, May 29, 2018 at 8:57 PM Adrian Nistor <anis...@redhat.com >> >>>>> <mailto:anis...@redhat.com>> wrote: >> >>>>> >> >>>>> Vittorio, a few remarks regarding your statement "...The >> >>>>> alternative to this is to develop a protostream equivalent for >> >>>>> each supported language and it doesn't seem really feasible >> to me." >> >>>>> >> >>>>> No way! That's a big misunderstanding. We do not need to >> >>>>> re-implement the protostream library in C/C++/C# or any new >> >>>>> supported language. >> >>>>> Protostream is just for Java and it is compatible with >> Google's >> >>>>> protobuf lib we already use in the other clients. We can >> continue >> >>>>> using Google's protobuf lib for these clients, with or >> without gRPC. >> >>>>> Protostream does not handle protobuf services as gRPC does, >> but >> >>>>> we can add support for that with little effort. >> >>>>> >> >>>>> The real problem here is if we want to replace our hot rod >> >>>>> invocation protocol with gRPC to save on the effort of >> >>>>> implementing and maintaining hot rod in all those clients. I >> >>>>> wonder why the obvious question is being avoided in this >> thread. >> >>>>> >> >>>>> >> >>>>> ^ It is not being avoided. I stated it quite clearly when I replied >> >>>>> but maybe not with enough detail. So, I said: >> >>>>> >> >>>>>> The biggest problem I see in our client/server architecture is >> the >> >>>>> ability to quickly deliver features/APIs across multiple language >> >>>>> clients. Both Vittorio and I have seen how long it takes to >> implement >> >>>>> all the different features available in Java client and port them to >> >>>>> Node.js, C/C++/C#...etc. This effort lead by Vittorio is trying to >> >>>>> improve on that by having some of that work done for us. Granted, >> not >> >>>>> all of it will be done, but it should give us some good foundations >> >>>>> on which to build. >> >>>>> >> >>>>> To expand on it a bit further: the reason it takes us longer to get >> >>>>> different features in is because each client implements its own >> >>>>> network layer, parses the protocol and does type transformations >> >>>>> (between byte[] and whatever the client expects). >> >>>>> >> >>>>> IMO, the most costly things there are getting the network layer >> right >> >>>>> (from experience with Node.js, it has taken a while to do so) and >> >>>>> parsing work (not only parsing itself, but doing it in a efficient >> >>>>> way). Network layer also includes load balancing, failover, cluster >> >>>>> failover...etc. >> >>>>> >> >>>>> From past experience, transforming from byte[] to what the client >> >>>>> expects has never really been very problematic for me. What's been >> >>>>> difficult here is coming up with encoding architecture that Gustavo >> >>>>> lead, whose aim was to improve on the initial compatibility mode. >> >>>>> But, with that now clear, understood and proven to solve our issues, >> >>>>> the rest in this area should be fairly straightforward IMO. >> >>>>> >> >>>>> Type transformation, once done, is a constant. As we add more Hot >> Rod >> >>>>> operations, it's mostly the parsing that starts to become more work. >> >>>>> Network can also become more work if instead of RPC commands you >> >>>>> start supporting streams based commands. >> >>>>> >> >>>>> gRPC solves the network (FYI: with key as HTTP header and >> >>>>> SubchannelPicker you can do hash-aware routing) and parsing for us. >> I >> >>>>> don't see the need for it to solve our type transformations for us. >> >>>>> If it does it, great, but does it support our compatibility >> >>>>> requirements? (I had already told Vittorio to check Gustavo on >> this). >> >>>>> Type transformation is a lower prio for me, network and parsing are >> >>>>> more important. >> >>>>> >> >>>>> Hope this clarifies better my POV. >> >>>>> >> >>>>> Cheers >> >>>>> >> >>>>> >> >>>>> >> >>>>> Adrian >> >>>>> >> >>>>> >> >>>>> On 05/29/2018 03:45 PM, Vittorio Rigamonti wrote: >> >>>>>> Thanks Adrian, >> >>>>>> >> >>>>>> of course there's a marshalling work under the cover and >> that is >> >>>>>> reflected into the generated code (specially the accessor >> >>>>>> methods generated from the oneof clause). >> >>>>>> >> >>>>>> My opinion is that on the client side this could be >> accepted, as >> >>>>>> long as the API are well defined and documented: application >> >>>>>> developer can build an adhoc decorator on the top if needed. >> The >> >>>>>> alternative to this is to develop a protostream equivalent >> for >> >>>>>> each supported language and it doesn't seem really feasible >> to me. >> >>>>>> >> >>>>>> On the server side (java only) the situation is different: >> >>>>>> protobuf is optimized for streaming not for storing so >> probably >> >>>>>> a Protostream layer is needed. >> >>>>>> >> >>>>>> On Mon, May 28, 2018 at 4:47 PM, Adrian Nistor >> >>>>>> <anis...@redhat.com <mailto:anis...@redhat.com>> wrote: >> >>>>>> >> >>>>>> Hi Vittorio, >> >>>>>> thanks for exploring gRPC. It seems like a very elegant >> >>>>>> solution for exposing services. I'll have a look at your >> PoC >> >>>>>> soon. >> >>>>>> >> >>>>>> I feel there are some remarks that need to be made >> regarding >> >>>>>> gRPC. gRPC is just some nice cheesy topping on top of >> >>>>>> protobuf. Google's implementation of protobuf, to be more >> >>>>>> precise. >> >>>>>> It does not need handwritten marshallers, but the 'No >> need >> >>>>>> for marshaller' does not accurately describe it. >> Marshallers >> >>>>>> are needed and are generated under the cover by the >> library >> >>>>>> and so are the data objects and you are unfortunately >> forced >> >>>>>> to use them. That's both the good news and the bad news:) >> >>>>>> The whole thing looks very promising and friendly for >> many >> >>>>>> uses cases, especially for demos and PoCs :))). Nobody >> wants >> >>>>>> to write those marshallers. But it starts to become a >> >>>>>> nuisance if you want to use your own data objects. >> >>>>>> There is also the ugliness and excessive memory >> footprint of >> >>>>>> the generated code, which is the reason Infinispan did >> not >> >>>>>> adopt the protobuf-java library although it did adopt >> >>>>>> protobuf as an encoding format. >> >>>>>> The Protostream library was created as an alternative >> >>>>>> implementation to solve the aforementioned problems with >> the >> >>>>>> generated code. It solves this by letting the user >> provide >> >>>>>> their own data objects. And for the marshallers it gives >> you >> >>>>>> two options: a) write the marshaller yourself (hated), b) >> >>>>>> annotated your data objects and the marshaller gets >> >>>>>> generated (loved). Protostream does not currently support >> >>>>>> service definitions right now but this is something I >> >>>>>> started to investigate recently after Galder asked me if >> I >> >>>>>> think it's doable. I think I'll only find out after I do >> it:) >> >>>>>> >> >>>>>> Adrian >> >>>>>> >> >>>>>> >> >>>>>> On 05/28/2018 04:15 PM, Vittorio Rigamonti wrote: >> >>>>>>> Hi Infinispan developers, >> >>>>>>> >> >>>>>>> I'm working on a solution for developers who need to >> access >> >>>>>>> Infinispan services through different programming >> languages. >> >>>>>>> >> >>>>>>> The focus is not on developing a full featured client, >> but >> >>>>>>> rather discover the value and the limits of this >> approach. >> >>>>>>> >> >>>>>>> - is it possible to automatically generate useful >> clients >> >>>>>>> in different languages? >> >>>>>>> - can that clients interoperate on the same cache with >> the >> >>>>>>> same data types? >> >>>>>>> >> >>>>>>> I came out with a small prototype that I would like to >> >>>>>>> submit to you and on which I would like to gather your >> >>>>>>> impressions. >> >>>>>>> >> >>>>>>> You can found the project here [1]: is a gRPC-based >> >>>>>>> client/server architecture for Infinispan based on and >> >>>>>>> EmbeddedCache, with very few features exposed atm. >> >>>>>>> >> >>>>>>> Currently the project is nothing more than a poc with >> the >> >>>>>>> following interesting features: >> >>>>>>> >> >>>>>>> - client can be generated in all the grpc supported >> >>>>>>> language: java, go, c++ examples are provided; >> >>>>>>> - the interface is full typed. No need for marshaller >> and >> >>>>>>> clients build in different language can cooperate on the >> >>>>>>> same cache; >> >>>>>>> >> >>>>>>> The second item is my preferred one beacuse it frees the >> >>>>>>> developer from data marshalling. >> >>>>>>> >> >>>>>>> What do you think about? >> >>>>>>> Sounds interesting? >> >>>>>>> Can you see any flaw? >> >>>>>>> >> >>>>>>> There's also a list of issues for the future [2], >> basically >> >>>>>>> I would like to investigate these questions: >> >>>>>>> How far this architecture can go? >> >>>>>>> Topology, events, queries... how many of the Infinispan >> >>>>>>> features can be fit in a grpc architecture? >> >>>>>>> >> >>>>>>> Thank you >> >>>>>>> Vittorio >> >>>>>>> >> >>>>>>> [1] https://github.com/rigazilla/ispn-grpc >> >>>>>>> [2] https://github.com/rigazilla/ispn-grpc/issues >> >>>>>>> >> >>>>>>> -- >> >>>>>>> >> >>>>>>> Vittorio Rigamonti >> >>>>>>> >> >>>>>>> Senior Software Engineer >> >>>>>>> >> >>>>>>> Red Hat >> >>>>>>> >> >>>>>>> <https://www.redhat.com> >> >>>>>>> >> >>>>>>> Milan, Italy >> >>>>>>> >> >>>>>>> vriga...@redhat.com <mailto:vriga...@redhat.com> >> >>>>>>> >> >>>>>>> irc: rigazilla >> >>>>>>> >> >>>>>>> <https://red.ht/sig> >> >>>>>>> >> >>>>>>> >> >>>>>>> _______________________________________________ >> >>>>>>> infinispan-dev mailing list >> >>>>>>> infinispan-dev@lists.jboss.org >> >>>>>>> <mailto:infinispan-dev@lists.jboss.org> >> >>>>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> >>>>>> >> >>>>>> >> >>>>>> >> >>>>>> -- >> >>>>>> >> >>>>>> Vittorio Rigamonti >> >>>>>> >> >>>>>> Senior Software Engineer >> >>>>>> >> >>>>>> Red Hat >> >>>>>> >> >>>>>> <https://www.redhat.com> >> >>>>>> >> >>>>>> Milan, Italy >> >>>>>> >> >>>>>> vriga...@redhat.com <mailto:vriga...@redhat.com> >> >>>>>> >> >>>>>> irc: rigazilla >> >>>>>> >> >>>>>> <https://red.ht/sig> >> >>>>> _______________________________________________ >> >>>>> infinispan-dev mailing list >> >>>>> infinispan-dev@lists.jboss.org >> >>>>> <mailto:infinispan-dev@lists.jboss.org> >> >>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> >>>>> >> >>>>> >> >>>>> >> >>>>> _______________________________________________ >> >>>>> infinispan-dev mailing list >> >>>>> infinispan-dev@lists.jboss.org >> >>>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> >>>> >> >>>> >> >>>> _______________________________________________ >> >>>> infinispan-dev mailing list >> >>>> infinispan-dev@lists.jboss.org >> >>>> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> >> _______________________________________________ >> >> infinispan-dev mailing list >> >> infinispan-dev@lists.jboss.org >> >> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> >> >> -- >> Radim Vansa <rva...@redhat.com> >> JBoss Performance Team >> >> _______________________________________________ >> infinispan-dev mailing list >> infinispan-dev@lists.jboss.org >> https://lists.jboss.org/mailman/listinfo/infinispan-dev >> > _______________________________________________ > infinispan-dev mailing list > infinispan-dev@lists.jboss.org > https://lists.jboss.org/mailman/listinfo/infinispan-dev
_______________________________________________ infinispan-dev mailing list infinispan-dev@lists.jboss.org https://lists.jboss.org/mailman/listinfo/infinispan-dev