Vladimir, >> We won’t affect existing services
> How exactly will we affect services without special interface? Please see > the benchmarks in previous email. I talk about backward compatibility, not about performance. But it doesn't matter because... see below. My fault. From discussion I realized that services doesn't require interface. But indeed it does require. If I understand correctly, IgniteServices.service() method could return actual interface implementation instead of interface itself. Am I right? If yes then we can add new method IgniteService.serviceLocalProxy(). It will not break backward compatibility and will always return proxy. On Thu, Mar 12, 2020 at 2:25 PM Vladimir Steshin <vlads...@gmail.com> wrote: > > Andrey, hi. > > >> We won’t affect existing services > > How exactly will we affect services without special interface? Please see > the benchmarks in previous email. > > > >>> what if we generate will generate proxy that collects service’s metrics > only if service will implement some special interface? > > > I don’t like idea enabling/disabling metrics involves code change, > compilation. I believe it should be an external option, probably available > at runtime through JMX. > > > >> we can impose additional requirement for services that want use metrics > out of box. … service must have own interface and only invocations of > methods of this interface will be taken into account for metrics collection. > > Why one more interface? To work via proxy, with remote services user > already has to use an interface additionally to Service. If we introduce > proxy for local services too (as suggested earlier), an interface will be > required. Current IgniteService#serviceProxy() already requires interface > even for local service. I don’t think we need one more special interface. > > > >> user always can use own metrics framework. > > > Since we do not significantly affect services user can use both or disable > our by an option. > > > With the discussion before and the benchmark I propose: > > > - Let IgniteService#serviceProxy() give GridServiceProxy for local services > too. It already requires to work via interface. So it’s safe for user code. > > > - Deprecate IgniteService#service() > > > - Make service metrics enabled by default for all services. > > > - Bring system param which disables metrics by default for all services. > > > - Bring parameter/method in MetricsMxBean which allows disabling/enabling > metrics for all services at run time. > > Makes sense? > > чт, 5 мар. 2020 г., 16:48 Andrey Gura <ag...@apache.org>: > > > Hi there, > > > > what if we will generate proxy that collects service's metrics only if > > service will implement some special interface? In such case: > > > > - we won't affect existing services at all. > > - we can impose additional requirement for services that want use > > metrics out of box (i.e. service that implements our special interface > > *must* also have own interface and only invocations of methods of this > > interface will be taken into account for metrics collection). > > - user always can use own metrics framework instead of our (just do > > not implement this new special interface). > > > > About metrics enabling/disabling. At present IGNITE-11927 doesn't > > solve this problem. Just because there is no metrics implementation > > for services :) > > Anyway we should provide a way for configuring service metrics (in > > sense of enabled/disabled) during service deploy. It's easy for cases > > where deploy() methods have ServiceConfiguration as parameter. But > > there are "short cut" methods like deployXxxSingleton(). I have ideas > > how to solve this problem. For example we can introduce "short cut" > > factory methods like nodeSingletonConfiguration(String name, Service > > service) and clusterSingletonConfiguration(String name, Service > > service). This methods will return configuration which has parameters > > for given type of deployment and could be modified, e.g. metrics could > > be enabled. > > > > WDYT? > > > > On Wed, Mar 4, 2020 at 8:42 PM Vladimir Steshin <vlads...@gmail.com> > > wrote: > > > > > > Vyacheslav, Denis, hi again. > > > > > > > > > > > > >>> I agree with the proposal to introduce a new method which returns > > proxy > > > include the case of locally deployed services. > > > > > > > > > > > > I see one is restricted to use an interface for service with > > > IgniteServiceProcessor#serviceProxy(…): > > > > > > > > > > > > A.ensure(svcItf.isInterface(), "Service class must be an interface: " + > > > svcItf); > > > > > > > > > > > > What if we change IgniteService#serviceProxy(...) so that it will return > > > proxy everytime? That looks safe for user code. Doing so we might only > > > deprecate IgniteService#service(...). > > > > > > > > > > > > вт, 3 мар. 2020 г., 11:03 Vyacheslav Daradur <daradu...@gmail.com>: > > > > > > > Denis, finally I understood your arguments about interfaces check, > > thank > > > > you for the explanation. > > > > > > > > I agree with the proposal to introduce a new method which returns proxy > > > > include the case of locally deployed services. > > > > > > > > Also, such a method should be able to work in mode "local services > > > > preferred", perhaps with load-balancing (in case of multiple locally > > > > deployed instances). This allows our end-users to reach better > > performance. > > > > > > > > > > > > > > > > On Mon, Mar 2, 2020 at 7:51 PM Denis Mekhanikov <dmekhani...@gmail.com > > > > > > > wrote: > > > > > > > > > Vyacheslav, > > > > > > > > > > You can't make service interfaces extend > > > > > *org.apache.ignite.services.Service*. Currently it works perfectly if > > > > > *org.apache.ignite.services.Service* and a user-defined interface are > > > > > independent. This is actually the case in our current examples: > > > > > > > > > > > > > > > > https://github.com/apache/ignite/blob/master/examples/src/main/java/org/apache/ignite/examples/servicegrid/SimpleMapService.java > > > > > I mentioned the *Serializable* interface just as an example of an > > > > interface > > > > > that can be present, but it's not the one that is going to be called > > by a > > > > > user. > > > > > > > > > > What I'm trying to say is that there is no way to say whether the > > service > > > > > is going to be used through a proxy only, or usage of a local > > instance is > > > > > also possible. > > > > > > > > > > Vladimir, > > > > > > > > > > I don't like the idea, that enabling or disabling of metrics will > > change > > > > > the behaviour of the component you collect the metrics for. Such > > > > behaviour > > > > > is far from obvious. > > > > > > > > > > Nikolay, > > > > > > > > > > I agree, that such approach is valid and makes total sense. But > > making > > > > the > > > > > *IgniteServices#serviceProxy()* method always return a proxy instead > > of a > > > > > local instance will change the public contract. The javadoc currently > > > > says > > > > > the following: > > > > > > > > > > > If service is available locally, then local instance is returned, > > > > > > otherwise, a remote proxy is dynamically created and provided for > > the > > > > > > specified service. > > > > > > > > > > > > > > > I propose introducing a new method that will always return a service > > > > proxy > > > > > regardless of local availability, and deprecating *serviceProxy()* > > and > > > > > *service() > > > > > *methods. What do you think? > > > > > > > > > > Denis > > > > > > > > > > пн, 2 мар. 2020 г. в 16:08, Nikolay Izhikov <nizhi...@apache.org>: > > > > > > > > > > > Hello, Vladimir. > > > > > > > > > > > > > What if we just provide an option to disable service metrics at > > all? > > > > > > > > > > > > I don't think we should create an explicit property for service > > > > metrics. > > > > > > We will implement the way to disable any metrics in the scope of > > > > > > IGNITE-11927 [1]. > > > > > > > > > > > > > Usage of a proxy instead of service instances can lead to > > performance > > > > > > > degradation for local instances, which is another argument > > against > > > > such > > > > > > change. > > > > > > > > > > > > As far as I know, many and many modern frameworks use a proxy > > approach. > > > > > > Just to name one - Spring framework works with the proxy. > > > > > > > > > > > > We should measure the impact on the performance that brings > > > > proxy+metric > > > > > > and after it make the decision on local service metrics > > implementation. > > > > > > Vladimir, can you, as a contributor of this task make this > > measurement? > > > > > > > > > > > > [1] https://issues.apache.org/jira/browse/IGNITE-11927 > > > > > > > > > > > > пн, 2 мар. 2020 г. в 12:56, Vladimir Steshin <vlads...@gmail.com>: > > > > > > > > > > > > > Denis, Vyacheslav, hi. > > > > > > > > > > > > > > What if we just provide an option to disable service metrics at > > all? > > > > It > > > > > > > would keep direct references for local services. Also, we can > > make > > > > > > service > > > > > > > metrics disabled by default to keep current code working. A > > warning > > > > of > > > > > > > local service issues will be set with the option. > > > > > > > > > > > > > > пн, 2 мар. 2020 г. в 11:26, Vyacheslav Daradur < > > daradu...@gmail.com > > > > >: > > > > > > > > > > > > > > > >> Moreover, I don't see a way of implementing such a check. > > Are > > > > you > > > > > > > going > > > > > > > > to look just for any interface? What about Serializable? Will > > it > > > > do? > > > > > > > > > > > > > > > > The check should look for the interface which implements > > > > > > > > "org.apache.ignite.services.Service", it covers the > > requirement to > > > > be > > > > > > > > Serializable. > > > > > > > > > > > > > > > > >> For now though the best thing we can do is to calculate > > remote > > > > > > > > invocations only, since all of them go through a proxy. > > > > > > > > > > > > > > > > Let's introduce a system property to manage local services > > > > > monitoring: > > > > > > > > - local services monitoring will be disabled by default - to > > avoid > > > > > any > > > > > > > > backward compatibility issues; > > > > > > > > - local services monitoring can be enabled runtime with a known > > > > > > > limitation > > > > > > > > for new services for example; > > > > > > > > Moreover, if we introduce such a feature flag to > > > > > ServiceConfiguration - > > > > > > > > the new feature can be enabled per service separately. > > > > > > > > > > > > > > > > What do you think? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > On Mon, Mar 2, 2020 at 12:33 AM Denis Mekhanikov < > > > > > > dmekhani...@gmail.com> > > > > > > > > wrote: > > > > > > > > > > > > > > > >> Vladimir, Slava, > > > > > > > >> > > > > > > > >> In general, I like the idea of abstracting the service > > deployment > > > > > from > > > > > > > >> its usage, but there are some backward-compatibility > > > > considerations > > > > > > that > > > > > > > >> won't let us do so. > > > > > > > >> > > > > > > > >> Or we can declare usage of services without interfaces > > incorrect > > > > > > > >> > > > > > > > >> > > > > > > > >> I don't think we can introduce a requirement for all services > > to > > > > > have > > > > > > an > > > > > > > >> interface, unfortunately. Such change can potentially break > > > > existing > > > > > > > code, > > > > > > > >> since such requirement doesn't exist currently. > > > > > > > >> Moreover, I don't see a way of implementing such a check. Are > > you > > > > > > going > > > > > > > >> to look just for any interface? What about Serializable? Will > > it > > > > do? > > > > > > > >> > > > > > > > >> Usage of a proxy instead of service instances can lead to > > > > > performance > > > > > > > >> degradation for local instances, which is another argument > > against > > > > > > such > > > > > > > >> change. > > > > > > > >> > > > > > > > >> I think, it will make sense to make all service invocations > > work > > > > > > through > > > > > > > >> a proxy in Ignite 3. > > > > > > > >> For now though the best thing we can do is to calculate remote > > > > > > > >> invocations only, since all of them go through a proxy. > > > > > > > >> Another option is to provide a simple way for a user to > > account > > > > the > > > > > > > >> service invocations themselves. > > > > > > > >> > > > > > > > >> What do you guys think? > > > > > > > >> > > > > > > > >> Denis > > > > > > > >> > > > > > > > >> > > > > > > > >> вт, 25 февр. 2020 г. в 16:50, Vyacheslav Daradur < > > > > > daradu...@gmail.com > > > > > > >: > > > > > > > >> > > > > > > > >>> It is not a change of public API from my point of view. > > > > > > > >>> > > > > > > > >>> Also, there is a check to allow getting proxy only for an > > > > > interface, > > > > > > > not > > > > > > > >>> implementation. > > > > > > > >>> > > > > > > > >>> Denis, what do you think? > > > > > > > >>> > > > > > > > >>> > > > > > > > >>> вт, 25 февр. 2020 г. в 16:28, Vladimir Steshin < > > > > vlads...@gmail.com > > > > > >: > > > > > > > >>> > > > > > > > >>>> Vyacheslav, this is exactly what I found. I'm doing [1] > > (metrics > > > > > for > > > > > > > >>>> services) and realized I have to wrap local calls by a > > proxy. Is > > > > > it > > > > > > a > > > > > > > >>>> change of public API and should come with major release > > only? Or > > > > > we > > > > > > > can > > > > > > > >>>> declare usage of services without interfaces incorrect? > > > > > > > >>>> [1] https://issues.apache.org/jira/browse/IGNITE-12464 > > > > > > > >>>> > > > > > > > >>>> вт, 25 февр. 2020 г. в 16:17, Vyacheslav Daradur < > > > > > > daradu...@gmail.com > > > > > > > >: > > > > > > > >>>> > > > > > > > >>>>> {IgniteServices#service(String name)} returns direct > > reference > > > > in > > > > > > the > > > > > > > >>>>> current implementation. > > > > > > > >>>>> > > > > > > > >>>>> So, class casting should work for your example: > > > > > > > >>>>> > > ((MyServiceImpl)ignite.services().service(“myService”)).bar(); > > > > > > > >>>>> > > > > > > > >>>>> It is safer to use an interface instead of an > > implementation, > > > > > there > > > > > > > is > > > > > > > >>>>> no guarantee that in future releases direct link will be > > > > > returned, > > > > > > a > > > > > > > >>>>> service instance might be wrapped for monitoring for > > example. > > > > > > > >>>>> > > > > > > > >>>>> > > > > > > > >>>>> On Tue, Feb 25, 2020 at 4:09 PM Vladimir Steshin < > > > > > > vlads...@gmail.com > > > > > > > > > > > > > > > >>>>> wrote: > > > > > > > >>>>> > > > > > > > >>>>>> Vyacheslav, Hi. > > > > > > > >>>>>> > > > > > > > >>>>>> I see. But can we consider 'locally deployed service' is a > > > > proxy > > > > > > > too, > > > > > > > >>>>>> not direct reference? What if I need to wrap it? This > > would be > > > > > > local > > > > > > > >>>>>> service working via proxy or null. > > > > > > > >>>>>> > > > > > > > >>>>>> вт, 25 февр. 2020 г. в 16:03, Vyacheslav Daradur < > > > > > > > daradu...@gmail.com > > > > > > > >>>>>> >: > > > > > > > >>>>>> > > > > > > > >>>>>>> Hi, Vladimir > > > > > > > >>>>>>> > > > > > > > >>>>>>> The answer is in API docs: "Gets *locally deployed > > service* > > > > > with > > > > > > > >>>>>>> specified name." [1] > > > > > > > >>>>>>> > > > > > > > >>>>>>> That means {IgniteServices#service(String name)} returns > > only > > > > > > > >>>>>>> locally deployed instance or null. > > > > > > > >>>>>>> > > > > > > > >>>>>>> {IgniteServices#serviceProxy(…)} returns proxy to call > > > > > instances > > > > > > > >>>>>>> across the cluster. Might be used for load-balancing. > > > > > > > >>>>>>> > > > > > > > >>>>>>> [1] > > > > > > > >>>>>>> > > > > > > > > > > > > > > > > > > > > > > > > https://github.com/apache/ignite/blob/56975c266e7019f307bb9da42333a6db4e47365e/modules/core/src/main/java/org/apache/ignite/IgniteServices.java#L569 > > > > > > > >>>>>>> > > > > > > > >>>>>>> On Tue, Feb 25, 2020 at 3:51 PM Vladimir Steshin < > > > > > > > vlads...@gmail.com> > > > > > > > >>>>>>> wrote: > > > > > > > >>>>>>> > > > > > > > >>>>>>>> Hello, Igniters. > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> Previous e-mail was with wrong topic ' > > daradu...@gmail.com' > > > > :) > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> I got a question what exactly > > IgniteServices#service(String > > > > > > name) > > > > > > > >>>>>>>> is supposed to return: reference to the object or a > > proxy > > > > for > > > > > > > some reason > > > > > > > >>>>>>>> like IgniteServices#serviceProxy(…)? Vyacheslav D., can > > you > > > > > tell > > > > > > > me your > > > > > > > >>>>>>>> opinion? > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> public interface MyService { > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> public void foo(); > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> } > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> public class MyServiceImpl implements Service, > > MyService { > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> @Override public void foo(){ … } > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> public void bar(){ … }; > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> } > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> // Is it required to support > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> MyServiceImpl srvc = > > ignite.services().service(“myService”); > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> srvc.foo(); > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> srvc.bar(); > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> // Or is the only correct way: > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> MyService srvc = ignite.services().service(“myService”); > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> srvc.foo(); > > > > > > > >>>>>>>> > > > > > > > >>>>>>>> > > > > > > > >>>>>>> > > > > > > > >>>>>>> -- > > > > > > > >>>>>>> Best Regards, Vyacheslav D. > > > > > > > >>>>>>> > > > > > > > >>>>>> > > > > > > > >>>>> > > > > > > > >>>>> -- > > > > > > > >>>>> Best Regards, Vyacheslav D. > > > > > > > >>>>> > > > > > > > >>>> -- > > > > > > > >>> Best Regards, Vyacheslav D. > > > > > > > >>> > > > > > > > >> > > > > > > > > > > > > > > > > -- > > > > > > > > Best Regards, Vyacheslav D. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > > > > Best Regards, Vyacheslav D. > > > > > >