diff --git a/docs/modules/clients/pages/client-overview.adoc b/docs/modules/clients/pages/client-overview.adoc index 3d6db477d..bd15631ad 100644 --- a/docs/modules/clients/pages/client-overview.adoc +++ b/docs/modules/clients/pages/client-overview.adoc @@ -1,80 +1,923 @@ -= Overview -:description: Overview of the main Hazelcast clients and APIs += Client and API overview +:description: Hazelcast provides several clients and APIs to interact with Hazelcast clusters and leverage their distributed computing capabilities. The choice of API depends on your use case and the programming languages you're using in your project. -Hazelcast clients and programming language APIs allow you to extend the benefits of operational in-memory computing to applications in these languages. +{description} -This topic explains how we use these terms and discusses the pros and cons of using clients or APIs. +If you are using Java, you can deploy Hazelcast in two topologies, depending on where you want the Hazelcast members to run: -NOTE: Not all features are available in every client. For an overview of what each client offers, -see the link:https://hazelcast.com/developers/clients/?utm_source=docs-website[clients page]. +* *Embedded mode*: Hazelcast members run in the same Java process as your application. +* *Client/server mode*: Hazelcast members run remotely outside your application, allowing you to manage and scale them independently. -== Use a Client or API? +For non-Java applications, you can only operate in client/server mode. Hazelcast provides several clients for different languages. -Hazelcast provides clients and programming language APIs to interact with Hazelcast clusters and leverage their distributed computing capabilities. The choice between using a client or an API depends on your specific use case, performance requirements, and the programming languages you're using in your project. The following examines the key differences and considerations. +All clients communicate with the cluster using the link:https://github.com/hazelcast/hazelcast-client-protocol[Hazelcast Open Binary Client Protocol]. -NOTE: *Clients* refer to the Hazelcast _libraries_ used to connect to a Hazelcast cluster and exchange data. Clients use a binary protocol for communication with the cluster and encode the data in various formats such as Compact, JSON, etc. Clients are available in various programming languages. -*APIs*, by comparison, are the _interfaces_ with the Hazelcast platform. These do not require the use of specific libraries to connect and are generally text based — for example, the REST interface. +For more information about the topology options, see xref:deploy:choosing-a-deployment-option.adoc[]. -=== Clients +== Clients -Hazelcast clients must be installed locally to communicate with the server. +Hazelcast provides the following clients: -NOTE: For detailed information about the client protocol, see the link:https://github.com/hazelcast/hazelcast-client-protocol[client protocol repository]. - -==== Benefits of using Hazelcast clients +* xref:java.adoc[Java] +* xref:dotnet.adoc[.NET] +* xref:python.adoc[Python] +* xref:cplusplus.adoc[{cpp}] +* xref:go.adoc[Go] +* xref:nodejs.adoc[Node.js] -* Language flexibility: Hazelcast offers clients in multiple programming languages, allowing you to use Hazelcast in various environments. -Clients are available for xref:java.adoc[Java], xref:dotnet.adoc[.NET], xref:python.adoc[Python], xref:cplusplus.adoc[{cpp}], xref:go.adoc[Go], and xref:nodejs.adoc[Node.js] -* Independent scaling: in client/server mode, you can scale the Hazelcast cluster independently from your application. For details, see: xref:deploy:choosing-a-deployment-option.adoc[Choosing an Application Topology]. -* Polyglot applications: client/server mode allows you to write polyglot applications that can all connect to the same cache cluster -* Decoupling application from data: the application and cached data are separated, which can be beneficial for management and security purposes +== Other APIs -==== Disadvantages +Hazelcast also provides the following APIs: -* More complex setup: client/server mode requires setting up and managing a separate Hazelcast cluster, which can be more complex than embedding Hazelcast directly in your application +* xref:clients:memcache.adoc[Memcache] - you can use the Java memcache library and Hazelcast implements the memcache API. +* xref:maintain-cluster:enterprise-rest-api.adoc[REST] -==== Maximum number of client connections per member +=== Client connections -The maximum recommended number of clients per member is 100. -Members use different executors, each with a different thread count, for handling different types of client message tasks: +The maximum number of clients you can connect depends on your environment and workload. Members use different executors, each with a different thread count, for handling different types of client message tasks: -* Query tasks: `core count` threads -* Blocking tasks: `core count * 20` threads -* All other tasks: `core count` threads +* Query tasks: `core count` threads. +* Blocking tasks: `core count * 20` threads. +* All other tasks: `core count` threads. These values, as well as each member's xref:cluster-performance:threading.adoc#io-threading[I/O Thread] counts, need to be taken into consideration when determining the appropriate client connection limits for clusters. -==== Serialization in client/server mode +TIP: Hazelcast offers a xref:clients:java.adoc#configuring-client-near-cache[Near Cache] feature for clients that can reduce latency in client/server mode by storing frequently used data in the client's local memory. + +=== Serialization In xref:deploy:choosing-a-deployment-option.adoc[client/server topologies], you can serialize your data on the client side before sending it to a member. For example, you can serialize data in -Kryo and add it to a map. This option is useful if you plan on using Hazelcast to store your -data in binary. The serialization can be handled on the client-side without the members needing to know how to do so. +Kryo and add it to a map. This is useful if you want to store your +data in binary. The serialization can be handled on the client side without the members needing to know how to do so. For details about why you need to serialize data and the options for doing so, see xref:serialization:serialization.adoc[Serialization]. -=== APIs - -If you do not want to use a client, you can use APIs to configure Hazelcast in embedded mode, where Hazelcast members run in the same Java process as your application. - -APIs are server-side and do not require to be installed. Instead, you simply enable the API on the cluster, and this allows you to be serverless. - -==== Benefits of using APIs - -* Lower latency: for data kept in the embedded member, embedded mode offers faster data access because applications do not need to send requests to the cache cluster over the network -* Simplicity: for Java applications, embedded mode is simpler to set up and use, because you only need to add the Hazelcast JAR to your classpath - -==== Disadvantages - -* Permissions (such as for IMap read/write) cannot be enforced so the embedded member has access to everything -* Limited to Java: embedded mode is only available for Java applications, limiting its use in other programming environments -* Coupled scaling: in embedded mode, the application and the cluster must be scaled together, which may not be ideal for all use cases -* Less flexibility: each instance of your application starts a Hazelcast member, which may lead to unnecessary cluster members if you don't need them. -However, you can avoid this by creating a member only when necessary - -NOTE: Hazelcast offers a xref:clients:java.adoc#configuring-client-near-cache[Near Cache] feature for clients which can reduce latency in client/server mode by storing frequently used data in the client's local memory. - -== Next steps +== Client feature support + +Hazelcast's Java client provides comprehensive support for Hazelcast features. Other clients provide more limited support. The following tables list each client's support for Hazelcast features. + +.Stream processing +[%collapsible] +==== +Applies to Java and Python Jet jobs only. Python Jet jobs can only define a mapping and do not have access to Jet pipelines. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Pipeline API +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|=== +==== + +.Data structures +[%collapsible] +==== +Hazelcast offers distributed implementations of many common data structures. For each of the client languages, Hazelcast mimics the natural interface of the structure as closely as possible. See xref:data-structures:distributed-data-structures.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Map +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Queue +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Set +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|List +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|MultiMap +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Replicated Map +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Ringbuffer +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Topic +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] + +|Reliable Topic +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|Jcache +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Cardinality Estimator +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|=== +==== + +.Concurrency primitives +[%collapsible] +==== +Data structures in the CP subsystem always maintain linearizability and prefer consistency over availability during network partitions. These data structures are CP with respect to the CAP theorem. See xref:cp-subsystem:cp-subsystem.adoc#cp-data-structures[CP data structures]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|CPMap +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] + +|Semaphore +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|Fenced Lock +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|AtomicLong +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|AtomicReference +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|CountDownLatch +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|CRDT PN Counter +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Flake ID Generator +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Distributed processing +[%collapsible] +==== +Distributed processing is the process of running computational tasks on different cluster members. See xref:computing:distributed-computing.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Distributed Executor Service +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Entry Processor +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Transactions +[%collapsible] +==== +You create a `TransactionContext` object to begin, commit and rollback a transaction. You can obtain transaction-aware instances of queues, maps, sets, lists and multimaps via `TransactionContext`, work with them and commit or roll back in one shot. See xref:transactions:creating-a-transaction-interface.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|TxnMap +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|TxnMultiMap +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|TxnQueue +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|TxnList +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|TxnSet +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|=== +==== + +.Query +[%collapsible] +==== +You can use SQL to run optimized distributed queries on the keys and values of maps in a local cluster. See xref:sql:querying-maps-sql.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|SQL +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|SQL Query Re-Submission +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Query (Predicates) +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Paging predicate +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|Partition predicate +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Built-in Predicates +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Continuous Query Caching +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Listener with predicate +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Projections +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Aggregations +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Near Cache +[%collapsible] +==== +Near Cache is highly recommended for data structures that are mostly read. See xref:cluster-performance:near-cache.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Near Cache support +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|HD Memory +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Preload cache from last used +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Eventual Consistency Control +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Configuration +[%collapsible] +==== +You can configure a Hazelcast cluster or client using either static or dynamic configuration. See xref:configuration:understanding-configuration.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Declarative Configuration (XML/JSON/YAML) +|icon:circle-check[size=lg,role=success] (XML/YAML) +|icon:circle-check[size=lg,role=success] (JSON) +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] (Dictionary objects as config) +|icon:circle-check[size=lg,role=success] (JSON objects as config) +|icon:circle-check[size=lg,role=success] (JSON; YAML/TOML via third party libraries) + +|Programmatic Configuration +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Client Configuration Import +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Fail Fast on Invalid Configuration +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Dynamic Configuration +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|=== +==== + +.Security +[%collapsible] +==== +These features allow you to perform security activities, such as intercepting socket connections and remote operations executed by the clients, encrypting the communications between the members at socket level and using SSL socket communication. See xref:security:overview.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|SSL Support +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|XA Transactions +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Mutual Authentication +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Authorization +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Custom Authentication Modules +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|Token-based credentials +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] + +|Kerberos authentication +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|=== +==== + +.Cloud +[%collapsible] +==== +Deploy a Hazelcast cluster in cloud environments including Hazelcast Cloud, Amazon Web Services, Google Cloud Platform, and Azure. See xref:deploy:deploying-in-cloud.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Hazelcast Cloud +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Kubernetes +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|AWS +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Azure +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Google Cloud Platform +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Pivotal Cloud Foundry +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Docker +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Apache jclouds +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Consul +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|etcd +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Eureka +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Heroku +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Zookeeper +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|=== +==== + +.Networking +[%collapsible] +==== +The cluster routing mode specifies how the client connects to the cluster. See xref:clients:java.adoc#client-cluster-routing-modes[Client cluster routing modes]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Routing mode +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Unisocket client +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Smart client +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Event listeners +[%collapsible] +==== +You can register for Hazelcast entry events so you are notified when those events occur. See xref:events:distributed-events.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Lifecycle listener +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Event listeners +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Sub-listener interfaces for map listener +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Monitoring +[%collapsible] +==== +Hazelcast offers an extended set of diagnostics plugins for both Hazelcast members and clients. See xref:maintain-cluster:monitoring.adoc#diagnostics[Diagnostics]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|General statistics +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Near cache statistics +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Runtime statistics +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Operating system statistics +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Diagnostics +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|=== +==== + +.Serialization +[%collapsible] +==== +For data to be sent over a network between cluster members and/or clients, it needs to be serialized into raw bytes. Hazelcast supports several serialization options depending on what you plan on doing with your data. See xref:serialization:serialization.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Compact serialization +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Portable serialization +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|IdentifiedDataSerializable +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|JSON (HazelcastJsonValue) +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|DataSerializable +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] + +|Custom serializers +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Global serializers +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== + +.Client connectivity +[%collapsible] +==== +By default, members allow connections from any Hazelcast client. So, any client with access to a member can connect to the cluster and use its resources. See xref:getting-started:authenticate-client-tutorial.adoc[]. + +[cols="<40%,^10%,^10%,^10%,^10%,^10%,^10%", options="header"] +|=== +|[align=left]*Feature*|[align=center]*Java*|[align=center]*.NET*|[align=center]*C++*|[align=center]*Python*|[align=center]*Node.js*|[align=center]*Go* + +|Connection strategy +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Connection retry +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] + +|Blue/green deployments and disaster recovery +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-xmark[size=lg,role=error] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== +==== For detailed information and code samples for each client, see: @@ -85,8 +928,10 @@ For detailed information and code samples for each client, see: * xref:go.adoc[Go] * xref:nodejs.adoc[Node.js] -For help getting started with the Hazelcast clients, see the client tutorials in xref:clients:hazelcast-clients.adoc[Get started with a Hazelcast Client]. +== Next steps + +* To get started with a Hazelcast client, try a tutorial from xref:clients:hazelcast-clients.adoc[Get started with a Hazelcast Client]. -For details about using Memcache to communicate directly with a Hazelcast cluster, see xref:memcache.adoc[Memcache]. +* For details about using Memcache to communicate directly with a Hazelcast cluster, see xref:memcache.adoc[Memcache]. -For information about using the REST API for simple operations, see: xref:rest.adoc[REST]. +* For information about using the REST API for simple operations, see: xref:rest.adoc[REST]. \ No newline at end of file diff --git a/docs/modules/clients/pages/java.adoc b/docs/modules/clients/pages/java.adoc index b99614c85..6ffdbc012 100644 --- a/docs/modules/clients/pages/java.adoc +++ b/docs/modules/clients/pages/java.adoc @@ -157,7 +157,7 @@ The logic is the same for both member and client side, so see the specific secti == Configure the client === Client cluster routing modes -The cluster routing mode specifies how the client connects to the cluster. It can currently be used only with Java and .NET clients. +The cluster routing mode specifies how the client connects to the cluster. NOTE: In previous releases, this functionality was known as the client operation mode and could be configured as smart or unisocket. If the cluster routing mode is not configured in your client, the configured client operation mode is used. diff --git a/docs/modules/deploy/pages/choosing-a-deployment-option.adoc b/docs/modules/deploy/pages/choosing-a-deployment-option.adoc index 1735f80fc..12e29fe54 100644 --- a/docs/modules/deploy/pages/choosing-a-deployment-option.adoc +++ b/docs/modules/deploy/pages/choosing-a-deployment-option.adoc @@ -1,78 +1,53 @@ -= Choosing an Application Topology -:description: Hazelcast offers two topologies to use Hazelcast: embedded in a Java application or in a client/server topology. To help you choose a topology that meets your requirements, this topic describes each option. += Choose an application topology +:description: Hazelcast offers two topologies: embedded in a Java application or client/server. :page-aliases: ROOT:topologies.adoc :url-cloud-signup: https://cloud.hazelcast.com/sign-in?utm_source=docs-website You can deploy Hazelcast in two topologies, depending on where you want the Hazelcast members to run: -- *Embedded mode:* Hazelcast members run in the same Java process as your application. -- *Client/server mode:* Hazelcast members run remotely outside your application, allowing you to scale them independently and connect to them through any of the supported clients. +* *Embedded mode*: Hazelcast members run in the same Java process as your application. +* *Client/server mode*: Hazelcast members run remotely outside your application, allowing you to manage and scale them independently. You can connect to them through any of the xref:clients:client-overview.adoc[supported clients]. TIP: If you don't want to deploy your own self-managed cluster, try link:{url-cloud-signup}[Hazelcast {hazelcast-cloud}]. -== Comparing Topologies +== Embedded mode -This table compares embedded mode and client/server mode in terms of latency, scalability, and available programming languages. +Hazelcast is written in Java, which means you can integrate it as a library in your Java application. This topology is called _embedded_ mode. -[cols="h,a,a"] -.Comparison of Hazelcast Topologies -|=== -| |Embedded|Client/Server +All you need to do is add the Hazelcast JAR file to your application's classpath and start a member with the Java API. All the benefits of Hazelcast are then available inside the application. -|Low-latency -|Yes -|If used with xref:clients:java.adoc#configuring-client-near-cache[Near Cache] to store frequently used data in the client's local memory. +// image::ROOT:single-embedded.svg[A single Hazelcast member is embedded in a Java application,200] -|Scalability -|The application and the cluster must be scaled together -|You can scale the cluster independently of your application +In this mode, each instance of your application starts a Hazelcast member, and members automatically form a cluster. To interact with the cluster, you use a local member in your application. -|Supported clients -| Java -| -[.tablelist] -include::ROOT:partial$clients.adoc[] +// image::ROOT:multi-embedded.svg[A cluster of Hazelcast members are embedded in Java applications,600] -|=== +The main advantage of embedded mode is that all your Java classes are visible to Hazelcast. This way, you don't need to add classes to your members for tasks such as entry processing or submitting jobs. You may also experience lower latency, although passing data between separate members is still subject to network latency. -== Embedded Mode - -Hazelcast is written in Java, which means that Java developers can integrate, or embed, it as a library in their applications. This topology is called _embedded_ mode. - -All you need to do is add the Hazelcast JAR file to the application’s classpath and start a member with the Java API. Then all the benefits of Hazelcast are available right inside the application. - -image::ROOT:single-embedded.svg[A single Hazelcast member is embedded in a Java application,200] - -In this mode, each instance of your application -starts a Hazelcast member, and all members automatically form their own cluster. To interact with the cluster, you use a local member in your application. - -image::ROOT:multi-embedded.svg[A cluster of Hazelcast members are embedded in Java applications,600] - -If you are a Java developer working in an IDE, this is a convenient -way to run a cluster on your development machine. There is nothing -stopping you from starting your program several times to get a -cluster on the same physical machine. +xref:getting-started:get-started-java.adoc[Get started with Hazelcast embedded]. -The main advantage of embedded mode is that all your Java -classes are visible to Hazelcast. This way, you don't need to add classes to your members for tasks such as entry processing or submitting jobs. +== Client/server mode -xref:getting-started:get-started-java.adoc[Get started with Hazelcast embedded]. +In client/server mode, the Hazelcast members are independent of your application, which means that they can be scaled independently. To interact with the cluster, you use one of the available clients. -== Client/Server Mode +// image::ROOT:client-server-pc-mobile.svg[Client/Server Mode,600] -In client/server mode, the Hazelcast cluster is independent of your application, which means that they can be independently scaled. -To interact with the cluster, you use one of the available clients. +Hazelcast provides the following clients: -image::ROOT:client-server-pc-mobile.svg[Client/Server Mode,600] +* xref:clients:java.adoc[Java] +* xref:clients:dotnet.adoc[.NET] +* xref:clients:python.adoc[Python] +* xref:clients:cplusplus.adoc[{cpp}] +* xref:clients:go.adoc[Go] +* xref:clients:nodejs.adoc[Node.js] -Client/server mode has advantages, including more predictable and reliable -performance, easier identification of problem causes and, most importantly, better scalability. +Client/server mode provides more predictable and reliable +performance, easier identification of problem causes and better scalability. When you need to scale in this mode, just add more Hazelcast members. You -can address client and server scalability concerns separately. +can address client and server scalability separately. Client/server mode also provides higher availability. If there are any issues in running either -your application or Hazelcast members, the issue and any potential failure is isolated from the rest -of the application and members. +your application or Hazelcast members, the issue and any potential failure is isolated from the rest of the application and members. Get started with client/server: