Pavel, I've moved proposals from this thread to the IEP [1] and described changes to protocol, please have a look.
[1] : https://cwiki.apache.org/confluence/display/IGNITE/IEP-46%3A+Thin+Client+Service+Invocation пн, 18 мая 2020 г. в 15:09, Pavel Tupitsyn <ptupit...@apache.org>: > Hi Alex, > > Thanks for starting this thread. > I've created the IEP some time ago but then got distracted by other things. > > My thoughts: > > *1. Create service proxy on each invoke request* > Single client operation is a lot simpler to implement on both sides (client > and server), so I would prefer this way. > The only concern here is performance. My plan was to benchmark and then > decide. > > *2. Method resolution* > Taking Python and other dynamically typed languages into account, > current PlatformService implementation seems to be the best fit. > > If we decide to add an optional signature, we should not make it > Java-specific: > use binary type IDs (that are already part of the protocol) to specify > parameter types. > > > On Mon, May 18, 2020 at 2:27 PM Alex Plehanov <plehanov.a...@gmail.com> > wrote: > > > Hello Igniters, > > > > I have plans to implement service invocation in thin clients. I've > already > > implemented a PoC for java thin client and want to discuss some details. > > Also, Pavel Tupitsin has created IEP [1] and the ticket for .Net thin > > client [2]. > > > > To invoke the service method by java thick client we can get service > proxy > > by: > > IgniteServices.serviceProxy(String name, Class<? super T> svcItf, boolean > > sticky, long timeout) > > and then invoke the method on this proxy. > > > > Also, we already have service invocation functionality for .Net thick > > client (see PlatformServices class). For .Net thick client there are two > > types of operation related to service invocation: create a proxy and > invoke > > a method (this approach is identical to java thick client). > > > > But I think we can't use two operations for thin clients. If we create a > > proxy by a separate operation we should store this resource somewhere on > > server-side and we should also have an ability to close this resource > when > > it's not needed anymore. So there is an additional operation on > client-side > > needed to close the proxy explicitly. This is more complex from users > point > > of view than the current approach for java thick client, so I think it's > > better to use only one operation for thin clients: OP_SERVICE_INVOKE and > > create a service proxy on each method invocation. In this case, each > > request should have at least these parameters: service name, interface > > name, timeout, nodes set, method name, and args (sticky flag is useless > > since we always will create a new proxy for each request). > > > > There is one more problem: methods of some interface can be overloaded. > In > > .Net thick client implementation there is a method used to find an > > appropriate service method to invoke by method name and args values: > > PlatformServices.ServiceProxyHolder#getMethod. Since we use here only > args > > values (don't have full information about args types) sometimes we can > get > > an error for overloaded methods. For example, if you have an interface > > like: > > > > public interface TestServiceInterface { > > public String testMethod(String val); > > public String testMethod(Object val); > > } > > > > And invoke service like: > > > > Object arg = null; > > svc.testMethod(arg); > > > > Java will resolve the correct method to call on client-side, but using > only > > arg value (null) it's impossible to get exactly one method on the > > server-side (PlatformServices.ServiceProxyHolder#getMethod will throw an > > error in this case: Ambiguous proxy method 'testMethod') > > > > To solve this problem we can pass full method signature (method name with > > parameters types) instead of just method name. Or we can additionally > pass > > argument types to find exactly one method by Class.getMethod(String name, > > Class<?>... parameterTypes). Also, we can support two approaches at the > > same time: just the method name to simplify the implementation of > non-java > > thin clients, and full method signature to deal with overloaded methods. > > > > So, > > What do you think about single operation for service invocation (create > > service proxy on each invoke request)? > > What do you think about ways to resolve the method? > > > > [1] : > > > > > https://cwiki.apache.org/confluence/display/IGNITE/IEP-46%3A+Thin+Client+Service+Invocation > > [2] : https://issues.apache.org/jira/browse/IGNITE-12754 > > >