Val, I like your suggestion about naming, it describes the purpose of the configuration the best.
On Tue, Jun 16, 2020 at 5:18 PM Ivan Bessonov <bessonov...@gmail.com> wrote: > Hi, > > I created new issue that describes CQ problem in more details: [1] > I'm fine with experimental status and new property naming. > > [1] https://issues.apache.org/jira/browse/IGNITE-13156 > > вт, 16 июн. 2020 г. в 02:20, Valentin Kulichenko < > valentin.kuliche...@gmail.com>: > > > Folks, > > > > Thanks for providing the detailed clarifications. Let's add the > parameter, > > mark the new feature as experimental, and target for making it the > default > > mode in Ignite 3.0. > > > > I still don't think we can come up with a naming that is really > intuitive, > > but let's try to simplify it as much as possible. How about this: > > > > TcpCommunicationSpi#forceClientToServerConnections -- false by default, > > true if the new mode needs to be enabled. > > > > Let me know your thoughts. > > > > -Val > > > > On Wed, Jun 10, 2020 at 4:10 PM Denis Magda <dma...@apache.org> wrote: > > > > > Sergey, > > > > > > Thanks for the detailed explanation and for covering all corner cases. > > > > > > Considering the improvement's criticality, I would continue moving in > the > > > initial direction and add that particular configuration property. > > > Potentially, we can put more effort throughout an Ignite 3.0 timeframe > > and > > > remove the property altogether. @Valentin Kulichenko > > > <vkuliche...@gridgain.com>, could you please suggest any alternate > > naming? > > > > > > Btw, what are the specifics of the issue with continuous queries? It > will > > > be ideal if we could release this new communication option in the GA > > state > > > in 2.9. > > > > > > - > > > Denis > > > > > > > > > On Wed, Jun 10, 2020 at 1:22 AM Sergey Chugunov < > > sergey.chugu...@gmail.com > > > > > > > wrote: > > > > > > > Denis, Val, > > > > > > > > Idea of prohibiting servers to open connections to clients and force > > > > clients to always open "inverse connections" to servers looks > > promising. > > > To > > > > be clear, by "inverse connections" I mean here that server needed to > > > > communicate with client requests client to open a connection back > > instead > > > > of opening connection by itself using addresses published by the > > client. > > > > > > > > If we apply the idea it will indeed allow us to simplify our > > > configuration > > > > (no need for new configuration property), another advantage is > clients > > > > won't need to publish their addresses anymore (with one side note > I'll > > > > cover at the end), it will also simplify our code. > > > > > > > > However applying it with current implementation of inverse connection > > > > request (when request goes across all ring) may bring significant > delay > > > of > > > > opening first connection depending on cluster size and relative > > positions > > > > between server that needs to communicate with client (target server) > > and > > > > client's router node. > > > > > > > > It is possible to overcome this by sending inverse connection request > > not > > > > via discovery but directly to router server node via communication > and > > > > convert to discovery message only on the router. We'll still have two > > > hops > > > > of communication request instead of one plus discovery worker on > client > > > may > > > > be busy working on other stuff slowing down handling of connection > > > request. > > > > But it should be fine. > > > > > > > > However with this solution it is hard to implement failover of router > > > node: > > > > let me describe it in more details. > > > > In case of router node failure target server won't be able to > determine > > > if > > > > client received inverse comm request successfully and (even worse) > > won't > > > be > > > > able to figure out new router for the client without waiting for > > > discovery > > > > event of the client reconnect. > > > > And this brings us to the following choise: we either wait for > > discovery > > > > event about client reconnect (this is deadlock-prone as current > > protocol > > > of > > > > CQ registration opens comm connection to client right from discovery > > > thread > > > > in some cases; if we wait for new discovery event from discovery > > thread, > > > it > > > > is a deadlock) or we fail opening the connection by timeout thus > adding > > > new > > > > scenarios when opening connection may fail. > > > > > > > > Thus implementing communication model "clients connect to servers, > > > servers > > > > never connect to clients" efficiently requires more work on different > > > parts > > > > of our functionality and rigorous testing of readiness of our code > for > > > more > > > > communication connection failures. > > > > > > > > So to me the least risky decision is not to delete new configuration > > but > > > > leave it with experimental status. If we find out that direct request > > > > (server -> router server -> target client) implementation works well > > and > > > > doesn't bring much complexity in failover scenarios we'll remove that > > > > configuration and prohibit servers to open connections to clients by > > > > default. > > > > > > > > Side note: there are rare but yet possible scenarios where client > node > > > > needs to open communication connection to other client node. If we > let > > > > clients not to publish their addresses these scenarios will stop > > working > > > > without additional logic like sending data through router node. As > far > > > as I > > > > know client-client connectivity is involved in p2p class deployment > > > > scenarios, does anyone know about other cases? > > > > > > > > -- > > > > Thanks, > > > > Sergey Chugunov > > > > > > > > On Wed, Jun 3, 2020 at 5:37 PM Denis Magda <dma...@apache.org> > wrote: > > > > > > > > > Ivan, > > > > > > > > > > It feels like Val is driving us in the right direction. Is there > any > > > > reason > > > > > for keeping the current logic when servers can open connections to > > > > clients? > > > > > > > > > > - > > > > > Denis > > > > > > > > > > > > > > > On Thu, May 21, 2020 at 4:48 PM Valentin Kulichenko < > > > > > valentin.kuliche...@gmail.com> wrote: > > > > > > > > > > > Ivan, > > > > > > > > > > > > Have you considered eliminating server to client connections > > > > altogether? > > > > > > Or, at the very least making the "client to server only" mode the > > > > default > > > > > > one? > > > > > > > > > > > > All the suggested names are confusing and not intuitive, and I > > doubt > > > we > > > > > > will be able to find a good one. A server initiating a TCP > > connection > > > > > with > > > > > > a client is confusing in the first place and creates a usability > > > issue. > > > > > We > > > > > > now want to solve it by introducing an additional configuration > > > > > > parameter, and therefore additional complexity. I don't think > this > > is > > > > the > > > > > > right approach. > > > > > > > > > > > > What are the drawbacks of permanently switching to > client-to-server > > > > > > connections? Is there any value provided by the server-to-client > > > > option? > > > > > > > > > > > > As for pair connections, I'm not sure I understand why there is a > > > > > > limitation. As far as I know, the idea behind this feature is > that > > we > > > > > > maintain two connections between two nodes instead of one, so > that > > > > every > > > > > > connection is used for communication in a single direction only. > > Why > > > > does > > > > > > it matter which node initiates the connection? Why can't one of > the > > > > nodes > > > > > > (e.g., a client) initiate both connections, and then use them > > > > > accordingly? > > > > > > Correct me if I'm wrong, but I don't see why we can't do this. > > > > > > > > > > > > -Val > > > > > > > > > > > > On Thu, May 21, 2020 at 1:58 PM Denis Magda <dma...@apache.org> > > > wrote: > > > > > > > > > > > > > Ivan, > > > > > > > > > > > > > > Considering that the setting controls the way a communication > SPI > > > > > > > connection is open I would add the new parameter to > > > CommunicationSpi > > > > > > > interface naming it as follows: > > > > > > > > > > > > > > > > > > > > > > > CommunicationSpi.connectionInitiationMode > > > > > > > > { > > > > > > > > BIDIRECTIONAL, //both clients and servers initiate a > > > connection > > > > > > > > initiation procedure > > > > > > > > CLIENTS_TO_SERVERS //servers cannot open a connection to > > > > clients, > > > > > > > only > > > > > > > > clients can do that > > > > > > > > } > > > > > > > > > > > > > > > > > > > > > The problem with the environment type approach is that private > > > > networks > > > > > > of > > > > > > > bare-metal environments usually impose restrictions similar to > > > > virtual > > > > > > > environments powered by Kubernetes. Thus, > > > environmentType.VIRTUALIZED > > > > > > > doesn't cover all the cases and I'm struggling to come up with > a > > > > > > universal > > > > > > > alternative. > > > > > > > > > > > > > > - > > > > > > > Denis > > > > > > > > > > > > > > > > > > > > > On Thu, May 21, 2020 at 5:38 AM Ivan Bessonov < > > > bessonov...@gmail.com > > > > > > > > > > > > wrote: > > > > > > > > > > > > > > > Hello Igniters, > > > > > > > > > > > > > > > > I'd like to discuss with you changes related to [1] and [2]. > > Both > > > > > > issues > > > > > > > > are mostly the same so > > > > > > > > let's discuss the core idea. > > > > > > > > > > > > > > > > *Motivation.* > > > > > > > > > > > > > > > > There are certain environments that don't allow Ignite server > > > nodes > > > > > to > > > > > > > open > > > > > > > > TCP connections to > > > > > > > > thick clients, e.g. K8S, AWS Lambda or Azure Functions. To > > > operate > > > > in > > > > > > > such > > > > > > > > environments, the > > > > > > > > server needs a way to request a client to open an "inverse" > > > > > > communication > > > > > > > > connection to it. > > > > > > > > > > > > > > > > I've prepared a PR (still in progress) that introduces new > > > > mechanism > > > > > of > > > > > > > > opening connection and > > > > > > > > related configuration. > > > > > > > > > > > > > > > > *Main idea* > > > > > > > > > > > > > > > > This mechanism is called "communication via discovery" or > > > "inverse > > > > > > > > connection", it works as > > > > > > > > follows: > > > > > > > > - server that needs to connect to "unreachable" thick client > > > > sends a > > > > > > > > specific Discovery message > > > > > > > > (inverse communication request) to that client; > > > > > > > > - client node upon receiving the request opens communication > > > > > > connection > > > > > > > to > > > > > > > > that server; > > > > > > > > - server sees connection opened by client and proceeds with > > its > > > > task > > > > > > > (that > > > > > > > > required opening > > > > > > > > connection to the client). > > > > > > > > > > > > > > > > Working name for new configuration parameter for this feature > > is > > > > > > > > environmentType, it is an > > > > > > > > enum with two values (again, working names): STANDALONE > > (default) > > > > and > > > > > > > > VIRTUALIZED. > > > > > > > > It is used as a hint to server to speed-up establishing of > > > > > connections: > > > > > > > > when server sees a client > > > > > > > > with VIRTUALIZED environmentType it doesn't try to open > > > connection > > > > to > > > > > > it > > > > > > > > and sends inverse > > > > > > > > communication request right away. > > > > > > > > If environmentType is STANDALONE then server tries to open a > > > > > connection > > > > > > > in > > > > > > > > a regular way > > > > > > > > (iterating over all client addresses) and sends request only > if > > > all > > > > > > > > attempts failed. > > > > > > > > > > > > > > > > There is a concern about naming of the configuration as it > > > catches > > > > > only > > > > > > > one > > > > > > > > use-case: when we > > > > > > > > deal with some kind of virtualized environment like K8S. > > > > > > > > There are other options I've encountered in private > discussion: > > > > > > > > - connectionMode - ALWAYS_INITIATE / INITIATE_OR_ACCEPT > > > > > > > > - networkConnectivity - REACHABLE_ALWAYS / REACHABLE_ONE_WAY > > > > > > > > - communicationViaDiscovery - ALWAYS / FALLBACK > > > > > > > > - isReachableFromAllNodes (true/false flag) > > > > > > > > - initiateConnectionsOnThisNode (true/false flag). > > > > > > > > > > > > > > > > *Limitations* > > > > > > > > > > > > > > > > The feature cannot be used along with pairedConnection > setting > > as > > > > > this > > > > > > > > setting implies > > > > > > > > establishing connections in both directions. Also current > > > > > > implementation > > > > > > > > supports opening only > > > > > > > > client-to-server connections. Other types of connections like > > > > > > > > client-to-client or server-to-server > > > > > > > > will be implemented in separate tickets. > > > > > > > > > > > > > > > > [1] https://issues.apache.org/jira/browse/IGNITE-12438 > > > > > > > > [2] https://issues.apache.org/jira/browse/IGNITE-13013 > > > > > > > > > > > > > > > > -- > > > > > > > > Sincerely yours, > > > > > > > > Ivan Bessonov > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > -- > Sincerely yours, > Ivan Bessonov >