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. > > >