<!--
 ▄▄▄       ██▓███   ▄▄▄       ▄████▄   ██░ ██ ▓█████     ██▓  ▄████  ███▄    █  ██▓▄▄▄█████▓▓█████
▒████▄    ▓██░  ██▒▒████▄    ▒██▀ ▀█  ▓██░ ██▒▓█   ▀    ▓██▒ ██▒ ▀█▒ ██ ▀█   █ ▓██▒▓  ██▒ ▓▒▓█   ▀
▒██  ▀█▄  ▓██░ ██▓▒▒██  ▀█▄  ▒▓█    ▄ ▒██▀▀██░▒███      ▒██▒▒██░▄▄▄░▓██  ▀█ ██▒▒██▒▒ ▓██░ ▒░▒███
░██▄▄▄▄██ ▒██▄█▓▒ ▒░██▄▄▄▄██ ▒▓▓▄ ▄██▒░▓█ ░██ ▒▓█  ▄    ░██░░▓█  ██▓▓██▒  ▐▌██▒░██░░ ▓██▓ ░ ▒▓█  ▄
 ▓█   ▓██▒▒██▒ ░  ░ ▓█   ▓██▒▒ ▓███▀ ░░▓█▒░██▓░▒████▒   ░██░░▒▓███▀▒▒██░   ▓██░░██░  ▒██▒ ░ ░▒████▒
 ▒▒   ▓▒█░▒▓▒░ ░  ░ ▒▒   ▓▒█░░ ░▒ ▒  ░ ▒ ░░▒░▒░░ ▒░ ░   ░▓   ░▒   ▒ ░ ▒░   ▒ ▒ ░▓    ▒ ░░   ░░ ▒░ ░
  ▒   ▒▒ ░░▒ ░       ▒   ▒▒ ░  ░  ▒    ▒ ░▒░ ░ ░ ░  ░    ▒ ░  ░   ░ ░ ░░   ░ ▒░ ▒ ░    ░     ░ ░  ░
  ░   ▒   ░░         ░   ▒   ░         ░  ░░ ░   ░       ▒ ░░ ░   ░    ░   ░ ░  ▒ ░  ░         ░
      ░  ░               ░  ░░ ░       ░  ░  ░   ░  ░    ░        ░          ░  ░              ░  ░
-->

<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="0" />
    <title>Apache Ignite - Features</title>
    <link media="all" rel="stylesheet" href="css/all.css">
    <link href="//netdna.bootstrapcdn.com/font-awesome/4.3.0/css/font-awesome.css" rel="stylesheet">
    <link href="https://netdna.bootstrapcdn.com/font-awesome/4.2.0/css/font-awesome.css" rel="stylesheet">
    <link href='https://fonts.googleapis.com/css?family=Open+Sans:400,300,300italic,400italic,600,600italic,700,700italic,800,800italic' rel='stylesheet' type='text/css'>

    <!--#include virtual="/includes/sh.html" -->
