Vladimir,

> Why not using IgniteServices.serviceProxy() for that? Since it requires an 
> interface, It could return proxy for local service too and
> keep backward compatibility at the same time.

Is it possible to return actual class instance instead of interface
from serviceProxy() method? E.g. could I get ServiceImpl as result of
method call instead of ServiceItf?

On Tue, Mar 17, 2020 at 9:50 AM Vladimir Steshin <vlads...@gmail.com> wrote:
>
> Andrey,
>
> >>> IgniteServices.service() method could return actual interface 
> >>> implementation instead of interface itself.
>
>
> IgniteServices.service() always return actual local service instance, no 
> proxy, might be without any interface but except Service.
>
> >>> If yes then we can add new method IgniteService.serviceLocalProxy().
> >>> It will not break backward compatibility and will always return proxy.
>
> Why not using IgniteServices.serviceProxy() for that? Since it requires an 
> interface, It could return proxy for local service too and
> keep backward compatibility at the same time.
>
> 16.03.2020 20:21, Andrey Gura пишет:
> > 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.
> >>>>>

Reply via email to