Der Zugriff auf das Apache Ignite-Grid kann über verschiedene Protokolle erfolgen. Dazu werden Treiber-Bibliotheken für verschiedene Programmiersprachen angeboten. Daneben ist auch ein REST-API vorgesehen.
Nachdem Ignite selbst in Java realisiert ist bietet es sich an, auch für Client-Anwendungen die Java-Plattform zu benutzen.
Direkter Zugriff auf einen Cache
Das Ansprechen eines Caches ist aus Sicht eines Programmierers nichts anderes als ein Map
-Zugriff. Folglich ist das folgende Programm, das den Beispielprogrammen der Ignite-Community auf GitHub entnommen wurde, sehr trivial:
public class ClientPutGetExample { public static void main(String[] args) { ClientConfiguration cfg = new ClientConfiguration().setAddresses("127.0.0.1:10800"); try (IgniteClient igniteClient = Ignition.startClient(cfg)) { final String CACHE_NAME = "put-get-example"; ClientCache cache = igniteClient.getOrCreateCache(CACHE_NAME); Integer key = 1; Address val = new Address("1545 Jackson Street", 94612); cache.put(key, val); Address cachedVal = cache.get(key); System.out.println("Found address: " + cachedVal); } catch (ClientException e) { System.err.println(e.getMessage()); } catch (Exception e) { System.err.format("Unexpected failure: %s\n", e); } } }
Das SQL-Grid
Obwohl Ignite ein Key-Value-Store ist werden auch SQL-Abfragen unterstützt. Für die Java-Programmierung stellt sich Ignite damit als relationales Datenbank-System dar, das über einen JDBC-Treiber angesprochen wird:
public class SqlJdbcExample { public static void main(String[] args) throws Exception { try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1/")) { try (Statement stmt = conn.createStatement()) { stmt.executeUpdate("CREATE TABLE city (id LONG PRIMARY KEY, name VARCHAR) " + "WITH \"template=replicated\""); stmt.executeUpdate("CREATE TABLE person (id LONG, name VARCHAR, city_id LONG, " + "PRIMARY KEY (id, city_id)) WITH \"backups=1, affinity_key=city_id\""); stmt.executeUpdate("CREATE INDEX on Person (city_id)"); } try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO city (id, name) VALUES (?, ?)")) { stmt.setLong(1, 1L); stmt.setString(2, "Forest Hill"); stmt.executeUpdate(); stmt.setLong(1, 2L); stmt.setString(2, "Denver"); stmt.executeUpdate(); stmt.setLong(1, 3L); stmt.setString(2, "St. Petersburg"); stmt.executeUpdate(); } // Populate Person table with PreparedStatement. try (PreparedStatement stmt = conn.prepareStatement("INSERT INTO person (id, name, city_id) values (?, ?, ?)")) { stmt.setLong(1, 1L); stmt.setString(2, "John Doe"); stmt.setLong(3, 3L); stmt.executeUpdate(); stmt.setLong(1, 2L); stmt.setString(2, "Jane Roe"); stmt.setLong(3, 2L); stmt.executeUpdate(); stmt.setLong(1, 3L); stmt.setString(2, "Mary Major"); stmt.setLong(3, 1L); stmt.executeUpdate(); stmt.setLong(1, 4L); stmt.setString(2, "Richard Miles"); stmt.setLong(3, 2L); stmt.executeUpdate(); } try (Statement stmt = conn.createStatement()) { try (ResultSet rs = stmt.executeQuery("SELECT p.name, c.name FROM Person p INNER JOIN City c on c.id = p.city_id")) { while (rs.next()) System.out.println(rs.getString(1) + ", " + rs.getString(2)); } } try (Statement stmt = conn.createStatement()) { stmt.executeUpdate("DROP TABLE Person"); stmt.executeUpdate("DROP TABLE City"); } } } }
Zu beachten ist, dass die Ablage der Daten immer noch in einem Key-Value-Store erfolgt: Die “Tabellen” sind damit Caches!
Weitere Grids
Ignite bietet noch weitere Grids an:
- Das Compute-Grid ermöglicht die Ausführung einer beliebigen Programm-Sequenz auf den Knoten des Ignite-Clusters. Dazu überträgt der Java-Client beispielsweise eine Lambda-Funktion oder ein
Runnable
-Objekt. Typischerweise sind diese Programme als Map-Reduce-Funktionen ausgebildet, die auf den in den Caches gespeicherten Daten operieren. - Mit dem Service-Grid werden auf den Cluster Services installiert. Damit wird Ignite faktisch zu einem Applikationsserver.
- Eine Sonderform des Compute-Grids ist Machine Learning: Die dazu benötigten Algorithmen werden als Bestandteil der Ignite-Distribution fertig implementiert zur Verfügung gestellt.