</head>
<body>
<div id="wrapper">
    <!--#include virtual="/includes/header.html" -->

    <main id="main" role="main" class="container key-features">
        <section id="features">
            <h2>Key In-Memory Fabric Features</h2>
            <p align="center">
                Apache Ignite In-Memory Data Fabric is a high-performance,
                integrated and distributed in-memory platform for computing
                and transacting on large-scale data sets in real-time, orders
                of magnitude faster than possible with traditional disk-based
                or flash technologies.
            </p>

            <!--#include virtual="/includes/igniteimage.html" -->
        </section>

        <section id="datagrid" class="feature-section">
            <h2>Data Grid</h2>
            <p>
                Ignite In-Memory Data Fabric stores their data in-memory as opposed to traditional
                Database Management Systems that utilize disk as their primary storage mechanism.
                By utilizing system memory rather than disk, Ignite In-Memory Data Fabric is orders
                of magnitude faster than traditional DBMS systems.
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Distributed In-Memory Caching (JCache JSR-107 compliant)</li>
                        <li>Lightning Fast Performance</li>
                        <li>Elastic Scalability</li>
                        <li>Distributed In-Memory Transactions</li>
                        <li>Distributed SQL Queries (SQL-99 compliant)</li>
                        <li>JDBC Driver</li>
                        <li>Distributed In-Memory Queue and Other Data Structures</li>
                        <li>Tiered Off-Heap Storage</li>
                        <li>Web Session Clustering</li>
                        <li>Hibernate L2 Cache Integration</li>
                        <li>Memcached-compliant for access from different languages</li>
                        <li>REST APIs for HTTP-based access</li>
                    </ul>
                </div>
                <div class="feature-right">
                    <img src="images/in_memory_data.png" width="400px"/>
                </div>
            </div>
            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="datagrid-examples" class="nav nav-tabs">
                    <li class="active"><a href="#datagrid-example-basic" role="tab" data-toggle="tab">Put and Get</a></li>
                    <li><a href="#datagrid-example-transactions" role="tab" data-toggle="tab">Transactions</a></li>
                    <li><a href="#datagrid-example-locks" role="tab" data-toggle="tab">Locks</a></li>
                    <li><a href="#datagrid-example-sqlquery" role="tab" data-toggle="tab">SQL Query</a></li>
                    <li><a href="#datagrid-example-sqljoin" role="tab" data-toggle="tab">SQL Join</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div role="tabpanel" class="tab-pane active" id="datagrid-example-basic">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                             // Get an instance of named cache.
                            final IgniteCache&lt;Integer, String&gt; cache = ignite.cache("cacheName");

                            // Store keys in cache.
                            for (int i = 0; i < 10; i++)
                                cache.put(i, Integer.toString(i));

                            // Retrieve values from cache.
                            for (int i = 0; i < 10; i++)
                                System.out.println("Got [key=" + i + ", val=" + cache.get(i) + ']');

                            // Remove objects from cache.
                            for (int i = 0; i < 10; i++)
                                cache.remove(i);

                            // Atomic put-if-absent.
                            cache.putIfAbsent(1, "1");

                           // Atomic replace.
                           cache.replace(1, "1", "2");
                        </pre>
                    </div>
                    <div role="tabpanel" class="tab-pane" id="datagrid-example-transactions">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            // Clone every object we get from cache, so we can freely update it.
                            IgniteCache&lt;Integer, Account&gt; cache = ignite.cache("cacheName");

                            try (IgniteTx tx = Ignition.ignite().transactions().txStart()) {
                                Account acct = cache.get(acctId);

                                assert acct != null;

                                // Deposit $20 into account.
                                acct.setBalance(acct.getBalance() + 20);

                                // Store updated account in cache.
                                cache.put(acctId, acct);

                                tx.commit();
                            }
                        </pre>
                    </div>
                    <div role="tabpanel" class="tab-pane" id="datagrid-example-locks">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                             // Get an instance of named cache.
                            final GridCache&lt;String, Integer&gt; cache = ignite.cache("cacheName");

                            // Lock cache key "Hello".
                            Lock lock = cache.lock("Hello");

                            lock.lock();

                            try {
                                cache.put("Hello", 11);
                                cache.put("World", 22);
                            }
                            finally {
                                lock.unlock();
                            }
                        </pre>
                    </div>
                    <div role="tabpanel" class="tab-pane" id="datagrid-example-sqlquery">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            // Get an instance of named cache.
                            GridCache&lt;Long, Person&gt; cache = ignite.cache("cacheName");

                            // Create query which selects salaries based on range.
                            CacheQuery&lt;Map.Entry&lt;Long, Person&gt;&gt; qry =
                                cache.queries().createSqlQuery(Person.class, "salary > ? and salary <= ?");

                            // Execute queries for salary ranges.
                            print("People with salaries between 0 and 1000: ", qry.execute(0, 1000).get());

                            print("People with salaries between 1000 and 2000: ", qry.execute(1000, 2000).get());
                        </pre>
                    </div>
                    <div role="tabpanel" class="tab-pane" id="datagrid-example-sqljoin">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                             // Get an instance of named cache.
                            GridCache&lt;Long, Person&gt; cache = ignite.cache("cacheName");

                            // Create query which joins on 2 types to select people for a specific organization.
                            CacheQuery&lt;Map.Entry&lt;Long, Person&gt;&gt; qry =
                                cache.queries().createSqlQuery(Person.class, "from Person, Organization " +
                                    "where Person.orgId = Organization.id " +
                                    "and Organization.name = ?");

                            // Execute queries for find employees for different organizations.
                            print("Following people are 'Ignite' employees: ", qry.execute("Ignite").get());

                            print("Following people are 'Other' employees: ", qry.execute("Other").get());
                        </pre>
                    </div>
                </div>
            </div>

            <div class="videos">
                <div class="video-heading">Videos:</div>
                <ul>
                    <li>
                        <i class="fa fa-lg fa-play-circle-o"></i>
                        <span class="video-title">
                            <a target="youtube" href="https://www.youtube.com/watch?v=eZUujozYt-g">Distributed SQL Queries</a>
                        </span>
                        <span class="video-duration">03:27</span>
                    </li>
                    <li>
                        <i class="fa fa-lg fa-play-circle-o"></i>
                        <span class="video-title">
                            <a target="youtube" href="https://www.youtube.com/watch?v=pFbDWpOiMOU">Getting Started with Data Grid</a>
                        </span>
                        <span class="video-duration">03:49</span>
                    </li>
                </ul>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/data-grid">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="computegrid" class="feature-section">
            <h2>Compute Grid</h2>
            <p>
                Compute Grid provides the means for parallel processing of CPU
                or otherwise resource intensive tasks including traditional High Performance Computing (HPC) and Massively Parallel Processing (MPP).
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Dynamic Clustering</li>
                        <li>Fork-Join & MapReduce Processing</li>
                        <li>Distributed Closure Execution</li>
                        <li>Adaptive Load Balancing</li>
                        <li>Automatic Fault Tolerance</li>
                        <li>Linear Scalability</li>
                        <li>Custom Scheduling</li>
                        <li>Checkpointing for Long Running Jobs</li>
                        <li>ExecutorService</li>
                    </ul>
                </div>
                <div class="feature-right">
                    <img src="images/in_memory_compute.png" width="400px"/>
                </div>
            </div>
            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="compute-examples" class="nav nav-tabs">
                    <li class="active"><a href="#compute-example-broadcast" aria-controls="home" data-toggle="tab">Broadcast</a></li>
                    <li><a href="#compute-example-countchars" aria-controls="profile" data-toggle="tab">Count Characters with Callable</a></li>
                    <li><a href="#compute-example-closure" aria-controls="profile" data-toggle="tab">Count Characters with Closure</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div class="tab-pane active" id="compute-example-broadcast">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            // Print out hello message on all cluster nodes.
                            ignite.compute().broadcast(() -> "Hello Node!");
                        </pre>
                    </div>
                    <div class="tab-pane" id="compute-example-countchars">
                        <pre class="brush:java">
                            Collection&lt;IgniteCallable&lt;Integer&gt;&gt; calls = new ArrayList&lt;&gt;();
                             
                            // Iterate through all words in the sentence and create callable jobs.
                            for (String word : "How Many Characters".split(" "))
                                calls.add(word::length);

                            // Execute collection of callables on the Ignite cluster.
                            Collection&lt;Integer&gt; res = ignite.compute().call(calls);

                            // Add all the word lengths received from cluster nodes.
                            int total = res.stream().mapToInt(Integer::intValue).sum(); 
                        </pre>
                    </div>
                    <div class="tab-pane" id="compute-example-closure">
                        <pre class="brush:java">
                            IgniteCompute compute  = ignite.compute();

                            // Execute closure on all cluster nodes.
                            Collection&lt;Integer&gt; res = ignite.compute().apply(
                                String::length,
                                Arrays.asList("How Many Characters".split(" "))
                            );
                                 
                            // Add all the word lengths received from cluster nodes.
                            int total = res.stream().mapToInt(Integer::intValue).sum(); 
                        </pre>
                    </div>
                </div>
            </div>

            <div class="videos">
                <div class="video-heading">Videos:</div>
                <ul>
                    <li>
                        <i class="fa fa-lg fa-play-circle-o"></i>
                        <span class="video-title">
                            <a target="youtube" href="https://www.youtube.com/watch?v=J775J77_-B8">Getting Started with Copmute Grid</a>
                        </span>
                        <span class="video-duration">03:50</span>
                    </li>
                </ul>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/compute-grid">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="servicegrid" class="feature-section">
            <h2>Service Grid</h2>
            <p>
                Ignite Service Grid allows you to have complete control over services being deployed on the
                cluster. It allows you to control how many instances of your service should be deployed on each cluster
                node, ensuring proper deployment and fault tolerance. Service Grid guarantees continuous availability
                of all deployed services in case of node failures. <br/><br/>
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Automatically Deploy Multiple Instances of a Service</li>
                        <li>Automatically Deploy a Service as Singleton</li>
                        <li>Automatically Deploy Services on Node Start-Up</li>
                        <li>Fault Tolerant Deployment</li>
                        <li>Un-Deploy Any of the Deployed Services</li>
                        <li>Get Service Deployment Topology Information</li>
                        <li>Access Remotely Deployed Service via Service Proxy</li>
                    </ul>
                </div>
                <div class="feature-right">
                    <img src="images/ignite_service.png" width="400px"/>
                </div>
            </div>

            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="service-examples" class="nav nav-tabs">
                    <li class="active"><a href="#service-example" aria-controls="home" data-toggle="tab">Service Deployment</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div class="tab-pane active" id="service-example">
                        <br/>
                        <p>
                            An example of how a distributed service may be implemented

                        </p>
                        <pre class="brush:java">
                            // Simple service implementation.
                            public class MyIgniteService implements Service {
                                // Example of ignite resource injection. All resources are optional.
                                // You should inject resources only as needed.
                                @IgniteInstanceResource
                                private Ignite ignite;
                                ...

                                @Override public void cancel(ServiceContext ctx) {
                                    // No-op.
                                }

                                @Override public void execute(ServiceContext ctx) {
                                    // Loop until service is cancelled.
                                    while (!ctx.isCancelled()) {
                                        // Do something.
                                        ...
                                    }
                                }
                            }
                        </pre>
                        <br/>
                        <p>
                            and deployed.
                        </p>
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            ...

                            IgniteServices svcs = ignite.services();

                            IgniteFuture&lt;?&gt; fut = svcs.deployClusterSingleton("myClusterSingleton", new MyIgniteService());

                            // Wait for deployment to complete.
                            fut.get();
                        </pre>
                    </div>
                </div>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/service-grid">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="datastreaming" class="feature-section">
            <h2>Streaming</h2>
            <p>
                Streaming support allows to query into sliding windows of coming data, and enable users to answer such questions as “What are the 10 most popular products over last 2 hours?”, or “What is the average product price in a certain category for the past day?”.<br/><br/>
            </p>

            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Programmatic Querying</li>
                        <li>Customizable Event Workflow</li>
                        <li>At-Least-Once Guarantee</li>
                        <li>Sliding Windows</li>
                        <li>Data Indexing</li>
                        <li>Distributed Streamer Queries</li>
                        <li>Co-Location With In-Memory Data Grid</li>
                    </ul>
                </div>
                <div class="feature-right">
                    <img src="images/in_memory_streaming.png" width="400px"/>
                </div>
            </div>

            <div class="code-examples">&nbsp;</div>
            
            <div class="feature-links">
                <!--<a target=wiki href="#">Learn More <i class="fa fa-angle-double-right"></i></a>-->
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="clustering" class="feature-section">
            <h2>Advanced Clustering</h2>
            <p>
                Ignite In-Memory Data Fabric provides one of the most sophisticated clustering technologies on Java Virtual Machine (JVM). Ignite nodes can automatically discover each other. This helps to scale the cluster when needed, without having to restart the whole cluster.Developers can also leverage from Ignite’s hybrid cloud support that allows establishing connection between private cloud and public clouds such as Amazon Web Services, providing them with best of both worlds. <br/><br/>
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Dynamic Topology Management</li>
                        <li>Guaranteed Cluster Member Discovery</li>
                        <li>Public and Private Clouds</li>
                        <li>Automatic AWS Discovery</li>
                        <li>Virtual Cluster Groups</li>
                        <li>Zero Deployment</li>
                        <li>Per-Node Shared State</li>
                        <li>Real Time Cluster Monitoring and Metrics</li>
                    </ul>
                </div>
                <div class="feature-right">
                    <img src="images/ignite_cluster.png" width="400px"/>
                </div>
            </div>

            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="clustering-examples" class="nav nav-tabs">
                    <li class="active"><a href="#clustering-example-remotes" aria-controls="home" data-toggle="tab">Remote Cluster Group</a></li>
                    <li><a href="#clustering-example-random" aria-controls="profile" data-toggle="tab">Random Cluster Group</a></li>
                    <li><a href="#clustering-example-custom" aria-controls="profile" data-toggle="tab">Custom Cluster Group</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div class="tab-pane active" id="clustering-example-broadcast">
                        <pre class="brush:java">
                            final Ignite ignite = Ignition.ignite();

                            IgniteCluster cluster = ignite.cluster();

                            // Cluster group containing all remote nodes, i.e. not this node.
                            ClusterGroup remotes = cluster.forRemotes();

                            // Get compute instance which will only execute over remote nodes.
                            IgniteCompute compute = ignite.compute(remotes);

                            // Broadcast to all remote nodes and print the ID of the node 
                            // on which this closure is executing.
                            compute.broadcast(() -> System.out.println("Hello Node: " + cluster.localNode().id());
                        </pre>
                    </div>

                    <div class="tab-pane" id="clustering-example-random">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            IgniteCluster cluster = ignite.cluster();

                            // Cluster group containing random remote node.
                            ClusterGroup random = cluster.forRemotes().forRandom();

                            // Get compute instance over a random remote node.
                            IgniteCompute compute = ignite.compute(random);

                            // Send closure to the random node and print its ID.
                            compute.run(() -> System.out.println("Hello Node: " + cluster.localNode().id());
                        </pre>
                    </div>

                    <div class="tab-pane" id="clustering-example-custom">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            IgniteCluster cluster = ignite.cluster();

                            // Dynamic cluster group over nodes loaded less than 50%.
                            ClusterGroup cpuNodes = cluster.forPredicate(node -> node.metrics().getCurrentCpuLoad() < 0.5);

                            // Get compute instance over nodes loaded less than 50%.
                            IgniteCompute compute = ignite.compute(cpuNodes);

                            // Send closure to one of the CPU nodes.
                            compute.run(() -> System.out.println("Hello Node: " + cluster.localNode().id());
                        </pre>
                    </div>
                </div>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/cluster">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="messaging" class="feature-section">
            <h2>Distributed Messaging</h2>
            <p>
                Apache Ignite provides high-performance cluster-wide messaging functionality to exchange data via
                publish-subscribe and direct point-to-point communication models.
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Support for Topic-Based Publish-Subscribe Model</li>
                        <li>Support for Direct Point-to-Point Communication</li>
                        <li>Pluggable Communication Transport Layer</li>
                        <li>Support for Message Ordering</li>
                        <li>Cluster-Aware Message Listener Auto-Deployment </li>
                    </ul>
                </div>
            </div>

            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="messaging-examples" class="nav nav-tabs">
                    <li class="active"><a href="#messaging-example-ordered" aria-controls="home" data-toggle="tab">Ordered Messaging</a></li>
                    <li><a href="#messaging-example-unordered" aria-controls="profile" data-toggle="tab">Unordered Messaging</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div class="tab-pane active" id="messaging-example-ordered">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forRemotes());

                            // Add listener for unordered messages on all remote nodes.
                            rmtMsg.remoteListen("MyOrderedTopic", (nodeId, msg) -> {
                                System.out.println("Received ordered message [msg=" + msg + ", from=" + nodeId + ']');

                                return true; // Return true to continue listening.
                            });

                            // Send ordered messages to remote nodes.
                            for (int i = 0; i < 10; i++)
                                rmtMsg.sendOrdered("MyOrderedTopic", Integer.toString(i));
                        </pre>                            
                    </div>
                    <div class="tab-pane" id="messaging-example-unordered">
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            IgniteMessaging rmtMsg = ignite.message(ignite.cluster().forRemotes());

                            // Add listener for unordered messages on all remote nodes.
                            rmtMsg.remoteListen("MyUnOrderedTopic", (nodeId, msg) -> {
                                System.out.println("Received unordered message [msg=" + msg + ", from=" + nodeId + ']');

                                return true; // Return true to continue listening.
                            });

                            // Send unordered messages to remote nodes.
                            for (int i = 0; i < 10; i++)
                                rmtMsg.send("MyUnOrderedTopic", Integer.toString(i));
                        </pre>
                    </div>
                </div>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/messaging">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="events" class="feature-section">
            <h2>Distributed Events</h2>
            <p>
                Distributed events functionality allows applications to receive notifications about cache events occurring in distributed grid environment. Developers can use this functionality to get notified about remote tasks executions or any cache data changes within the cluster. Event notifications can be grouped together and sent in batches and/or timely intervals to reduce network traffic.
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Subscribe Local and Remote Listeners</li>
                        <li>Enable and Disable any Event</li>
                        <li>Provide Local and Remote Event Filters</li>
                        <li>Group Event Notifications into Batches</li>
                    </ul>
                </div>
            </div>

            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="events-examples" class="nav nav-tabs">
                    <li class="active"><a href="#events-example-cache" aria-controls="home" data-toggle="tab">Cache Events</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div class="tab-pane active" id="events-example-cache">
                        <br/>
                        <p>
                            Subscribe to remote notifications for cache data updates.
                        </p>
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            // Sample remote filter which only accepts events for keys
                            // that are greater than or equal to 10.
                            IgnitePredicate&lt;CacheEvent&gt; rmtLsnr = evt -&gt; evt.key() >= 10;

                            // Subscribe to specified cache events on all nodes that have cache running.
                            ignite.events(ignite.cluster().forCacheNodes("cacheName")).remoteListen(null, rmtLsnr,
                                EventType.EVT_CACHE_OBJECT_PUT, 
                                EventType.EVT_CACHE_OBJECT_READ, 
                                EventType.EVT_CACHE_OBJECT_REMOVED);

                            // Get an instance of named cache.
                            final IgniteCache&lt;Integer, String&gt; cache = ignite.jcache("cacheName");

                            // Generate cache events.
                            for (int i = 0; i &lt; 20; i++)
                                cache.put(i, Integer.toString(i));
                        </pre>
                    </div>
                </div>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/events">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="datastructures" class="feature-section">
            <h2>Distributed Data Structures</h2>
            <p>
                Ignite allows for most of the data structures from java.util.concurrent framework to be used
                in a distributed fashion. For example, you can take java.util.concurrent.BlockingDeque and add something
                to it on one node and poll it from another node. Or have a distributed Primary Key generator,
                which would guarantee uniqueness on all nodes.
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>Concurrent Map</li>
                        <li>Distributed Queues and Sets</li>
                        <li>AtomicLong</li>
                        <li>AtomicSequence</li>
                        <li>AtomicReference</li>
                        <li>CountDownLatch</li>
                        <li>ExecutorService</li>
                    </ul>
                </div>
            </div>

            <div class="code-examples">
                <div class="examples-heading">Examples:</div>
                <!-- Nav tabs -->
                <ul id="datastructures-examples" class="nav nav-tabs">
                    <li class="active"><a href="#datastructures-example-queue" aria-controls="home" data-toggle="tab">Queue</a></li>
                    <li><a href="#datastructures-example-set" aria-controls="profile" data-toggle="tab">Set</a></li>
                    <li><a href="#datastructures-example-sequence" aria-controls="profile" data-toggle="tab">Atomic Sequence</a></li>
                </ul>

                <!-- Tab panes -->
                <div class="tab-content">
                    <div class="tab-pane active" id="datastructures-example-queue">
                        <br/>
                        <p>
                            Distributed Queue example.
                        </p>
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            CollectionConfiguration colCfg = new CollectionConfiguration();

                            colCfg.setCacheName("cacheName");

                            // Non-colocated queue which will be distributed
                            // across all data nodes.
                            IgniteQueue&lt;String&gt; queue = ignite.queue("queueName", 20, colCfg);

                            // Add queue elements.
                            for (int i = 0; i < 20; i++)
                                queue.add("Value " + Integer.toString(i));

                            // Poll queue elements.
                            for (int i = 0; i < 20; i++)
                                System.out.println("Polled value: " + queue.poll());

                        </pre>
                    </div>
                    <div class="tab-pane" id="datastructures-example-set">
                        <br/>
                        <p>
                            Distributed Set example.
                        </p>
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            // Initialize new set.
                            IgniteSet&lt;String&gt; set = ignite.set("setName", null);

                            // Add set elements.
                            for (int i = 0; i < 10; i++)
                                set.add(Integer.toString(i));

                            // Iterate over set.
                            for (String item : set)
                                System.out.println("Set item: " + item);
                        </pre>
                    </div>
                    <div class="tab-pane" id="datastructures-example-sequence">
                        <br/>
                        <p>
                            Distributed AtomicSequence example.
                        </p>
                        <pre class="brush:java">
                            Ignite ignite = Ignition.ignite();

                            // Initialize atomic sequence.
                            IgniteAtomicSequence seq = ignite.atomicSequence("seqName", 0, true);

                            for (int i = 0; i < 100; i++)
                                System.out.println("Next sequence value: " + seq.incrementAndGet());
                        </pre>
                    </div>
                </div>
            </div>

            <div class="feature-links">
                <a target=wiki href="http://apacheignite.readme.io/v1.0/docs/queue-and-set">Learn More <i class="fa fa-angle-double-right"></i></a>
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="filesystem" class="feature-section">
            <h2>Distributed File System</h2>
            <p>
                One of the unique capabilities of Ignite is a file system interface to its in-memory data called Ignite File System (IGFS). IGFS delivers similar functionality to Hadoop HDFS, but only in memory. In fact, IGFS is at the core of Ignite’s In-Memory Hadoop Accelerator. <br/><br/>
                The data from each file is split on separate data blocks and stored in cache.
                Developers can access each file’s data with a standard Java streaming API. Moreover, for each part of the file a developer can calculate an affinity and process the file’s content on corresponding nodes to avoid unnecessary networking.
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>In-Memory File System</li>
                        <li>List Directories</li>
                        <li>Get Information for a Single Path</li>
                        <li>Create/Move/Delete Files or Directories</li>
                        <li>Write/Read Data Streams into/from Files</li>
                    </ul>
                </div>
            </div>

            <div class="code-examples">&nbsp;</div>

            <div class="feature-links">
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>

        <section id="hadoop" class="feature-section">
            <h2>Hadoop Acceleration</h2>
            <p>
                Hadoop Accelerator enhances existing Hadoop technology to enable fast data processing using the tools and technology your organization is already using today.<br/><br/>
                Ignite’s in-memory accelerator for Hadoop is based on the dual-mode,
                high-performance in-memory file system that is 100% compatible with Hadoop HDFS, and an in-memory optimized MapReduce implementation. In-memory HDFS and in-memory MapReduce provide easy to use extensions to disk-based HDFS and traditional MapReduce, delivering up to 100x faster performance.
            </p>
            <div class="feature-box">
                <div class="feature-left">
                    <div class="features-heading">Features:</div>
                    <ul class="features-list">
                        <li>100x Faster Performance</li>
                        <li>In-Memory MapReduce</li>
                        <li>Highly Optimized In-Memory Processing</li>
                        <li>Standalone File System</li>
                        <li>Optional Caching Layer for HDFS</li>
                        <li>Read-Through and Write-Through with HDFS</li>
                    </ul>
                </div>
                <div class="feature-right">
                    <img src="images/hadoop_sequence.png" width="400px"/>
                </div>
            </div>

            <div class="code-examples">&nbsp;</div>
            
            <div class="feature-links">
                <!--<a target=wiki href="#">Learn More <i class="fa fa-angle-double-right"></i></a>-->
                <a href="#features">Top <i class="fa fa-angle-double-up"></i></a>
            </div>
        </section>
    </main>

    <!--#include virtual="/includes/footer.html" -->
</div>
<!--#include virtual="/includes/scripts.html" -->
</body>
</html>
