MicroStream + Helidon =Brave Performance Combination

原文はこちら。
The original article was written by Mitia Alexandrov (a software developer at Oracle, working on Project Helidon).
https://medium.com/helidon/microstream-helidon-brave-performance-combination-12d3d288aa

MicroStreamは、高性能でJavaネイティブなオブジェクトグラフの永続化を実現します。

MicroStream
https://microstream.one/

MicroStreamは、重量級のJPAに代わって、あらゆるJavaオブジェクトグラフやサブグラフの保存、および部分的なロードを可能にします。また、マイクロ秒の応答時間と最小限のレイテンシで超高速のスループットを実現します。Helidon 2.4でMicroStreamを使用することで、超高速なインメモリデータベースアプリケーションやマイクロサービスを作成することができるようになりました。

MicroStreamはJavaのシリアライゼーション機構を完全に再構築し、部分的にロードされたオブジェクトをディスク、データベース、またはクラウドオブジェクトストアに直接保存する機能を提供します。適切なストアマネージャを選択すればそれでOKです。

Helidonは現在、このテクノロジーと完全に統合されています。

MicroStream + Helidon MP

上述の通り、MicroStreamはHelidonと完全に統合されているため、MicroStreamのコンポーネントはHelidonの構成から直接MicroStreamの構成をすべて読み取ることができます。

Storage Managerに注入するための特別なアノテーションのセットがあります。

まず、Mavenの依存関係を追加します。

<dependency>
   <groupId>io.helidon.integrations.microstream</groupId>
   <artifactId>helidon-integrations-microstream-cdi</artifactId>
</dependency>

これでMicroStreamのサポートを利用できます。

@Inject
public GreetingProvider(@MicrostreamStorage(configNode =                
              "one.microstream.storage.greetings")
              EmbeddedStorageManager storage) {
    super();
    this.storage = storage;
    greetingMessages = (List<String>) storage.root();
    if (greetingMessages == null) {
        greetingMessages = new ArrayList<>();
        storage.setRoot(greetingMessages);
        storage.storeRoot();
        addGreeting("Hello");
    }
}

microprofile-config.properties ファイルから設定を読み取ります。

one.microstream.storage.greetings.storage-directory=./greetingsStorage

Helidonの公式サンプルリポジトリに、少々変更されたGreetingサンプルがありますが、このサンプルにおける主要な変更点は、一連の”Greetings (挨拶) に永続性を追加するものです。つまり、新たに挨拶を追加してアプリケーションを再起動しても、一連のgreeting (挨拶) は消失しません。

ご自身でこのサンプルを試すことができます。

Microstream integration example (Helidon MP)
https://github.com/oracle/helidon/tree/master/examples/integrations/microstream/greetings-mp

MicroStream + Helidon SE

全く同じ機能がHelidon SEでも使えます。EmbeddedStorageManagerBuilder を使ってMicroStream Storage Managerを初期化できます。すべての設定はHelidon Configから取得します。

GreetingService(Config config) {          
greeting.set(config.get("app.greeting").asString().orElse("Ciao"));
mctx = new GreetingServiceMicrostreamContext
(EmbeddedStorageManagerBuilder.create(config.get("microstream")));
        mctx.start().await();
        mctx.initRootElement();
}

ご覧の通り、MicroStreamを使ったすべての操作は非同期かつリアクティブに行われます。

public CompletableFuture<Void> addLogEntry(String name) {
    return execute(() -> {
        @SuppressWarnings("unchecked")
        List<LogEntry> logs = (List<LogEntry>)   
                              storageManager().root();
        logs.add(new LogEntry(name, LocalDateTime.now()));
        storageManager().store(logs);
        return null;
    });
}

オブジェクトの永続化も簡略化されています。

private void sendResponse(ServerResponse response, String name) {
    String msg = String.format("%s %s!", greeting.get(), name);

    mctx.addLogEntry(name);

    JsonObject returnObject = JSON.createObjectBuilder()
            .add("message", msg)
            .build();
    response.send(returnObject);
}

是非試してください。Helidon SE + MicroStreamのサンプルは公式リポジトリにあります。

Microstream integration example (Helidon SE)
https://github.com/oracle/helidon/tree/master/examples/integrations/microstream/greetings-se

Health Support and Metrics

完全統合には、ヘルスチェックやメトリクスのサポートも含まれています。Helidonはモジュール構成なので、Mavenの依存関係を追加してヘルスチェックを読み取るようにする必要があります。

<dependency>
   <groupId>io.helidon.integrations.microstream</groupId>
   <artifactId>helidon-integrations-microstream-health</artifactId>
</dependency>

Helidon SEの場合は登録するだけです。

HealthCheck microstreamHealthCheck = MicrostreamHealthCheck.create(greetService.getManager());
MetricsSupport metrics = MetricsSupport.create();
HealthSupport health = HealthSupport.builder()
                .addLiveness(microstreamHealthCheck)
                .addLiveness(HealthChecks.healthChecks())   
                .build();

メトリクスの場合にも同じ方法を使います。

まず、Mavenの依存関係を追加して…

<dependency>
   <groupId>io.helidon.integrations.microstream</groupId>
   <artifactId>helidon-integrations-microstream-metrics</artifactId>
</dependency>

それから MicrostreamMetricsSupport オブジェクトを使って、StorageManagerを登録できます。

MicrostreamMetricsSupport.builder(greetService.getManager()).build().registerMetrics();

これですべてのヘルスおよびメトリクス情報がHelidonの/health/metricsエンドポイントから利用できます。

MicroStream Cache

MicroStreamはJSR 107 (JCache) の独自の実装を提供します。

JSR107 (JCache)
https://github.com/jsr107/jsr107spec
https://jcp.org/en/jsr/detail?id=107

以下の Mavenの依存関係を追加すれば利用できるようになります。

<dependency>
   <groupId>io.helidon.integrations.microstream</groupId>
   <artifactId>helidon-integrations-microstream-cdi</artifactId>
</dependency>

Greetingsアプリケーションを変更して挨拶用にキャッシュを利用できます。

Cache<String, String> greetingsCache;
 
@Inject
public GreetingsProvider(@MicrostreamCache(configNode=  
                "one.microstream.cache", name = "greetingsCache")                   
                                     Cache<String, String> cache) {
  super();
  this.greetingsCache = cache;
 }public String get(String key) {
  return greetingsCache.get(key);
 }public void add(String key, String responseObject) {
  greetingsCache.put(key, responseObject);
 }

特別な @MicrostreamCache アノテーションですべてのキャッシュの設定をmicroprofile-config.propertiesから読み取ります。

#Microstream cache config
one.microstream.cache.storage.storage-directory = ./greetingsCache
one.microstream.cache.keyType = java.lang.String
one.microstream.cache.valueType = java.lang.String
one.microstream.cache.readThrough = true
one.microstream.cache.writeThrough = true

ご覧の通り、とても簡単です。

Summary

MicroStreamはこの業界における真のゲームチェンジャーです。本当に高パフォーマンスのマイクロサービスを作成したいとか、本当に厳しい環境で動作するようにしたいのであれば、HelidonとMicroStreamの組み合わせが本当に素晴らしい選択でしょう。簡単にセットアップや利用できるだけでなく、完全に統合されています。

Kudos to MicroStreamチームに敬意を表します。

MicroStreamに関する詳細は以下のURLからどうぞ。

MicroStream
http://microstream.one

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中