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