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

Reply via email to