Micronaut Ignite

Integration between Micronaut and Apache Ignite

Version:

1 Introduction

Apache Ignite is a horizontally distributed fault tolerant compute platform for real-time applications that can process terabytes of data with in-memory speed.

This project adds support for Apache Ignite and bridges support to other Micronaut components : Micronaut Cache

2 Release History

For this project, you can find a list of releases (with release notes) here:

3 Ignite Quick Start

To add support for Ignite to an existing project, you should first add the Micronaut Ignite Core configuration to your build configuration. For example in Gradle:

implementation("io.micronaut.ignite:micronaut-ignite-core")
<dependency>
    <groupId>io.micronaut.ignite</groupId>
    <artifactId>micronaut-ignite-core</artifactId>
</dependency>

The minimum requirement for configure Ignite is set the value of the ignite.enabled property in application.yaml.

Configure Ignite
ignite:
  enabled: true

4 Configuration Ignite

The full list of configurable options via micronaut properties is below:

🔗
Table 1. Configuration Properties for DefaultIgniteConfiguration
Property Type Description

ignite.communication-spi.local-address

java.lang.String

ignite.communication-spi.local-port

int

ignite.communication-spi.local-port-range

int

ignite.communication-spi.use-paired-connections

boolean

ignite.communication-spi.connections-per-node

int

ignite.communication-spi.shared-memory-port

int

ignite.communication-spi.idle-connection-timeout

long

ignite.communication-spi.socket-write-timeout

long

ignite.communication-spi.ack-send-threshold

int

ignite.communication-spi.unacknowledged-messages-buffer-size

int

ignite.communication-spi.connect-timeout

long

ignite.communication-spi.max-connect-timeout

long

ignite.communication-spi.reconnect-count

int

ignite.communication-spi.direct-buffer

boolean

ignite.communication-spi.direct-send-buffer

boolean

ignite.communication-spi.selectors-count

int

ignite.communication-spi.selector-spins

long

ignite.communication-spi.tcp-no-delay

boolean

ignite.communication-spi.filter-reachable-addresses

boolean

ignite.communication-spi.socket-receive-buffer

int

ignite.communication-spi.socket-send-buffer

int

ignite.communication-spi.message-queue-limit

int

ignite.communication-spi.slow-client-queue-limit

int

ignite.communication-spi.name

java.lang.String

ignite.discovery-spi.client-reconnect-disabled

boolean

ignite.discovery-spi.local-address

java.lang.String

ignite.discovery-spi.reconnect-count

int

ignite.discovery-spi.reconnect-delay

int

ignite.discovery-spi.max-ack-timeout

long

ignite.discovery-spi.local-port

int

ignite.discovery-spi.local-port-range

int

ignite.discovery-spi.statistics-print-frequency

long

ignite.discovery-spi.ip-finder-clean-frequency

long

ignite.discovery-spi.socket-timeout

long

ignite.discovery-spi.ack-timeout

long

ignite.discovery-spi.so-linger

int

ignite.discovery-spi.network-timeout

long

ignite.discovery-spi.join-timeout

long

ignite.discovery-spi.thread-priority

int

ignite.discovery-spi.top-history-size

int

ignite.discovery-spi.connection-recovery-timeout

long

ignite.discovery-spi.name

java.lang.String

ignite.atomic-configuration.backups

int

ignite.atomic-configuration.cache-mode

org.apache.ignite.cache.CacheMode

ignite.atomic-configuration.atomic-sequence-reserve-size

int

ignite.atomic-configuration.affinity

org.apache.ignite.cache.affinity.AffinityFunction

ignite.atomic-configuration.group-name

java.lang.String

ignite.enabled

boolean

Sets whether the DefaultIgniteConfiguration is enabled.

ignite.daemon

boolean

ignite.grid-name

java.lang.String

ignite.ignite-instance-name

java.lang.String

ignite.consistent-id

java.io.Serializable

ignite.user-attributes

java.util.Map

ignite.striped-pool-size

int

ignite.sql-query-history-size

int

ignite.default-query-timeout

long

ignite.public-thread-pool-size

int

ignite.service-thread-pool-size

int

ignite.system-thread-pool-size

int

ignite.async-callback-pool-size

int

ignite.management-thread-pool-size

int

