Pavel, > Can you clarify please, is it going to be a new interface, let's say > IgniteServicesSomething, and "IgniteServices extends IgniteServicesSomething"?
Yes, that's what I meant (if we go this way). пн, 20 дек. 2021 г. в 15:32, Pavel Tupitsyn <ptupit...@apache.org>: > > Alex, > > > the count of methods will increase in geometric progression > > I would say it is linear, not geometric. > Anyway, a common fix for "too many parameters" issue is Parameter Object > pattern [1], > I suggest introducing "ServiceProxyConfiguration" class. > > > > We already using such an approach in transactions for example, where we > > have withLabel, withTracing modifier > > I'm not sure this is a good approach and I'd like to avoid using it in more > places. > - it looks like a builder pattern, but it is not > - there is no "withoutTracing" so I can't go back > - when I get "IgniteTransactions" instance in some method, I don't know if > tracing is enabled or not, there is no way to check, no way to disable > > > > I'm voting for option (3). > > Can you clarify please, is it going to be a new interface, let's say > IgniteServicesSomething, > and "IgniteServices extends IgniteServicesSomething"? > > > [1] https://wiki.c2.com/?ParameterObject > > On Mon, Dec 20, 2021 at 12:15 PM Alex Plehanov <plehanov.a...@gmail.com> > wrote: > > > Pavel, > > > > As for option (1): the count of methods will increase in geometric > > progression with each new parameter. For example, if we decide to add > > tracing to services, we should keep current methods as-is for backward > > compatibility and add new methods supporting a tracing parameter. > > > > > Also, we don't provide methods like withTimeout, withSticky, so adding > > withContext will introduce another inconsistency. > > We already using such an approach in transactions for example, where we > > have withLabel, withTracing modifier, and the timeout method parameter. I > > think it's nothing wrong here. We can't get rid of timeout and sticky > > parameters due to backward compatibility. > > > > > (3) seems to be too complicate > > I see no complication here. From the user's point of view - almost nothing > > changed. The user can use the same IgniteService interface when > > using services without modifiers. When using modifiers - only interface > > with methods related to modifiers will be available. In most cases, the > > user even no need to know about this new interface. > > > > I'm voting for option (3). > > > > чт, 16 дек. 2021 г. в 15:59, Pavel Tupitsyn <ptupit...@apache.org>: > > > > > Pavel, > > > > > > My vote is for option (1). Simple and clear. > > > > > > As you noted, with (2) it is not clear which methods are affected. > > > Also, we don't provide methods like withTimeout, withSticky, so adding > > > withContext will introduce another inconsistency. > > > > > > (3) seems to be too complicated. > > > > > > On Thu, Dec 16, 2021 at 3:34 PM Pavel Pereslegin <xxt...@gmail.com> > > wrote: > > > > > > > Hi folks! > > > > > > > > The discussed feature is currently under development and recently > > > > there was a proposal for an API improvement, which I want to discuss. > > > > > > > > It is about how the user can specify a service call context when > > > > getting a proxy. > > > > > > > > I see the following options: > > > > > > > > 1. Passing the context as an argument to the proxy getter method. > > > > > > > > Ignite.services().serviceProxy(name,..., callCtx) > > > > > > > > The disadvantage is that for ease of use, we add several > > > > overloads of this method with different combinations of parameters. > > > > > > > > 2. Adding a new method "withCallContext(callCtx)" (returns > > > > IgniteServices) to the IgniteServices interface. > > > > > > > > Ignite.services().withCallContext(callCtx).serviceProxy(name,...) > > > > > > > > The disadvantage is that most of the IgniteServices methods > > > > are not related to the service call context (deploy, cancel > > > > of the service, etc.). > > > > > > > > 3. (extension of the 2nd option) Adding a new > > > > "withCallContext(callCtx)" method which returns a new interface. > > > > > > > > Ignite.service().withCallContext(callCtx).serviceProxy(name,...) > > > > > > > > Unlike the 2nd option, the "withCallContext()" method returns a new > > > > interface > > > > (for example, IgniteServiceProxies or IgniteContextAwareServices), > > > which > > > > contains only methods that use the service call context. > > > > > > > > WDYT? > > > > > > > > пт, 22 окт. 2021 г. в 14:36, Pavel Pereslegin <xxt...@gmail.com>: > > > > > > > > > > > 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 > > > > > > >>>>>> > > > > > > >>>> > > > > > > >> > > > > > > > > > > > > > > > > > > >