Pavel. > It is not cryptic, it is very straightforward and builds on existing binary > type mechanism.
I see the Ivan’s point here. As I said earlier - It must be absolutely clear for user - PA works or not. With the logic you propose it will be hiding inside Ignite machinery and logs. > Unfortunately, this is a breaking change. Currently this scenario works > without errors - uses default socket for custom affinity caches. It’s OK from my point of view to introduce such a change. > 10 июля 2022 г., в 22:05, Pavel Tupitsyn <ptupit...@apache.org> написал(а): > >> providing simple function Object -> int32 in cache configuration is wrong > decision > > Because it is error-prone and does not work for all cases: > - You have to set it explicitly on the client for every cache. > - No way to do that if you get an existing cache by name. > >> still being unable to solve the problem > > I believe the proposed solution covers all use cases. > >> cryptic logic > > It is not cryptic, it is very straightforward and builds on existing binary > type mechanism. > >> feature flags > > What's bad about feature flags? > >> how an ability to obtain a classname of java class can help my python or > C++ client map key to partition > > Not a java class name, but type id. You can set up type id mapping properly > and use this in any thin client. > This will work for .NET client, not sure about Python and C++. > > On Sun, Jul 10, 2022 at 9:33 PM Ivan Daschinsky <ivanda...@gmail.com> wrote: > >> Guys, I simply cant understand why providing simple function Object -> >> int32 in cache configuration is wrong decision, but implementing cryptic >> logic with class names, feature flags and still being unable to solve the >> probem is ok. I don't understand how an ability to obtain a classname of >> java class can help my python or C++ client map key to partition. >> >> Max's proposal seems to be a good variant, just change naming a little bit, >> maybe >> >> пт, 8 июл. 2022 г., 15:35 Pavel Tupitsyn <ptupit...@apache.org>: >> >>> Nikolay, >>> >>>> Add ability to sent custom affinity class name. >>> Can you please elaborate? What is sent where? >>> >>>> If `partitionAwarenessEnabled=true` but custom affinity can’t be >>> instantiated on the client - throw an exception >>> Unfortunately, this is a breaking change. Currently this scenario works >>> without errors - uses default socket for custom affinity caches. >>> >>> >>> On Fri, Jul 8, 2022 at 3:23 PM Николай Ижиков <nizhi...@apache.org> >> wrote: >>> >>>> Hello, Pavel. >>>> >>>> I support your proposal to transparently create custom AffinityMapper >>>> based on server node classname, in general. >>>> Partition Awareness crucial point for a thin client performance so It >>>> should be absolutely clear for a user - PA works correctly or not. >>>> >>>> So, I think, we should implement the following: >>>> >>>> 0. Add ability to sent custom affinity class name. >>>> 1. If `partitionAwarenessEnabled=true` but custom affinity can’t be >>>> instantiated on the client - throw an exception. >>>> >>>> WDYT? >>>> >>>>> 8 июля 2022 г., в 08:37, Pavel Tupitsyn <ptupit...@apache.org> >>>> написал(а): >>>>> >>>>> To clarify: you can use a different AffinityFunction implementation >> on >>>> the >>>>> client side. It just has to map to the same binary typeId. >>>>> Even if there is a legacy setup with AffinityKeyMapper on servers, >> you >>>> can >>>>> craft an AffinityFunction for the client that achieves correct >>> behavior. >>>>> So I believe this should cover any use case. >>>>> >>>>> On Thu, Jul 7, 2022 at 10:36 PM Pavel Tupitsyn <ptupit...@apache.org >>> >>>> wrote: >>>>> >>>>>> AffinityKeyMapper is just a subset of AffinityFunction, isn't it? >>>>>> So by supporting AffinityFunction we cover all AffinityKeyMapper use >>>> cases. >>>>>> >>>>>> >>>>>>> managing the classpath, a user should always keep in mind it >>>>>> I don't consider this a problem. This is how Java works, what can we >>> do? >>>>>> You can also stick the class into BinaryConfiguration on the client >> to >>>>>> make it explicit and make sure it is loaded. >>>>>> >>>>>>> it still possible having user bad implementations of >> AffinityFunction >>>>>> that can't be easily instantiated; >>>>>> It is also possible to provide a bad implementation of >> ToIntFunction, >>> no >>>>>> difference. >>>>>> >>>>>>> a question - what we should do in case of class instantiating >> loading >>>>>> fails? >>>>>> Currently we don't fail on custom affinity, right? So we should keep >>>> this >>>>>> behavior. Print a warning. >>>>>> >>>>>> On Thu, Jul 7, 2022 at 10:27 PM Maxim Muzafarov <mmu...@apache.org> >>>> wrote: >>>>>> >>>>>>> Pavel, >>>>>>> >>>>>>> >>>>>>> Yes, you're right that AffinityKeyMapper is deprecated, this is sad >>> to >>>>>>> say but it still used. >>>>>>> >>>>>>> Let me describe the cases in more detail. In general, we have >>>>>>> customers which are using: >>>>>>> >>>>>>> 1. an own custom AffinityFunction; >>>>>>> 2. the default RendezvousAffinityFunction + an own deprecated >>>>>>> AffinityKeyMapper; >>>>>>> 3. an own custom AffinityFunction + an own deprecated >>>>>>> AffinityKeyMapper (I doubt about this case); >>>>>>> >>>>>>> I'd like to provide a general solution that solves all the cases >>>>>>> mentioned above, thus we can't discuss only AffinityFunction. It >>>>>>> doesn't fit the initial goals. >>>>>>> >>>>>>> >>>>>>>> Can you please clarify the "tricky" part? >>>>>>> >>>>>>> Yes, from my point of view the tricky part here is: >>>>>>> >>>>>>> - managing the classpath, a user should always keep in mind it; >>>>>>> - it still possible having user bad implementations of >>>>>>> AffinityFunction that can't be easily instantiated; >>>>>>> - a question - what we should do in case of class instantiating >>>>>>> loading fails? drop the client, print the warn or do nothing. These >>>>>>> solutions have a different impact on a production environment and >>> user >>>>>>> may have different expectations on that; >>>>>>> >>>>>>> >>>>>>> I'm not saying that solution you suggested is bad, it just has some >>>>>>> drawbacks (like other solutions) and doesn't solves all the cases >> if >>>>>>> we're not instantiating a deprecated AffinityKeyMapper (which >> looks a >>>>>>> bit ugly for me too). >>>>>>> >>>>>>> >>>>>>> Actually, we are not limited with setting/instantiating >>>>>>> AffinityFunction. We can provide for a user a control on which >>> channel >>>>>>> (node) a particular cache request will be executed (this thing also >>>>>>> have a drawback - a transactional operation cannot be executed on >> an >>>>>>> arbitrary node, it should be executed on node it's started). >>>>>>> >>>>>>> On Thu, 7 Jul 2022 at 21:41, Pavel Tupitsyn <ptupit...@apache.org> >>>> wrote: >>>>>>>> >>>>>>>>> AffinityKeyMapper (it will be required too) >>>>>>>> It is deprecated. We should not add any functionality on top of >>>>>>> deprecated >>>>>>>> stuff. >>>>>>>> Let's discuss only AffinityFunction. >>>>>>>> >>>>>>>>> this approach requires of these classes to be present on a thin >>>> client >>>>>>>> side and it can be tricky >>>>>>>> Any of the approaches discussed above requires some additional >> logic >>>> to >>>>>>> be >>>>>>>> present on the client. >>>>>>>> Can you please clarify the "tricky" part? >>>>>>>> >>>>>>>> All you need is to provide AffinityFunction implementation with a >>>> proper >>>>>>>> class name >>>>>>>> (or even use nameMapper/idMapper to map to a different name), it >> is >>> no >>>>>>>> different from the ToIntFunction approach. >>>>>>>> >>>>>>>> >>>>>>>> On Thu, Jul 7, 2022 at 9:23 PM Maxim Muzafarov <mmu...@apache.org >>> >>>>>>> wrote: >>>>>>>> >>>>>>>>> Folks, >>>>>>>>> >>>>>>>>> I'd like also to mention since we are talking about a customer's >>>>>>>>> custom affinity function and affinity mapper implementations we >>> could >>>>>>>>> face with some issues during these classes instantiation. It >> could >>>>>>>>> work for the customer which I've faced on, but I cannoun be sure >>> that >>>>>>>>> this approach will work for all of the cases. >>>>>>>>> >>>>>>>>> I think it is better to avoid such an issues and leave it up to a >>>>>>>>> user. Nevertheless, the worst scenario for the user would be >>> having 2 >>>>>>>>> hops on each put/get as it was before this thread. >>>>>>>>> >>>>>>>>> On Thu, 7 Jul 2022 at 21:12, Maxim Muzafarov <mmu...@apache.org> >>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> Folks, >>>>>>>>>> >>>>>>>>>> I'm not familiar with a thin client protocol, so, please, >> correct >>> me >>>>>>>>>> if I'm wrong - is it possible sending classes over the network >> for >>>>>>>>>> different type of thin clients? It seems to me it will not >> work. I >>>>>>>>>> think it is possible to use class name/or type id and we are >>> capable >>>>>>>>>> to instantiate both of the AffinityFunction and >> AffinityKeyMapper >>>>>>> (it >>>>>>>>>> will be required too) classes. However, this approach requires >> of >>>>>>>>>> these classes to be present on a thin client side and it can be >>>>>>> tricky >>>>>>>>>> to configure if this client is used inside a container (e.g. >> with >>>>>>>>>> spring data or something). >>>>>>>>>> >>>>>>>>>> Setting directly some kind of a known mapper looks more >>>>>>>>>> straightforward and error prone approach. >>>>>>>>>> >>>>>>>>>> Please, correct me if I am wrong. >>>>>>>>>> >>>>>>>>>> On Thu, 7 Jul 2022 at 21:02, Семён Данилов <samvi...@yandex.ru> >>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>> +1 to Pavel’s approach. Giving user the ability to set affinity >>>>>>>>> function that is potentially different from the one that is on >>> server >>>>>>>>> doesn’t look good. >>>>>>>>>>> >>>>>>>>>>> I’d even go further and try sending the affinity function class >>>>>>> itself >>>>>>>>> over the network, so users won’t have to alter the classpath by >>>>>>> adding the >>>>>>>>> class that is not directly used in the codebase. >>>>>>>>>>> On 7 Jul 2022, 21:41 +0400, Pavel Tupitsyn < >> ptupit...@apache.org >>>>>>>> , >>>>>>>>> wrote: >>>>>>>>>>>> Can we actually avoid any public API changes and do the >>>>>>> following: >>>>>>>>>>>> >>>>>>>>>>>> When a feature flag is present and there is a custom affinity >>>>>>>>> function on >>>>>>>>>>>> the server, send back the class name (or binary type id, if >>>>>>>>> possible) of >>>>>>>>>>>> the affinity function? >>>>>>>>>>>> Then simply instantiate it on the client and call >>>>>>> `partition(Object >>>>>>>>> key)` >>>>>>>>>>>> on it? >>>>>>>>>>>> >>>>>>>>>>>> On Thu, Jul 7, 2022 at 8:32 PM Maxim Muzafarov < >>>>>>> mmu...@apache.org> >>>>>>>>> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Pavel, >>>>>>>>>>>>> >>>>>>>>>>>>> Here is my thoughts. >>>>>>>>>>>>> >>>>>>>>>>>>> As I mentioned before, we will need only the >>>>>>>>>>>>> AffinityFunction#partition(Object key) method for calculation >>>>>>> on >>>>>>>>> the >>>>>>>>>>>>> client side due to all the partition-to-node mappings will be >>>>>>>>>>>>> requested asynchronously from a server node how it is >>>>>>> happening now >>>>>>>>>>>>> for cache groups with the default affinity function. Thus >>>>>>> setting >>>>>>>>> the >>>>>>>>>>>>> AffinityFunction looks on the client side redundant and it >>>>>>> can be >>>>>>>>>>>>> transformed to a simple ToInFunction<Object> interface. >>>>>>>>>>>>> >>>>>>>>>>>>> public interface ToIntFunction<Object> { >>>>>>>>>>>>> int applyAsInt(Object key); >>>>>>>>>>>>> } >>>>>>>>>>>>> >>>>>>>>>>>>> Another point that I'd like also to mention is that the cache >>>>>>>>> already >>>>>>>>>>>>> created in a cluster, so it will be better to eliminate the >>>>>>>>> duplicate >>>>>>>>>>>>> affinity function configuration (setting the number of >>>>>>>>> partitions). It >>>>>>>>>>>>> is fully possible to receive the number of partitions from a >>>>>>> server >>>>>>>>>>>>> node (the same way as it currently happening). Thus instead >>>>>>> of the >>>>>>>>>>>>> ToInFunction<Object> interface it will be better to use >>>>>>>>>>>>> ToInBiFunction<Object, Integer>. >>>>>>>>>>>>> >>>>>>>>>>>>> public interface ToIntBiFunction<Object, Integer> { >>>>>>>>>>>>> int applyAsInt(Object key, Integer parts); >>>>>>>>>>>>> } >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> I agree with you that "setPartitionAwarenessKeyMapper" may be >>>>>>> is >>>>>>>>> not >>>>>>>>>>>>> good naming here, we can rename it and move it to the public >>>>>>> API, >>>>>>>>> of >>>>>>>>>>>>> course. >>>>>>>>>>>>> >>>>>>>>>>>>> On Thu, 7 Jul 2022 at 20:06, Pavel Tupitsyn < >>>>>>> ptupit...@apache.org> >>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Maxim, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I am confused. We were talking about a custom Affinity >>>>>>> Function. >>>>>>>>>>>>>> As you noted, AffinityKeyMapper is deprecated, why do we add >>>>>>>>> something >>>>>>>>>>>>>> named "setPartitionAwarenessKeyMapper"? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Internal API approach is hacky. >>>>>>>>>>>>>> IMO we should either develop a proper feature with a good >>>>>>> public >>>>>>>>> API, or >>>>>>>>>>>>>> not add anything at all. >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Thu, Jul 7, 2022 at 6:34 PM Maxim Muzafarov < >>>>>>>>> mmu...@apache.org> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Folks, >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Thank you for your comments. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> First of all, I'd like to point out that if the cache is >>>>>>>>> created with >>>>>>>>>>>>>>> a custom affinity function or the legacy AffinityKeyMapper >>>>>>>>> interface, >>>>>>>>>>>>>>> the thin client should be able to provide only a >>>>>>>>> `key-to-partition` >>>>>>>>>>>>>>> mapping function to handle the case described above. The >>>>>>>>>>>>>>> `partition-to-node` mappings the client will receive from >>>>>>> a >>>>>>>>> server >>>>>>>>>>>>>>> node it connected to. This will simplify a bit the final >>>>>>>>> solution. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ================== >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I've checked your suggestions and it looks like both of >>>>>>> them >>>>>>>>> have some >>>>>>>>>>>>>>> sufficient drawbacks: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 1. Using SystemProperty looks really hacky and we are >>>>>>>>> explicitly >>>>>>>>>>>>>>> complicate a thin client configuration for an end user. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2. Extending the ClientCacheConfiguration is a very good >>>>>>> and >>>>>>>>>>>>>>> straightforward idea, however it doesn't fit the case >>>>>>>>> described above. >>>>>>>>>>>>>>> Caches previously created with custom affinity >>>>>>> functions/key >>>>>>>>> mappers >>>>>>>>>>>>>>> already present in the cluster, so in this case we are >>>>>>> forcing >>>>>>>>> a user >>>>>>>>>>>>>>> to store an additional ClientCacheConfiguration. This is >>>>>>> not >>>>>>>>> good. The >>>>>>>>>>>>>>> cache.getOrCreate(cfg) method will also be used and fire >>>>>>> in >>>>>>>>> turn >>>>>>>>>>>>>>> CACHE_GET_OR_CREATE_WITH_CONFIGURATION request which is >>>>>>> not >>>>>>>>> necessary >>>>>>>>>>>>>>> here. For this case using cache.name(str) is only enough. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ================== >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I propose the following two solutions that looks very >>>>>>>>> promising: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 3. Extending cache create methdos with a >>>>>>> ClientCacheContext in >>>>>>>>> the >>>>>>>>>>>>>>> IgniteClient interface. This context will contain all >>>>>>>>> additional cache >>>>>>>>>>>>>>> attributes like custom cache affinity mappers that map >>>>>>> cache >>>>>>>>> keys to >>>>>>>>>>>>>>> partitions if a custom affinity was used on the server >>>>>>> side >>>>>>>>> (note that >>>>>>>>>>>>>>> all partition-to-node mappings will be received by thin >>>>>>> client >>>>>>>>> from a >>>>>>>>>>>>>>> server node). >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> interface IgniteClientEx extends IgniteClient { >>>>>>>>>>>>>>> ClientCache<K, V> name(String name, ClientCacheContext >>>>>>> cctx); >>>>>>>>>>>>>>> ClientCache<K, V> getOrCreateCache(String name, >>>>>>>>> ClientCacheContext >>>>>>>>>>>>>>> cctx); >>>>>>>>>>>>>>> ClientCache<K, V> >>>>>>> getOrCreateCache(ClientCacheConfiguration >>>>>>>>> cfg, >>>>>>>>>>>>>>> ClientCacheContext cctx); >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> class ClientCacheContext { >>>>>>>>>>>>>>> setPartitionAwarenessKeyMapper(ToIntBiFunction<Object, >>>>>>> Integer> >>>>>>>>>>>>>>> mapper); >>>>>>>>>>>>>>> } >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 4. Use the same approach as the IgniteCache interface >>>>>>> does for >>>>>>>>> the >>>>>>>>>>>>>>> same things - adding withPartitionAwarenessKeyMapper() to >>>>>>> the >>>>>>>>>>>>>>> interface. This method will allow to configure the thin >>>>>>> client >>>>>>>>>>>>>>> execution behaviour for the partition awareness feature by >>>>>>>>> setting a >>>>>>>>>>>>>>> custom cache key mapper. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> ================== >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> I've used the 4-th solution due to it brings much less >>>>>>> source >>>>>>>>> code to >>>>>>>>>>>>>>> the Apache Ignite codebase and looks a bit simpler to >>>>>>>>> configure for a >>>>>>>>>>>>>>> user. I've also move the withPartitionAwarenessKeyMapper() >>>>>>>>> method to >>>>>>>>>>>>>>> an internal API interface which still solves a user issue >>>>>>> with >>>>>>>>> the >>>>>>>>>>>>>>> partition awareness, but also specifies that the custom >>>>>>> mapping >>>>>>>>>>>>>>> function and deprecated AffinityKeyMapper should not be >>>>>>> used, >>>>>>>>> in >>>>>>>>>>>>>>> general. >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> Please, take a look at my patch: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/IGNITE-17316 >>>>>>>>>>>>>>> https://github.com/apache/ignite/pull/10140/files >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> On Fri, 1 Jul 2022 at 14:41, Pavel Tupitsyn < >>>>>>>>> ptupit...@apache.org> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> I have no objections to extending the Thin Client >>>>>>>>> configuration with >>>>>>>>>>>>> a >>>>>>>>>>>>>>>> pluggable Affinity Function. >>>>>>>>>>>>>>>> Let's make it a normal Java setter though, system >>>>>>> properties >>>>>>>>> are >>>>>>>>>>>>> hacky. >>>>>>>>>>>>>>>> Especially when only some of the caches use custom >>>>>>> affinity, >>>>>>>>> as Maxim >>>>>>>>>>>>>>>> mentioned. >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>> On Wed, Jun 29, 2022 at 7:20 PM Николай Ижиков < >>>>>>>>> nizhi...@apache.org> >>>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> +1 to have ability to specify custom affinity for PA >>>>>>> on >>>>>>>>> thin >>>>>>>>>>>>> client. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> It seems to me custom affinity is a rare use-case of >>>>>>>>> Ignite API. >>>>>>>>>>>>>>>>> Propose to have SystemProperty that can specify >>>>>>> affinity >>>>>>>>>>>>> implementation >>>>>>>>>>>>>>>>> for a thin client. >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 29 июня 2022 г., в 18:53, Maxim Muzafarov < >>>>>>>>> mmu...@apache.org> >>>>>>>>>>>>>>>>> написал(а): >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Igniters, >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> I've faced with a customer's cluster which has more >>>>>>> than >>>>>>>>> 150 >>>>>>>>>>>>> nodes >>>>>>>>>>>>>>> and >>>>>>>>>>>>>>>>>> most for them are the thick-client nodes. Due to >>>>>>> each >>>>>>>>>>>>> thick-client is >>>>>>>>>>>>>>>>>> a full-fledged cluster topology participant it >>>>>>> affects >>>>>>>>> the >>>>>>>>>>>>> cluster >>>>>>>>>>>>>>>>>> discovery machinery during the system operation and >>>>>>>>> adding an >>>>>>>>>>>>>>>>>> additional overhead for using/deploying a new nodes >>>>>>> in >>>>>>>>> Kubernetes >>>>>>>>>>>>>>>>>> environment. However, the main thing from my point >>>>>>> of >>>>>>>>> view it >>>>>>>>>>>>>>> prevents >>>>>>>>>>>>>>>>>> updating the client side and server side components >>>>>>>>> independently >>>>>>>>>>>>>>>>>> (Apache Ignite doesn't support rolling upgrade). >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Accordingly to the assumptions above using thin >>>>>>> clients >>>>>>>>> become a >>>>>>>>>>>>>>>>>> necessary. This looks even more attractive, since >>>>>>> the >>>>>>>>> thin >>>>>>>>>>>>> client has >>>>>>>>>>>>>>>>>> a fairly rich API over the past few releases. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> The MAIN ISSUE here that blocks thin client usage is >>>>>>>>> that for >>>>>>>>>>>>> some of >>>>>>>>>>>>>>>>>> cache groups a custom affinity function (and an >>>>>>>>>>>>> AffinityKeyMapper) >>>>>>>>>>>>>>> was >>>>>>>>>>>>>>>>>> used which prevents enabling the Partition Awareness >>>>>>>>> thin client >>>>>>>>>>>>>>>>>> feature. Thus each cache request will have two hops. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Of course, we can force users to migrate to a new >>>>>>> API, >>>>>>>>> but this >>>>>>>>>>>>>>>>>> becomes more difficult when Apache Ignite is part >>>>>>> of a >>>>>>>>> much >>>>>>>>>>>>> larger >>>>>>>>>>>>>>>>>> architectural solution and thus it is doent' looks >>>>>>> so >>>>>>>>> friendly. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> The MAIN QUESTION here - does anyone know our users >>>>>>> who >>>>>>>>> have >>>>>>>>>>>>>>>>>> encountered with the same issue? I want to solve >>>>>>> such a >>>>>>>>> problem >>>>>>>>>>>>> once >>>>>>>>>>>>>>>>>> and make all such users happy by implementing the >>>>>>> general >>>>>>>>>>>>> approach. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> = Possible solutions = >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 1. Making an affinity function pluggable (mapping >>>>>>>>> calculations) >>>>>>>>>>>>> on >>>>>>>>>>>>>>> the >>>>>>>>>>>>>>>>>> thin clients side. Currently the >>>>>>>>> RendezvousAffinityFunction [1] >>>>>>>>>>>>> is >>>>>>>>>>>>>>>>>> only supported >>>>>>>>>>>>>>>>>> for the partition awareness. A user's affinity >>>>>>> function >>>>>>>>> seems to >>>>>>>>>>>>> be >>>>>>>>>>>>>>>>>> the stateless function due to there is no machinery >>>>>>> to >>>>>>>>> transfer >>>>>>>>>>>>>>> states >>>>>>>>>>>>>>>>>> to the thin client. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Pros - a general solution for all such cases; >>>>>>>>>>>>>>>>>> Cons - unnecessary complexity, extending public API; >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> 2. Creating an Ignite extension which will extend >>>>>>> the >>>>>>>>> thin >>>>>>>>>>>>> client API >>>>>>>>>>>>>>>>>> thus a user will have a full control over a >>>>>>> destination >>>>>>>>> node to >>>>>>>>>>>>> which >>>>>>>>>>>>>>>>>> requests being sent. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Pros - isolated solution, simple implementation; >>>>>>>>>>>>>>>>>> Cons - hard to support spring-boot-thin-client etc. >>>>>>> and >>>>>>>>> other >>>>>>>>>>>>>>>>>> extensions based on the thin client API; >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> Folks, please share your thoughts. >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>> [1] >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>> >>>>>>> >>>> >>> >> https://github.com/apache/ignite/blob/master/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePartitionsRequest.java#L206 >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>> >>>>>>> >>>>>> >>>> >>>> >>> >>