ignite.peer-class-loading-thread-pool-size

int

ignite.igfs-thread-pool-size

int

ignite.data-streamer-thread-pool-size

int

ignite.utility-cache-pool-size

int

ignite.query-thread-pool-size

int

ignite.utility-cache-keep-alive-time

long

ignite.ignite-home

java.lang.String

ignite.work-directory

java.lang.String

ignite.node-id

java.util.UUID

ignite.marshal-local-jobs

boolean

ignite.peer-class-loading-enabled

boolean

ignite.peer-class-loading-local-class-path-exclude

java.lang.String[]

ignite.metrics-history-size

int

ignite.metrics-update-frequency

long

ignite.metrics-expire-time

long

ignite.network-timeout

long

ignite.network-compression-level

int

ignite.network-send-retry-delay

long

ignite.network-send-retry-count

int

ignite.rebalance-thread-pool-size

int

ignite.rebalance-timeout

long

ignite.rebalance-batches-prefetch-count

long

ignite.rebalance-throttle

long

ignite.rebalance-batch-size

int

ignite.segmentation-policy

org.apache.ignite.plugin.segmentation.SegmentationPolicy

ignite.wait-for-segment-on-start

boolean

ignite.all-segmentation-resolvers-pass-required

boolean

ignite.segmentation-resolve-attempts

int

ignite.segment-check-frequency

long

ignite.client-failure-detection-timeout

long

ignite.failure-detection-timeout

long

ignite.system-worker-blocked-timeout

long

ignite.deployment-mode

org.apache.ignite.configuration.DeploymentMode

ignite.peer-class-loading-missed-resources-cache-size

int

ignite.client-mode

boolean

ignite.active-on-start

boolean

ignite.auto-activation-enabled

boolean

ignite.cache-sanity-check-enabled

boolean

ignite.include-event-types

