原文はこちら。
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