> 1. Add init/execute/cancel methods without parameters. > 2. Add default no-op implementations for the new methods (this is required > to preserve compatibility). > 3. For old methods that take ServiceContext as a parameter, add default > implementations that delegate to new methods. > 4. Deprecate the old methods on the API. > 5. On the implementation level, still use the old methods (again - for > compatibility). > 6. Finally, add a @ServiceContextResource annotation to inject > ServiceContext.
I like this idea and I have filed a ticket for this change [1]. If there is no objection, I plan to implement this shortly. [1] https://issues.apache.org/jira/browse/IGNITE-15801 ср, 20 окт. 2021 г. в 08:54, Nikolay Izhikov <nizhi...@apache.org>: > > > and it fully switches to annotation-based injection. > > +1 to do it. > > > 19 окт. 2021 г., в 22:14, Valentin Kulichenko > > <valentin.kuliche...@gmail.com> написал(а): > > > > That's actually a good point. In Java, we can do the following: > > 1. Add init/execute/cancel methods without parameters. > > 2. Add default no-op implementations for the new methods (this is required > > to preserve compatibility). > > 3. For old methods that take ServiceContext as a parameter, add default > > implementations that delegate to new methods. > > 4. Deprecate the old methods on the API. > > 5. On the implementation level, still use the old methods (again - for > > compatibility). > > 6. Finally, add a @ServiceContextResource annotation to inject > > ServiceContext. > > > > If I haven't missed anything, this is not a breaking change, and it fully > > switches to annotation-based injection. > > > > I'm not sure this is possible in .NET though. > > > > -Val > > > > On Tue, Oct 19, 2021 at 11:47 AM Pavel Pereslegin <xxt...@gmail.com> wrote: > > > >>> Removing parameters from a public interface method is a breaking change, > >>> or do you mean something else? > >> > >> Sorry, I meant that we can inject the service context, but leave it > >> available in the init/execute/cancel methods and add a default "no-op" > >> implementation in the interface for them. Can we do this? > >> > >>> Regarding .NET - let's have a separate ticket for that? > >> If we decide to "inject" a service context - this should be done in a > >> separate ticket. > >> If you are talking about "proxy service context" - I can split it into > >> 3 parts (java, Net, and thin clients) > >> > >> вт, 19 окт. 2021 г. в 21:23, Pavel Tupitsyn <ptupit...@apache.org>: > >>> > >>> Pavel, > >>> > >>>> From my point of view, this should not break anything > >>> Removing parameters from a public interface method is a breaking change, > >>> or do you mean something else? > >>> > >>> Regarding .NET - let's have a separate ticket for that? > >>> We can discuss and implement Java changes first. > >>> > >>> On Tue, Oct 19, 2021 at 8:27 PM Pavel Pereslegin <xxt...@gmail.com> > >> wrote: > >>> > >>>> Thanks a lot for your suggestions. > >>>> > >>>>> We might consider injecting the ServiceContext instead of passing it > >> to > >>>>> IgniteService methods, but I believe this will be a breaking change? > >>>> > >>>> From my point of view, this should not break anything. We can inject a > >>>> service context when initializing a service and keep it accessible in > >>>> state transition methods (init/execute/cancel). > >>>> Currently, in .Net ServiceContext doesn't share the same instance, but > >>>> this can be reworked - for example, we can store the service context > >>>> (with a reference to the service) in the resource registry instead of > >>>> the service itself. > >>>> > >>>> But I don't see much usability improvement with such a feature if the > >>>> user still needs to implement state transition methods. I think it > >>>> would be nice to add default "no-op" implementations for them. > >>>> Unfortunately, we are currently unable to do the same in .Net because > >>>> such a feature is not supported in C# 4.0 (it's available in C# 8.0). > >>>> > >>>> Can we add default "no-op" implementations for init/execute/cancel > >>>> methods in Java and leave them unchanged in .Net? > >>>> > >>>> вт, 19 окт. 2021 г. в 18:51, Valentin Kulichenko > >>>> <valentin.kuliche...@gmail.com>: > >>>>> > >>>>> I support #2, because we already have the ServiceContext. Having > >>>>> both ServiceContext and @ServiceRequestContextResource that injects > >> some > >>>>> function (or any other mechanism for that matter) will be VERY > >> confusing. > >>>>> Let's keep it simple. > >>>>> > >>>>> At the same time, I do agree with Nikolay that injection is the > >> approach > >>>>> taken across the platform, so I'm not sure why we are not using it > >> here. > >>>> We > >>>>> might consider injecting the ServiceContext instead of passing it to > >>>>> IgniteService methods, but I believe this will be a breaking change? > >>>>> > >>>>> -Val > >>>>> > >>>>> On Tue, Oct 19, 2021 at 4:49 AM Ivan Daschinsky <ivanda...@gmail.com > >>> > >>>> wrote: > >>>>> > >>>>>> I am for limiting types of attributes values only to UTF-8 strings > >> and > >>>>>> bytearrays. > >>>>>> Also, I agree with Pavel, (2) is clear and without any reflection. > >>>>>> > >>>>>> вт, 19 окт. 2021 г. в 14:18, Nikolay Izhikov <nizhi...@apache.org > >>> : > >>>>>> > >>>>>>> I like (1) options. > >>>>>>> > >>>>>>> @ServiceRequestContextResource > >>>>>>> private Function<String, Object> ctxFunc; > >>>>>>> > >>>>>>> Because, we use this style of API for injection of other > >> resources - > >>>>>>> logger, ignite instance, etc. > >>>>>>> It may be confusing for the user to use several API styles for > >>>> solving > >>>>>>> similar tasks. > >>>>>>> > >>>>>>> > >>>>>>>> 19 окт. 2021 г., в 11:04, Pavel Tupitsyn <ptupit...@apache.org > >>> > >>>>>>> написал(а): > >>>>>>>> > >>>>>>>> (2) seems to be the cleanest and most discoverable to me, > >>>>>>>> also simpler to implement (no reflection necessary). > >>>>>>>> > >>>>>>>> But existing ServiceContext properties are for the entire > >>>> instance, not > >>>>>>> for > >>>>>>>> the current call. > >>>>>>>> So, to make it clear and obvious, let's do > >>>>>>>> ServiceContext.currentCallContext().attribute(...). > >>>>>>>> > >>>>>>>> On Mon, Oct 18, 2021 at 7:20 PM Pavel Pereslegin < > >> xxt...@gmail.com > >>>>> > >>>>>>> wrote: > >>>>>>>> > >>>>>>>>> Folks, > >>>>>>>>> > >>>>>>>>> I agree with Ivan that we can improve the user experience in > >>>> Ignite > >>>>>>>>> services by adding support for "middleware". > >>>>>>>>> And as a first step, we need to pass the "caller context" to > >> the > >>>>>>> service. > >>>>>>>>> > >>>>>>>>> I see the following API options for reading this "context" > >> inside > >>>> a > >>>>>>>>> service: > >>>>>>>>> (please see "API proposal" section in Jira [1] for full > >> formatted > >>>>>>> examples) > >>>>>>>>> > >>>>>>>>> 1. Using a custom annotation (ServiceRequestContextResource) > >> and > >>>>>>>>> reading context attributes with a function. > >>>>>>>>> > >>>>>>>>> @ServiceRequestContextResource > >>>>>>>>> private Function<String, Object> ctxFunc; > >>>>>>>>> > >>>>>>>>> public void serviceMethod() { > >>>>>>>>> String login = (String)ctxFunc.apply("login"); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> 2. Using a new method of the existing ServiceContext. > >>>>>>>>> > >>>>>>>>> private ServiceContext svcCtx; > >>>>>>>>> > >>>>>>>>> public void init(ServiceContext svcCtx) { > >>>>>>>>> this.svcCtx = svcCtx; > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> public void serviceMethod() { > >>>>>>>>> String login = svcCtx.attribute("login"); > >>>>>>>>> // and/or > >>>>>>>>> String login = > >> (String)svcCtx.attributes().get("login"); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> The next two options require wrapping Map<String, Object> > >> into a > >>>> new > >>>>>>>>> ServiceRequestContext class. > >>>>>>>>> > >>>>>>>>> 3. Read context "wrapper" using special annotation and > >> supplier. > >>>>>>>>> > >>>>>>>>> @ServiceRequestContextResource > >>>>>>>>> private Supplier<ServiceRequestContext> ctxSupplier; > >>>>>>>>> > >>>>>>>>> public void serviceMethod() { > >>>>>>>>> String login = ctxSupplier.get().attribute("login"); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> 4. Using the special static method of the "wrapper" class. > >>>>>>>>> > >>>>>>>>> public void serviceMethod() { > >>>>>>>>> String login = > >>>>>>> ServiceRequestContext.current().attribute("login"); > >>>>>>>>> } > >>>>>>>>> > >>>>>>>>> Let's discuss which one is the way to go. > >>>>>>>>> > >>>>>>>>> [1] https://issues.apache.org/jira/browse/IGNITE-15572 > >>>>>>>>> > >>>>>>>>> вт, 12 окт. 2021 г. в 13:51, Ivan Daschinsky < > >> ivanda...@gmail.com > >>>>> : > >>>>>>>>>> > >>>>>>>>>> Hi, Val > >>>>>>>>>> > >>>>>>>>>>>> The examples you mentioned are more related to internal > >>>> activities > >>>>>>>>> (e.g., > >>>>>>>>>>>> if authentication is handled by an Ignite server node, it > >> can > >>>>>> create > >>>>>>>>> its > >>>>>>>>>>>> internal context for a connection - this is certainly > >>>> reasonable). > >>>>>>> I'm > >>>>>>>>>> only > >>>>>>>>>>>> worried about exposing this to the end user. > >>>>>>>>>> > >>>>>>>>>> I'm talking about not Ignite auth, but external auth. Here I > >> am > >>>>>>>>> considering > >>>>>>>>>> Ignite Service Grid as a microservice platform. > >>>>>>>>>> Authentication microservice can be not related to Ignite at > >> all, > >>>> but > >>>>>>>>> author > >>>>>>>>>> of service may want to retrieve or authenticate user by > >> user_id, > >>>> that > >>>>>>> is > >>>>>>>>>> provided in request headers or context in jwt token, for > >> example. > >>>>>>>>>> > >>>>>>>>>> The same is for tracing or metrics. Ignite internal > >> mechanisms > >>>> here > >>>>>>>>> cannot > >>>>>>>>>> help at all, because there is no context related to user's > >> code. > >>>>>>>>>> > >>>>>>>>>> If we want to leave Ignite Service Grid as dump as possible, > >> it > >>>> is > >>>>>> ok. > >>>>>>>>> But > >>>>>>>>>> therefore it cannot compete with more functional variants. > >>>>>>>>>> > >>>>>>>>>> But just adding request headers at first step and custom > >>>> interceptors > >>>>>>>>>> (client and server side) we can give to user's of Ignite > >> Service > >>>>>> Grid > >>>>>>> a > >>>>>>>>>> lot of opportunities. > >>>>>>>>>> > >>>>>>>>>> There is an example of golang grpc middlewares -- see how > >> many > >>>>>>>>> interesting > >>>>>>>>>> use cases here: > >>>>>>>>>> https://github.com/grpc-ecosystem/go-grpc-middleware > >>>>>>>>>> > >>>>>>>>>> вт, 12 окт. 2021 г. в 07:31, Valentin Kulichenko < > >>>>>>>>>> valentin.kuliche...@gmail.com>: > >>>>>>>>>> > >>>>>>>>>>> Ivan, > >>>>>>>>>>> > >>>>>>>>>>> I'm a bit confused :) Unless I misread the initial > >> suggestion, > >>>> the > >>>>>>>>> idea is > >>>>>>>>>>> to provide a public API to create the context. In other > >> words, > >>>> it > >>>>>> will > >>>>>>>>> be > >>>>>>>>>>> up to the end user to create this context properly, which > >>>> affects > >>>>>> the > >>>>>>>>>>> business code - and that's exactly where I see an issue. > >>>>>>>>>>> > >>>>>>>>>>> The examples you mentioned are more related to internal > >>>> activities > >>>>>>>>> (e.g., > >>>>>>>>>>> if authentication is handled by an Ignite server node, it > >> can > >>>> create > >>>>>>>>> its > >>>>>>>>>>> internal context for a connection - this is certainly > >>>> reasonable). > >>>>>> I'm > >>>>>>>>> only > >>>>>>>>>>> worried about exposing this to the end user. > >>>>>>>>>>> > >>>>>>>>>>> Maybe you can pick one of the use cases that you think would > >>>> benefit > >>>>>>>>> from > >>>>>>>>>>> this feature the most, and provide a little more detail? How > >>>> would > >>>>>> you > >>>>>>>>> like > >>>>>>>>>>> to see the use case to be addressed and what is currently > >>>> missing? > >>>>>>>>>>> > >>>>>>>>>>> Also, just to be clear: I'm not necessarily against the > >>>> suggestion, > >>>>>>> and > >>>>>>>>>>> it's highly unlikely that I will want to veto it if you or > >>>> someone > >>>>>>> else > >>>>>>>>>>> will decide to implement it. Just expressing my concerns. > >>>>>>>>>>> > >>>>>>>>>>> -Val > >>>>>>>>>>> > >>>>>>>>>>> On Sun, Oct 10, 2021 at 11:52 PM Nikolay Izhikov < > >>>>>> nizhi...@apache.org > >>>>>>>> > >>>>>>>>>>> wrote: > >>>>>>>>>>> > >>>>>>>>>>>> +1 to have service proxy context. > >>>>>>>>>>>> > >>>>>>>>>>>>> 11 окт. 2021 г., в 09:43, Ivan Daschinsky < > >>>> ivanda...@gmail.com> > >>>>>>>>>>>> написал(а): > >>>>>>>>>>>>> > >>>>>>>>>>>>> Val, Pavel both of you are right, but on the other hand > >> there > >>>> are > >>>>>>>>> some > >>>>>>>>>>>>> other tasks > >>>>>>>>>>>>> > >>>>>>>>>>>>> 1. Distributed tracing. > >>>>>>>>>>>>> 2. Custom metrics/measurements > >>>>>>>>>>>>> 3. Auth and some related tasks (i.e. ingests full User > >> info by > >>>>>>>>> calling > >>>>>>>>>>>> some > >>>>>>>>>>>>> auth service in middleware). > >>>>>>>>>>>>> > >>>>>>>>>>>>> Do you both think that this is a good idea in business > >> code? > >>>>>>>>>>>>> > >>>>>>>>>>>>> Without this functionality, our service grid cannot > >> compete > >>>> with > >>>>>>>>> grpc > >>>>>>>>>>> and > >>>>>>>>>>>>> others as microservice framework, unfortunately. > >>>>>>>>>>>>> > >>>>>>>>>>>>> But if we introduce limited support for this "request > >>>> headers", it > >>>>>>>>> can > >>>>>>>>>>>>> drastically improves this aspects of our service grid > >>>> framework. > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> пн, 11 окт. 2021 г. в 00:48, Valentin Kulichenko < > >>>>>>>>>>>>> valentin.kuliche...@gmail.com>: > >>>>>>>>>>>>> > >>>>>>>>>>>>>> I agree with Pavel. The suggested approach is indeed > >> utilized > >>>>>>>>> quite > >>>>>>>>>>>>>> frequently, but it's inherently error-prone. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> The main issue is that it creates implicit assumptions > >> about > >>>> the > >>>>>>>>>>>> behavior > >>>>>>>>>>>>>> of both the service and the user's code. For example, if > >> the > >>>>>>>>> user's > >>>>>>>>>>> code > >>>>>>>>>>>>>> must provide a username, what if it doesn't? I assume it > >>>> will get > >>>>>>>>> an > >>>>>>>>>>>> error, > >>>>>>>>>>>>>> which is very counterintuitive. Even more importantly, > >> how > >>>> should > >>>>>>>>> one > >>>>>>>>>>>> learn > >>>>>>>>>>>>>> about this requirement in the first place? It is not > >>>> reflected in > >>>>>>>>> the > >>>>>>>>>>>> API > >>>>>>>>>>>>>> in any way - and that's a big problem. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> The fact that the service implementor needs to update > >> the API > >>>>>>>>> methods > >>>>>>>>>>>> when > >>>>>>>>>>>>>> such requirements are introduced is actually a good > >> thing, > >>>> in my > >>>>>>>>>>>> opinion. > >>>>>>>>>>>>>> This forces the developer to stop and think about how the > >>>> updated > >>>>>>>>> API > >>>>>>>>>>>>>> should look like and how to make sure it's > >>>> backward-compatible > >>>>>> (or > >>>>>>>>>>> not, > >>>>>>>>>>>> in > >>>>>>>>>>>>>> case the new requirements are mandatory). Doing this > >> through > >>>> an > >>>>>>>>>>> external > >>>>>>>>>>>>>> context is basically the equivalent of saying "let the > >> end > >>>> user > >>>>>>>>> deal > >>>>>>>>>>>> with > >>>>>>>>>>>>>> this". Not a good practice, in my view. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> Conversely, passing everything exclusively via method > >>>> arguments > >>>>>>>>>>>> guarantees > >>>>>>>>>>>>>> that: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> - The user's code is always compliant with the service > >>>>>>>>> contract. You > >>>>>>>>>>>>>> can't "forget" to pass something to the service. > >>>>>>>>>>>>>> - Any changes in the service contract > >> (backward-compatible > >>>> or > >>>>>>>>>>>> otherwise) > >>>>>>>>>>>>>> are explicitly reflected in the API. > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> -Val > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> On Sun, Oct 10, 2021 at 6:21 AM Pavel Tupitsyn < > >>>>>>>>> ptupit...@apache.org> > >>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Ivan, > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> Yes, this approach is used by some other systems, and > >>>> still, I > >>>>>>>>> don't > >>>>>>>>>>>> like > >>>>>>>>>>>>>>> it very much. > >>>>>>>>>>>>>>> Let's hear more opinions. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> On Sat, Oct 9, 2021 at 9:00 PM Ivan Daschinsky < > >>>>>>>>> ivanda...@gmail.com> > >>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> Hi. > >>>>>>>>>>>>>>>> Pavel T., Ok, http rest dosn't have the clean design, > >> in > >>>> your > >>>>>>>>>>> opinion. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> But what about grpc? The same? > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> As for me, it is ok to pass additional parameters as > >> list > >>>> of > >>>>>>>>>>> key-value > >>>>>>>>>>>>>>>> pairs with keys as strings and values as bytearrays or > >>>> strings. > >>>>>>>>> It > >>>>>>>>>>> is > >>>>>>>>>>>>>> ok > >>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>> allow user to set up middlewares for services and > >> allow to > >>>>>>>>> enrich > >>>>>>>>>>>>>> request > >>>>>>>>>>>>>>>> context in this middlewares. It is very common approach > >>>>>>>>> everywhere > >>>>>>>>>>> and > >>>>>>>>>>>>>> is > >>>>>>>>>>>>>>>> very useful in distributed systems. The use cases are > >> so > >>>>>>>>> obvious, > >>>>>>>>>>>>>> aren't > >>>>>>>>>>>>>>>> they? > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> сб, 9 окт. 2021 г., 20:14 Pavel Tupitsyn < > >>>> ptupit...@apache.org > >>>>>>>>>> : > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Pavel, > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Thanks for the explanation, I understand the use > >> cases. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> in REST service, he can set such parameters in > >> request > >>>>>> headers > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> I don't consider HTTP-based services as a good > >> example of > >>>> a > >>>>>>>>>>>>>>>>> clean architecture. > >>>>>>>>>>>>>>>>> Data can be passed in URL parameters, in headers, and > >> in > >>>> body, > >>>>>>>>> and > >>>>>>>>>>>>>> each > >>>>>>>>>>>>>>>> of > >>>>>>>>>>>>>>>>> those ways has its own limitations. > >>>>>>>>>>>>>>>>> There is no obvious correct way to do things. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Ambient state is not obvious and the API looks > >> confusing > >>>>>> even > >>>>>>>>>>>>>>> though I > >>>>>>>>>>>>>>>>> understand our services stack quite well both in Java > >> and > >>>> .NET > >>>>>>>>>>>>>>>>>> Can you clarify please? > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> The proposed API adds a "side channel" for the data. > >>>>>>>>>>>>>>>>> Some is passed as arguments, which is obvious, and > >> some > >>>>>> becomes > >>>>>>>>>>>>>>> magically > >>>>>>>>>>>>>>>>> available on the server side through some external > >>>> context. > >>>>>>>>>>>>>>>>> - You have to know about the context > >>>>>>>>>>>>>>>>> - You have to understand that the context is only > >>>> available > >>>>>>>>> during > >>>>>>>>>>>>>> the > >>>>>>>>>>>>>>>>> method call (can't use it in some background logic) > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> In my opinion, this is a bit too clever. I'm a fan of > >> the > >>>>>>>>>>> functional > >>>>>>>>>>>>>>>>> programming approach where everything you need is > >> passed > >>>> as > >>>>>>>>>>>>>> arguments. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> On Fri, Oct 8, 2021 at 4:29 PM Pavel Pereslegin < > >>>>>>>>> xxt...@gmail.com> > >>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Igor, Pavel. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Why can not a user implement such context on > >> application > >>>>>>>>> level? I > >>>>>>>>>>>>>>>>>> believe Ignite provides all necessary tools for that. > >>>>>>>>>>>>>>>>>> The user wants to trace the source of the service > >> call. > >>>> For > >>>>>>>>>>>>>> example, > >>>>>>>>>>>>>>> a > >>>>>>>>>>>>>>>>>> service must log the name of the user who made the > >> calls > >>>> of > >>>>>>>>> the > >>>>>>>>>>>>>>>>>> service. For now, there's no possibility to do that > >>>> without > >>>>>>>>>>>>>> modifying > >>>>>>>>>>>>>>>>>> the service interface and implementation. Moreover, > >> the > >>>> user > >>>>>>>>> must > >>>>>>>>>>>>>>>>>> modify all methods of service to pass this > >> parameter. For > >>>>>>>>> example, > >>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>>>> REST service, he can set such parameters in request > >>>> headers, > >>>>>>>>> why > >>>>>>>>>>> we > >>>>>>>>>>>>>>>>>> can't provide such usability in Ignite. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> This will reduce the performance of all calls > >>>>>>>>>>>>>>>>>> This feature is optional, if the context is not > >> passed - > >>>> then > >>>>>>>>>>>>>> there's > >>>>>>>>>>>>>>>>>> shouldn't be any performance difference. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Ambient state is not obvious and the API looks > >> confusing > >>>>>> even > >>>>>>>>>>>>>>> though > >>>>>>>>>>>>>>>> I > >>>>>>>>>>>>>>>>>> understand our services stack quite well both in > >> Java and > >>>>>> .NET > >>>>>>>>>>>>>>>>>> Can you clarify please? > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> пт, 8 окт. 2021 г. в 15:46, Pavel Tupitsyn < > >>>>>>>>> ptupit...@apache.org > >>>>>>>>>>>> : > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> Agree with Igor. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> I'm not sure this feature is a good fit for Ignite. > >>>>>>>>>>>>>>>>>>> Ignite should not be responsible for such a > >> high-level > >>>>>>>>> concept, > >>>>>>>>>>>>>>> this > >>>>>>>>>>>>>>>>>> should > >>>>>>>>>>>>>>>>>>> be on the application side instead. > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> - As Eduard noted, it is hard to make this type-safe > >>>>>>>>>>>>>>>>>>> - Ambient state is not obvious and the API looks > >>>> confusing > >>>>>>>>> even > >>>>>>>>>>>>>>>> though > >>>>>>>>>>>>>>>>> I > >>>>>>>>>>>>>>>>>>> understand our services stack quite well both in > >> Java > >>>> and > >>>>>>>>> .NET > >>>>>>>>>>>>>>>>>>> - This will reduce the performance of all calls > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>> On Fri, Oct 8, 2021 at 3:44 PM Igor Sapego < > >>>>>>>>> isap...@apache.org> > >>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Hi guys, > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Why can not a user implement such context on > >>>> application > >>>>>>>>> level? > >>>>>>>>>>>>>>>>>>>> I believe Ignite provides all necessary tools for > >> that. > >>>>>> User > >>>>>>>>>>>>>> can > >>>>>>>>>>>>>>>> just > >>>>>>>>>>>>>>>>>>>> implement such a context as user type and pass it > >> to > >>>>>>>>> services > >>>>>>>>>>>>>>> they > >>>>>>>>>>>>>>>>>>>> need. Are the arguments why would Ignite need a > >>>> separate > >>>>>>>>>>>>>> feature > >>>>>>>>>>>>>>>>>>>> for such a use case? > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> Best Regards, > >>>>>>>>>>>>>>>>>>>> Igor > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> On Fri, Oct 8, 2021 at 2:17 PM Eduard Rakhmankulov > >> < > >>>>>>>>>>>>>>>>>> erixon...@gmail.com> > >>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> I am not aware .NET capabilities, but as I can see > >>>> service > >>>>>>>>>>>>>> must > >>>>>>>>>>>>>>>> be > >>>>>>>>>>>>>>>>>>>>> implemented in *java* and even if can't serialize > >>>> other > >>>>>>>>> that > >>>>>>>>>>>>>>> Map > >>>>>>>>>>>>>>>> on > >>>>>>>>>>>>>>>>>> .NET > >>>>>>>>>>>>>>>>>>>>> side, on java side we can wrap this map with > >> provided > >>>>>>>>>>>>>>>> TypedContext > >>>>>>>>>>>>>>>>>>>> (context > >>>>>>>>>>>>>>>>>>>>> should be convertible from map in this case). > >>>>>>>>>>>>>>>>>>>>> That leads to a situation when Java can use > >>>> TypedContext > >>>>>>>>> but > >>>>>>>>>>>>>>>> other > >>>>>>>>>>>>>>>>>>>> clients > >>>>>>>>>>>>>>>>>>>>> can't. I believe that the majority of services > >> users > >>>> are > >>>>>>>>>>>>>> using > >>>>>>>>>>>>>>>> Java > >>>>>>>>>>>>>>>>>> and > >>>>>>>>>>>>>>>>>>>> it > >>>>>>>>>>>>>>>>>>>>> should be taken in accordance. > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> P.S. I think it is possible to send plain objects > >> from > >>>>>> .NET > >>>>>>>>>>>>>>>> context > >>>>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>>>>> cluster. > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> Best regards, Ed > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> On Fri, 8 Oct 2021 at 14:40, Pavel Pereslegin < > >>>>>>>>>>>>>>> xxt...@gmail.com> > >>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Hi, Eduard! > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> Thanks for your feedback. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> The idea sounds very good, but don't forget > >> about the > >>>>>>>>>>>>>>> platform > >>>>>>>>>>>>>>>>>>>> services. > >>>>>>>>>>>>>>>>>>>>>> For example, we may call Java service from .Net > >> and > >>>>>>>>>>>>>>> vice-versa. > >>>>>>>>>>>>>>>>> I'm > >>>>>>>>>>>>>>>>>>>>>> not sure if the context can be implemented as a > >>>> custom > >>>>>>>>>>>>>> class > >>>>>>>>>>>>>>>>>> (instead > >>>>>>>>>>>>>>>>>>>>>> of Map/Dictionary) in this case. > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> пт, 8 окт. 2021 г. в 14:21, Eduard Rakhmankulov < > >>>>>>>>>>>>>>>>>> erixon...@gmail.com>: > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Hi, Pavel > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Is it possible to provide type-safe API for > >>>>>>>>>>>>>>>>> ServiceProxyContext ? > >>>>>>>>>>>>>>>>>>>>>>> I think constructions like int arg1 = > >>>>>>>>>>>>>>> ctx.attribute("arg1"); > >>>>>>>>>>>>>>>>> are > >>>>>>>>>>>>>>>>>>>> error > >>>>>>>>>>>>>>>>>>>>>>> prone. > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Can we make something like this : > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> //Signature with two generic params which allow > >> the > >>>>>>>>>>>>>>> compiler > >>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>> check > >>>>>>>>>>>>>>>>>>>>>>> if the service will be called with the wrong > >> type > >>>>>>>>>>>>>> context. > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> public <T extends ContextedWith<CtxType>, > >> CtxType> T > >>>>>>>>>>>>>>>>>>>>>>> serviceProxyTyped(ClusterGroup prj, String name, > >>>> Class<? > >>>>>>>>>>>>>>>> super > >>>>>>>>>>>>>>>>> T > >>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> srvcCls, CtxType optCtx, boolean sticky, long > >>>> timeout) > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> //new interface which services with scoped > >> context > >>>>>> should > >>>>>>>>>>>>>>>>>> implement > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> public interface ContextedWith<T> { > >>>>>>>>>>>>>>>>>>>>>>> T getCtx(); > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> // implementation can delegate to Map-like > >> context > >>>> or be > >>>>>>>>>>>>>>>> POJO. > >>>>>>>>>>>>>>>>>>>>>>> interface MyServiceContext { > >>>>>>>>>>>>>>>>>>>>>>> int getArg1(); > >>>>>>>>>>>>>>>>>>>>>>> String getUserId(); > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> class MyService implements > >>>>>>>>>>>>>> ContextedWith<MyServiceContext> > >>>>>>>>>>>>>>> { > >>>>>>>>>>>>>>>>>>>>>>> void doThings() { > >>>>>>>>>>>>>>>>>>>>>>> MyServiceContext ctx = getCtx(); > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> System.out.println("ctx.getArg1() = " + > >>>> ctx.getArg1()); > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> @Override public MyServiceContext getCtx() { > >>>>>>>>>>>>>>>>>>>>>>> return ServiceProxyContext.current(); > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> } > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> WDYT? > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> Best regards, Ed. > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>> On Fri, 8 Oct 2021 at 13:26, Pavel Pereslegin < > >>>>>>>>>>>>>>>>> xxt...@gmail.com> > >>>>>>>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> Hello Igniters! > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> I want to implement a feature to support a > >> custom > >>>>>>>>>>>>>>> "caller" > >>>>>>>>>>>>>>>>>> context > >>>>>>>>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>>>>>>>>>> ignite services (see example in ticket > >> description > >>>>>>>>>>>>>> [1]). > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> Sometimes, when using Ignite services, it > >> becomes > >>>>>>>>>>>>>>> necessary > >>>>>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>> pass > >>>>>>>>>>>>>>>>>>>>>>>> custom parameters from the "request source" to > >> the > >>>>>>>>>>>>>>> service. > >>>>>>>>>>>>>>>>>> This is > >>>>>>>>>>>>>>>>>>>>>>>> most commonly used to track the origin of a > >> service > >>>>>>>>>>>>>> call > >>>>>>>>>>>>>>>>> (user > >>>>>>>>>>>>>>>>>> id, > >>>>>>>>>>>>>>>>>>>>>>>> request id, session id eg see this user > >> question > >>>> [2]). > >>>>>>>>>>>>>>>>>>>>>>>> At the moment, the only way to pass such > >>>> parameters to > >>>>>>>>>>>>>> a > >>>>>>>>>>>>>>>>>> service is > >>>>>>>>>>>>>>>>>>>>> by > >>>>>>>>>>>>>>>>>>>>>>>> adding argument(s) to all called methods of the > >>>>>>>>>>>>>> service, > >>>>>>>>>>>>>>>>> which > >>>>>>>>>>>>>>>>>>>> makes > >>>>>>>>>>>>>>>>>>>>>>>> the code messy and also complicates > >> development and > >>>>>>>>>>>>>>>>>> maintenance. > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> I propose letting the user set a custom context > >>>> for the > >>>>>>>>>>>>>>>>> service > >>>>>>>>>>>>>>>>>>>> proxy > >>>>>>>>>>>>>>>>>>>>>>>> and implicitly pass that context to the methods > >>>> being > >>>>>>>>>>>>>>>> called. > >>>>>>>>>>>>>>>>>> This > >>>>>>>>>>>>>>>>>>>>>>>> function should not affect the execution of > >> service > >>>>>>>>>>>>>>> methods > >>>>>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>>>> any > >>>>>>>>>>>>>>>>>>>>> way > >>>>>>>>>>>>>>>>>>>>>>>> unless the user has specified a context. > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> An example of using the proposed API [1]. > >>>>>>>>>>>>>>>>>>>>>>>> PoC (except thin clients) [3]. > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> WDYT? > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>>>> [1] > >>>> https://issues.apache.org/jira/browse/IGNITE-15572 > >>>>>>>>>>>>>>>>>>>>>>>> [2] > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>> > >>>>>>> > >>>>>> > >>>> > >> https://stackoverflow.com/questions/57459071/apache-ignite-service-grid-service-call-context > >>>>>>>>>>>>>>>>>>>>>>>> [3] https://github.com/apache/ignite/pull/9440 > >>>>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> -- > >>>>>>>>>>>>> Sincerely yours, Ivan Daschinskiy > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> > >>>>>>>>>> -- > >>>>>>>>>> Sincerely yours, Ivan Daschinskiy > >>>>>>>>> > >>>>>>> > >>>>>>> > >>>>>> > >>>>>> -- > >>>>>> Sincerely yours, Ivan Daschinskiy > >>>>>> > >>>> > >> >