diff --git a/docs/modules/ROOT/nav.adoc b/docs/modules/ROOT/nav.adoc index 59a04711d..405fddc5e 100644 --- a/docs/modules/ROOT/nav.adoc +++ b/docs/modules/ROOT/nav.adoc @@ -506,6 +506,7 @@ .Clients and APIs * xref:clients:client-overview.adoc[Overview] +** xref:clients:client-feature-comparison.adoc[] ** xref:clients:client-protocol.adoc[] * Clients ** xref:clients:java.adoc[] diff --git a/docs/modules/clients/pages/client-feature-comparison.adoc b/docs/modules/clients/pages/client-feature-comparison.adoc new file mode 100644 index 000000000..29981df38 --- /dev/null +++ b/docs/modules/clients/pages/client-feature-comparison.adoc @@ -0,0 +1,986 @@ += Client features +:description: Not all features are available in every client. The following tables provide an at-a-glance overview of what each client offers, and detailed lists of specific features. + +{description} + +NOTE: Key to symbols: icon:circle-check[size=lg,role=success] -- supported; icon:circle-xmark[size=lg,role=error] -- not supported; icon:circle-half-stroke[size=lg,role=warning] -- partially supported + +== Client features at a glance + +[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* + +|Stream processing +|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 +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Concurrency primitives +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] + +|Distributed processing +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Transactions +|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 +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Near Cache +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Configuration +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Security +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Cloud +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Networking +|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] + +|Monitoring +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Serialization +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] + +|Client connectivity +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-half-stroke[size=lg,role=warning] +|icon:circle-check[size=lg,role=success] +|icon:circle-check[size=lg,role=success] +|=== + +== Specific features + +Expand the features below to see if it is supported for a client. + +.Stream processing +[%collapsible] +==== +Applies to Java and Python Jet jobs only + +[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 as closely as possible the natural interface of the structure. xref:data-structures:distributed-data-structures.adoc[Learn more]. + +[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. xref:cp-subsystem:cp-subsystem.adoc#cp-data-structures[Learn more]. + +[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* + +|Semaphore +|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-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-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-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 computing is the process of running computational tasks on different cluster members. xref:computing:distributed-computing.adoc[Learn more]. + +[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/rollback in one shot. xref:transactions:creating-a-transaction-interface.adoc[Learn more]. + +[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. xref:sql:querying-maps-sql.adoc[Learn more]. + +[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-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] + +|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. xref:cluster-performance:near-cache.adoc[Learn more]. + +[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. xref:configuration:understanding-configuration.adoc[Learn more]. + +[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) + +|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. xref:security:overview.adoc[Learn more]. + +[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 Viridian Managed Services, Amazon AWS, Google Cloud Platform, and Azure. xref:deploy:deploying-in-cloud.adoc[Learn more]. + +[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] +==== + +[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* + +|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. xref:events:distributed-events.adoc[Learn more]. + +[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. xref:maintain-cluster:monitoring.adoc#diagnostics[Learn more]. + +[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* + +|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] + +|Client-side statistics +|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] + +|Client Near Cache stats +|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] + +|Client runtime stats +|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] + +|Client operating systems stats +|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] +|=== +==== + +.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 has many serialization options to choose from, depending on what you plan on doing with your data. xref:serialization:serialization.adoc[Learn more]. + +[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. xref:getting-started:authenticate-client-tutorial.adoc[Learn more]. + +[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] +|=== +==== + + + + +