[I

ignite.local-host

java.lang.String

ignite.time-server-port-base

int

ignite.time-server-port-range

int

ignite.include-properties

java.lang.String[]

ignite.metrics-log-frequency

long

ignite.local-event-listeners

java.util.Map

ignite.class-loader

java.lang.ClassLoader

ignite.late-affinity-assignment

boolean

ignite.long-query-warning-timeout

long

ignite.mvcc-vacuum-thread-count

int

ignite.mvcc-vacuum-frequency

long

ignite.authentication-enabled

boolean

ignite.sql-schemas

java.lang.String[]

To apply additional configuration a bean created event listener can be registered to intercept the creation of the IgniteConfiguration.

package io.micronaut.ignite.docs.config;

import io.micronaut.context.event.BeanCreatedEvent;
import io.micronaut.context.event.BeanCreatedEventListener;
import org.apache.ignite.configuration.IgniteConfiguration;

import javax.inject.Singleton;

@Singleton
public class IgniteConfigurationFactoryInterceptor implements BeanCreatedEventListener<IgniteConfiguration> {
    @Override
    public IgniteConfiguration onCreated(BeanCreatedEvent<IgniteConfiguration> event) {
        IgniteConfiguration configuration = event.getBean();
        configuration.setIgniteInstanceName("instance-a");
        return configuration;
    }
}
package io.micronaut.ignite.docs.config

import io.micronaut.context.event.BeanCreatedEvent
import io.micronaut.context.event.BeanCreatedEventListener
import org.apache.ignite.configuration.IgniteConfiguration

@Singleton
class IgniteConfigurationFactoryInterceptor implements BeanCreatedEventListener<IgniteConfiguration>{
    @Override
    IgniteConfiguration onCreated(BeanCreatedEvent<IgniteConfiguration> event) {
        IgniteConfiguration configuration = event.bean
        configuration.setIgniteInstanceName("instance-a")
        return configuration
    }
}
package io.micronaut.ignite.docs.config

import io.micronaut.context.event.BeanCreatedEvent
import io.micronaut.context.event.BeanCreatedEventListener
import org.apache.ignite.configuration.IgniteConfiguration

class IgniteConfigurationFactoryInterceptor : BeanCreatedEventListener<IgniteConfiguration> {
    override fun onCreated(event: BeanCreatedEvent<IgniteConfiguration>?): IgniteConfiguration {
        val configuration = event!!.bean
        configuration.igniteInstanceName = "instance-a"
        return configuration
    }
}

4.1 Configuring Ignite Cache

It is possible to configure multiple Ignite Caches.

Configuring Cache
ignite:
  enabled: true
    cache-configurations:
      bank:
        group-name: one
        query-entities:
        - table-name: "ACCOUNTS"
          keyFieldName: ID
          keyType: java.lang.Long
          valueType: java.lang.Object
          fields:
            ID: java.lang.Long
            amount: java.lang.Double
            updateDate: java.util.Date
      second:
        group-name: two
🔗
Table 1. Configuration Properties for DefaultCacheConfiguration
Property Type Description

ignite.cache-configurations.*.key-type

java.lang.Class

ignite.cache-configurations.*.value-type

java.lang.Class

ignite.cache-configurations.*.listener-configurations

java.util.HashSet

ignite.cache-configurations.*.is-read-through

boolean

ignite.cache-configurations.*.is-write-through

boolean

ignite.cache-configurations.*.is-statistics-enabled

boolean

ignite.cache-configurations.*.is-store-by-value

boolean

ignite.cache-configurations.*.is-management-enabled

boolean

ignite.cache-configurations.*.group-name

java.lang.String

ignite.cache-configurations.*.name

java.lang.String

ignite.cache-configurations.*.data-region-name

java.lang.String

ignite.cache-configurations.*.memory-policy-name

java.lang.String

ignite.cache-configurations.*.eviction-policy

org.apache.ignite.cache.eviction.EvictionPolicy

ignite.cache-configurations.*.onheap-cache-enabled

boolean

ignite.cache-configurations.*.sql-onheap-cache-enabled

boolean

ignite.cache-configurations.*.sql-onheap-cache-max-size

int

ignite.cache-configurations.*.write-synchronization-mode

org.apache.ignite.cache.CacheWriteSynchronizationMode

ignite.cache-configurations.*.eager-ttl

boolean

ignite.cache-configurations.*.load-previous-value

boolean

ignite.cache-configurations.*.store-keep-binary

boolean

ignite.cache-configurations.*.store-concurrent-load-all-threshold

int

ignite.cache-configurations.*.cache-mode

org.apache.ignite.cache.CacheMode

ignite.cache-configurations.*.atomicity-mode

org.apache.ignite.cache.CacheAtomicityMode

ignite.cache-configurations.*.backups

int

ignite.cache-configurations.*.default-lock-timeout

long

ignite.cache-configurations.*.invalidate

boolean

ignite.cache-configurations.*.transaction-manager-lookup-class-name

java.lang.String

ignite.cache-configurations.*.rebalance-mode

org.apache.ignite.cache.CacheRebalanceMode

ignite.cache-configurations.*.rebalance-order

int

ignite.cache-configurations.*.rebalance-batch-size

int

ignite.cache-configurations.*.rebalance-batches-prefetch-count

long

ignite.cache-configurations.*.max-concurrent-async-operations

int

ignite.cache-configurations.*.sql-index-max-inline-size

int

ignite.cache-configurations.*.write-behind-enabled

boolean

ignite.cache-configurations.*.write-behind-flush-size

int

ignite.cache-configurations.*.write-behind-flush-frequency

long

ignite.cache-configurations.*.write-behind-flush-thread-count

int

ignite.cache-configurations.*.write-behind-batch-size

int

ignite.cache-configurations.*.write-behind-coalescing

boolean

ignite.cache-configurations.*.rebalance-thread-pool-size

int

ignite.cache-configurations.*.rebalance-timeout

long

ignite.cache-configurations.*.rebalance-delay

long

ignite.cache-configurations.*.rebalance-throttle

long

ignite.cache-configurations.*.max-query-iterators-count

int

ignite.cache-configurations.*.read-from-backup

boolean

ignite.cache-configurations.*.copy-on-read

boolean

ignite.cache-configurations.*.sql-function-classes

java.lang.Class[]

ignite.cache-configurations.*.long-query-warning-timeout

long

ignite.cache-configurations.*.query-detail-metrics-size

int

ignite.cache-configurations.*.sql-schema

java.lang.String

ignite.cache-configurations.*.sql-escape-all

boolean

ignite.cache-configurations.*.indexed-types

java.lang.Class[]

ignite.cache-configurations.*.partition-loss-policy

org.apache.ignite.cache.PartitionLossPolicy

ignite.cache-configurations.*.query-entities

java.util.Collection

ignite.cache-configurations.*.query-parallelism

int

ignite.cache-configurations.*.statistics-enabled

boolean

ignite.cache-configurations.*.management-enabled

boolean

ignite.cache-configurations.*.read-through

boolean

ignite.cache-configurations.*.write-through

boolean

ignite.cache-configurations.*.store-by-value

boolean

ignite.cache-configurations.*.events-disabled

boolean

ignite.cache-configurations.*.encryption-enabled

boolean

ignite.cache-configurations.*.disk-page-compression

org.apache.ignite.configuration.DiskPageCompression

ignite.cache-configurations.*.disk-page-compression-level

java.lang.Integer

A factory can provide configurations that can’t ideally be configured from properties .

package io.micronaut.ignite.docs.config;

import io.micronaut.context.annotation.Bean;
import io.micronaut.context.annotation.Factory;
import io.micronaut.ignite.annotation.IgnitePrimary;
import org.apache.ignite.configuration.CacheConfiguration;

@Factory
public class IgniteCacheConfigurationFactory {
    @Bean
    @IgnitePrimary
    CacheConfiguration<String,String> cacheInstance() {
        return new CacheConfiguration<String, String>("my-cache")
            .setBackups(2);
    }
}
package io.micronaut.ignite.docs.config

import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.ignite.annotation.IgnitePrimary
import org.apache.ignite.configuration.CacheConfiguration

@Factory
class IgniteCacheConfigurationFactory {
    @Bean
    @IgnitePrimary
    CacheConfiguration<String,String> cacheInstance() {
        new CacheConfiguration<String, String>("my-cache")
            .setBackups(2)
    }
}
package io.micronaut.ignite.docs.config

import io.micronaut.context.annotation.Bean
import io.micronaut.context.annotation.Factory
import io.micronaut.ignite.annotation.IgnitePrimary
import org.apache.ignite.configuration.CacheConfiguration

@Factory
class IgniteCacheConfigurationFactory {
    @Bean
    @IgnitePrimary
    fun cacheInstance(): CacheConfiguration<String, String>? {
        return CacheConfiguration<String, String>("my-cache")
            .setBackups(2)
    }
}

4.2 Configuring Discovery SPI

Ignite nodes, can discover each other by using the TcpDiscoverySpi. There are a couple configuration options supported by Ignite for Discovery. Additional information can be found under TCP/IP Discovery.

Static IP Finder

The static-ip-finder.enabled flag has to be true to use the static ip finder.

Configuring Static Ip Finder
ignite:
  enabled: true
  discovery-spi:
    static-ip-finder:
      enabled: true
      addresses:
        - "127.0.0.1:47500"
        - "127.0.0.1:47501"
🔗
Table 1. Configuration Properties for DefaultDiscoveryStaticIpFinder
Property Type Description

ignite.discovery-spi.static-ip-finder.enabled

boolean

vm ip finder is enabled.

ignite.discovery-spi.static-ip-finder.addresses

java.util.Collection

ignite.discovery-spi.static-ip-finder.shared

boolean

ignite.discovery-spi.static-ip-finder.static-ip-finder-addresses

java.util.Collection

Parses provided values and initializes the internal collection of addresses via {@link #setAddresses(Collection)}.

Discovery Kubernetes

The kubernetes-ip-finder.enabled flag has to be true to use kubernetes discovery.

Configuring Kubernetes
ignite:
  enabled: true
  discovery-spi:
    kubernetes-ip-finder:
      enabled: true
🔗
Table 2. Configuration Properties for DefaultTcpDiscoveryKubernetesIpFinder
Property Type Description

ignite.discovery-spi.kubernetes-ip-finder.enabled

boolean

Sets whether the DefaultTcpDiscoveryKubernetesIpFinder is enabled.

ignite.discovery-spi.kubernetes-ip-finder.shared

boolean

ignite.discovery-spi.kubernetes-ip-finder.service-name

java.lang.String

ignite.discovery-spi.kubernetes-ip-finder.namespace

java.lang.String

ignite.discovery-spi.kubernetes-ip-finder.master-url

java.lang.String

ignite.discovery-spi.kubernetes-ip-finder.account-token

java.lang.String

5 Configuration Thin Client

Configuring Thin Client
ignite-thin-client:
  enabled: true
  addresses:
    - "127.0.0.1:10800"
    - "127.0.0.1:10801"
🔗
Table 1. Configuration Properties for DefaultIgniteThinClientConfiguration
Property Type Description

ignite-thin-client.enabled

boolean

Sets whether the DefaultIgniteThinClientConfiguration is enabled.

ignite-thin-client.addresses

java.lang.String[]

ignite-thin-client.tcp-no-delay

boolean

ignite-thin-client.timeout

int

ignite-thin-client.send-buffer-size

int

ignite-thin-client.receive-buffer-size

int

ignite-thin-client.ssl-mode

org.apache.ignite.client.SslMode

ignite-thin-client.ssl-client-certificate-key-store-path

java.lang.String

ignite-thin-client.ssl-client-certificate-key-store-password

java.lang.String

ignite-thin-client.ssl-client-certificate-key-store-type

java.lang.String

ignite-thin-client.ssl-trust-certificate-key-store-path

java.lang.String

ignite-thin-client.ssl-trust-certificate-key-store-password

java.lang.String

ignite-thin-client.ssl-trust-certificate-key-store-type

java.lang.String

ignite-thin-client.ssl-key-algorithm

java.lang.String

ignite-thin-client.ssl-trust-all

boolean

ignite-thin-client.ssl-protocol

org.apache.ignite.client.SslProtocol

ignite-thin-client.user-name

java.lang.String

ignite-thin-client.user-password

java.lang.String

ignite-thin-client.partition-awareness-enabled

boolean

ignite-thin-client.reconnect-throttling-period

long

ignite-thin-client.reconnect-throttling-retries

int

ignite-thin-client.transaction-configuration.default-tx-concurrency

org.apache.ignite.transactions.TransactionConcurrency

ignite-thin-client.transaction-configuration.default-tx-isolation

org.apache.ignite.transactions.TransactionIsolation

ignite-thin-client.transaction-configuration.default-tx-timeout

long

6 Ignite Transaction

Ignite Transaction

A method call in micronaut can be wrapped with @IgniteTransaction to ensure consistency.

For example the follow is an example case for @IgniteTransaction:

package io.micronaut.ignite.docs.transaction;

import io.micronaut.ignite.annotation.IgniteTransaction;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;

public class SampleIgniteTransaction {

    private final Ignite ignite;

    SampleIgniteTransaction(Ignite ignite) {
        this.ignite = ignite;
    }

    @IgniteTransaction
    public void method() {
        IgniteCache cache = this.ignite.cache("sample");
        cache.put("key", "value");
    }
}
package io.micronaut.ignite.docs.transaction

import io.micronaut.ignite.annotation.IgniteTransaction
import org.apache.ignite.Ignite
import org.apache.ignite.IgniteCache

class SampleIgniteTransaction {

    private final Ignite ignite

    SampleIgniteTransaction(Ignite ignite) {
        this.ignite = ignite
    }

    @IgniteTransaction
    void method() {
        IgniteCache cache = this.ignite.cache("sample")
        cache.put("key", "value")
    }
}
package io.micronaut.ignite.docs.transaction

import io.micronaut.ignite.annotation.IgniteTransaction
import org.apache.ignite.Ignite
import org.apache.ignite.IgniteCache

class SampleIgniteTransaction constructor(private val ignite: Ignite) {

    @IgniteTransaction
    fun method() {
        val cache: IgniteCache<String, String> = ignite.cache("sample")
        cache.put("key", "value")
    }
}

7 Micronaut Cache

Micronaut Cache

To take advantage of Micronaut Cache, this can be enabled by including the following dependency:

implementation("io.micronaut.ignite:micronaut-ignite-cache")
<dependency>
    <groupId>io.micronaut.ignite</groupId>
    <artifactId>micronaut-ignite-cache</artifactId>
</dependency>

The primary bean from the Ignite instance is used for the cache configuration. The cacheName will reference the associated cache instance from ignite. More information about usage can be found Micronaut Cache.

8 Repository

You can find the source code of this project in this repository: