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

Reply via email to