GridGain Developers Hub
GitHub logo GridGain iso GridGain.com
GridGain Software Documentation

Thin Clients Overview

Overview

A thin client is a lightweight GridGain client that connects to the cluster via a standard socket connection. It does not become a part of the cluster topology, never holds any data, and is not used as a destination of compute grid calculations. What it does is simply establish a socket connection to a standard GridGain node​ and perform all operations through that node.

The thin clients are based on binary client protocol making it possible to support GridGain connectivity from any programming language.

GridGain provides the following thin clients:

Thin Client Features

The following table outlines features supported by each client.

Thin Client Feature Java .NET C++ Python Node.js PHP

Scan Query

yes

yes

No

yes

yes

yes

Scan Query with a filter

yes

yes

No

No

No

No

SqlFieldsQuery

yes

yes

No

yes

yes

yes

Binary Object API

yes

yes

No

No

yes

yes

Async Operations

No

yes

No

yes

yes

yes

SSL/TLS

yes

yes

yes

yes

yes

yes

Authentication

yes

yes

yes

yes

yes

yes

Partition Awareness

No

yes

yes

yes

yes

No

Failover

yes

No

yes

yes

yes

yes


Client Connection Failover

All thin clients (except for .NET thin client) support a connection failover mechanism, whereby the client automatically switches to an available node in case of the current node or connection failure. For this mechanism to work, you need to provide a list of node addresses you want to use for failover purposes in the client configuration. Refer to a specific client documentation for details.

Partition Awareness

As explained in the Data Partitioning section, data in the cluster is distributed between the nodes in a balanced manner for scalability and performance reasons. Each cluster node maintains a subset of the data and the partition distribution map that is used to determine the node that keeps the primary/backup copy of requested entries/records.

Without partition awareness, an application that is connected to the cluster via a thin client executes all queries and operations via a single server node that de facto acts as a proxy for incoming request. These operations are then re-routed to the node that stores the data that is being requested. This results in a bottleneck that could prevent the application from scaling linearly.

Without Partition Awareness

Notice how queries must pass through the proxy server node, where they are routed to the correct node.

With partition awareness in place, the thin client can directly route queries and operations to the primary nodes that own the data required for the queries. This eliminates the bottleneck, allowing the application to scale more easily.

With Partition Awareness

Partition Awareness is available for the .NET, C++, Python, and Node.js thin clients. Refer to the documentation of a specific client for further information.

Cluster Configuration

Thin client connection parameters are controlled by the client connector configuration. By default, GridGain accepts client connections on port 10800. You can change the port, connection buffer size and timeout, enable SSL/TLS, etc.

Configuring Thin Client Connector

The following example shows how to configure thin client connection parameters:

<bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
    <property name="clientConnectorConfiguration">
        <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
            <property name="port" value="10000"/>
        </bean>
    </property>
</bean>
ClientConnectorConfiguration clientConnectorCfg = new ClientConnectorConfiguration();
// set a port range from 10000 to 10005
clientConnectorCfg.setPort(10000);
clientConnectorCfg.setPortRange(10);

IgniteConfiguration cfg = new IgniteConfiguration().setClientConnectorConfiguration(clientConnectorCfg);

//Start a node
Ignite ignite = Ignition.start(cfg);

The following table describes some parameters that you may want to change.

Parameter Description Default Value

thinClientEnabled

Enables or disables thin client connectivity.

true

port

The port for thin client connections.

10800

portRange

This parameters sets a range of ports for thin client connections. For example, if portRange = 10, thin clients can connect to any port from range 10800–18010. The node will try to bind to each port from the range starting from the port until it finds an available one. If all ports are unavailable, the node won’t start.

100

sslEnabled

Set this property to true to enable SSL for thin client connections.

false

See the complete list of parameters in the ClientConnectorConfiguration javadoc.

Enabling SSL/TLS for Thin Clients

To enable SSL/TLS for thin client connections, set the sslEnabled property to true and provide an SslContextFactory in the client connector configuration. You can re-use a global SSLContextFactory if you have configured it for communication between nodes, or you can configure one for thin client connection exclusively. This will enable SSL on the cluster side. Then, configure SSL on the client side in a similar fashion. Refer to the specific client documentation for details.

Below is an example configuration that sets SslContextFactory for thin client connection.

<property name="clientConnectorConfiguration">
    <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
        <property name="sslEnabled" value="true"/>
        <property name="useIgniteSslContextFactory" value="false"/>
        <property name="sslContextFactory">
            <bean class="org.apache.ignite.ssl.SslContextFactory">
                <property name="keyStoreFilePath" value="/path/to/server.jks"/>
                <property name="keyStorePassword" value="123456"/>
                <property name="trustStoreFilePath" value="/path/to/trust.jks"/>
                <property name="trustStorePassword" value="123456"/>
            </bean>
        </property>
    </bean>
</property>
IgniteConfiguration igniteCfg = new IgniteConfiguration();

ClientConnectorConfiguration clientCfg = new ClientConnectorConfiguration();
clientCfg.setSslEnabled(true);
clientCfg.setUseIgniteSslContextFactory(false);
SslContextFactory sslContextFactory = new SslContextFactory();
sslContextFactory.setKeyStoreFilePath("/path/to/server.jks");
sslContextFactory.setKeyStorePassword("123456".toCharArray());

sslContextFactory.setTrustStoreFilePath("/path/to/trust.jks");
sslContextFactory.setTrustStorePassword("123456".toCharArray());

clientCfg.setSslContextFactory(sslContextFactory);

igniteCfg.setClientConnectorConfiguration(clientCfg);

If you want to use the global SSLContext, you only need to set the sslEnabled property to true, and ClientConnectorConfiguration will look for the SSLContext configured in IgniteConfiguration:

<property name="clientConnectorConfiguration">
    <bean class="org.apache.ignite.configuration.ClientConnectorConfiguration">
        <property name="sslEnabled" value="true"/>
    </bean>
</property>
ClientConnectorConfiguration clientConnectionCfg = new ClientConnectorConfiguration();
clientConnectionCfg.setSslEnabled(true);