ApacheDruidを使用したイベント駆動型データ
1. 序章
このチュートリアルでは、イベントデータと ApacheDruidの操作方法を理解します。 イベントデータとDruidアーキテクチャの基本について説明します。 その一環として、Druidのさまざまな機能を活用して、データ取り込みのさまざまなモードと準備されたデータをクエリするさまざまな方法をカバーする単純なデータパイプラインを作成します。
2. 基本概念
Apache Druidの操作の詳細に入る前に、まずいくつかの基本的な概念を見ていきましょう。 私たちが関心を持っているのは、大規模なイベントデータのリアルタイム分析です。
したがって、イベントデータの意味と、それらをリアルタイムで大規模に分析するために何が必要かを理解することが不可欠です。
2.1. イベントデータとは?
イベントデータとは、特定の時点で発生した変更に関する情報を指します。 イベントデータは、現在のアプリケーションではほぼ遍在しています。 従来のアプリケーションログから、物事によって生成された現代のセンサーデータまで、事実上どこにでもあります。 これらは多くの場合、大規模に生成された機械可読情報によって特徴付けられます。
それらは、いくつか例を挙げると、予測、自動化、通信、統合などのいくつかの機能を強化します。 さらに、これらはイベント駆動型アーキテクチャで重要です。
2.2. Apache Druidとは何ですか?
Apache Druidは、イベント指向データの高速分析用に設計されたリアルタイム分析データベースです。 Druidは2011年に開始され、2012年にGPLライセンスの下でオープンソース化され、2015年にApacheライセンスに移行しました。 これは、いくつかの組織からのコミュニティの貢献により、ApacheFoundationによって管理されています。 リアルタイムの取り込み、高速なクエリパフォーマンス、および高可用性を提供します。
Druidという名前は、そのアーキテクチャがさまざまなタイプのデータ問題を解決するためにシフトできるという事実を表しています。 大量のリアルタイムおよび履歴データを分析するために、ビジネスインテリジェンスアプリケーションでよく使用されます。
3. Druidアーキテクチャ
Druidは、Javaで記述された列指向の分散データソースです。 大量のイベントデータを取り込み、このデータに加えて低レイテンシのクエリを提供することができます。 さらに、データを任意にスライスおよびダイシングする可能性を提供します。
Druidアーキテクチャがこれらの機能をどのようにサポートしているかを理解することは非常に興味深いことです。 このセクションでは、Druidアーキテクチャの重要な部分について説明します。
3.1. データストレージの設計
Druidがデータをどのように構造化して保存するかを理解することが重要です。これにより、パーティション化と分散が可能になります。 Druid は、処理中にデフォルトでデータをパーティション化し、チャンクとセグメントに格納します。
Druid は、データを「データソース」と呼ばれるものに格納します。これは、リレーショナルデータベースのテーブルと論理的に類似しています。 Druidクラスターは、さまざまなソースから取り込まれた複数のデータソースを並行して処理できます。
各データソースはパーティション化されています—デフォルトでは時間に基づいており、そのように構成されている場合はさらに他の属性に基づいています。 時間範囲のデータは、「チャンク」と呼ばれます。たとえば、データが1時間で分割されている場合、1時間のデータです。
すべてのチャンクはさらに1つ以上の「セグメント」に分割されます。これは、データの多くの行で構成される単一のファイルです。 データソースには、数セグメントから数百万セグメントまでの範囲があります。
3.2. ドルイドプロセス
Druidにはマルチプロセスおよび分散アーキテクチャがあります。 したがって、各プロセスを個別にスケーリングできるため、柔軟なクラスターを作成できます。 ドルイドの一部である重要なプロセスを理解しましょう:
- コーディネーター:このプロセスは主にセグメントの管理と配布を担当し、履歴プロセスと通信して構成に基づいてセグメントをロードまたはドロップします
- Overlord :これは、タスクの受け入れ、タスクの分散の調整、タスクの周囲のロックの作成、および呼び出し元へのステータスの返送を担当するメインプロセスです。
- Broker :これは、分散クラスターで実行するためにすべてのクエリが送信されるプロセスです。 Zookeeperからメタデータを収集し、適切なセグメントを持つプロセスにクエリをルーティングします
- Router :これは、クエリをさまざまなブローカープロセスにルーティングするために使用できるオプションのプロセスであるため、より重要なデータのクエリにクエリを分離できます。
- Historical :これらはクエリ可能なデータを格納するプロセスです。 彼らはZookeeperとの常時接続を維持し、ロードして提供する必要のあるセグメント情報を監視します
- MiddleManager :これらは送信されたタスクを実行するワーカープロセスです。 タスクを別々のJVMで実行されているPeonに転送し、リソースとログの分離を提供します
3.3. 外部依存関係
コアプロセスとは別に、Druid は、クラスターが期待どおりに機能するために、いくつかの外部依存関係に依存しています。
Druidクラスターがコアプロセスおよび外部依存関係とともにどのように形成されるかを見てみましょう。
Druidは、ディープストレージを使用して、システムに取り込まれたデータを保存します。 これらはクエリへの応答には使用されませんが、データのバックアップとして、およびプロセス間でデータを転送するために使用されます。 これらは、ローカルファイルシステムからS3やHDFSなどの分散オブジェクトストアまで、何でもかまいません。
メタデータストレージは、セグメント使用情報やタスク情報などの共有システムメタデータを保持するために使用されます。 ただし、実際のデータを保存するために使用されることはありません。 これは、Apache Derby、PostgreSQL、MySQLなどのリレーショナルデータベースです。
ドルイドの使用法Apache現在のクラスター状態を管理するためのZookeeper。 これにより、コーディネーター/オーバーロードリーダーの選出、セグメント公開プロトコル、セグメントロード/ドロッププロトコルなど、ドルイドクラスターでの多数の操作が容易になります。
4. ドルイドのセットアップ
Druidは、スケーラブルでフォールトトレラントなクラスターとしてデプロイされるように設計されています。 ただし、実稼働グレードのDruidクラスターのセットアップは簡単ではありません。 前に見たように、セットアップおよび構成するプロセスと外部依存関係は多数あります。 柔軟な方法でクラスターを作成することが可能であるため、個々のプロセスを適切に設定するための要件に注意を払う必要があります。
また、Druid はUnixライクな環境でのみサポートされており、Windowsではサポートされていません。 さらに、Druidプロセスを実行するには、Java8以降が必要です。 チュートリアルと例を実行するために単一のマシンでDruidをセットアップするために利用できるいくつかの単一サーバー構成があります。 ただし、実稼働ワークロードを実行するには、複数のマシンで本格的なDruidクラスターをセットアップすることをお勧めします。
このチュートリアルでは、DockerHubで公開されている公式のDockerイメージを使用して単一のマシンにDruidをセットアップします。 これにより、WindowsでもDruidを実行できます。これは、前に説明したように、他の方法ではサポートされていません。 Docker作成ファイルが利用可能であり、各Druidプロセスとその外部依存関係のコンテナーを作成します。
構成値を環境変数としてDruidに提供する必要があります。 これを実現する最も簡単な方法は、Docker作成ファイルと同じディレクトリに「environment」というファイルを提供することです。
Docker構成と環境ファイルを配置したら、Druidの起動は同じディレクトリでコマンドを実行するのと同じくらい簡単です。
docker-compose up
これにより、単一マシンのDruidセットアップに必要なすべてのコンテナーが表示されます。 Druidは大量のリソースを消費するため、Dockerマシンに十分なメモリを提供するように注意する必要があります。
5. データの取り込み
Druidを使用してデータパイプラインを構築するための最初のステップは、データをDruidにロードすることです。 このプロセスは、Druidアーキテクチャではデータの取り込みまたはインデックス作成と呼ばれます。 このチュートリアルを進めるには、適切なデータセットを見つける必要があります。
これまでに収集したように、ドルイドインフラストラクチャを最大限に活用するには、イベントであり、一時的な性質を持つデータを取得する必要があります。
ドルイドの公式ガイドでは、特定の日付のウィキペディアページの編集を含むシンプルでエレガントなデータを使用しています。 ここでのチュートリアルでは、これを引き続き使用します。
5.1. データ・モデル
私たちが持っているデータの構造を調べることから始めましょう。 私たちが作成するデータパイプラインのほとんどは、データの異常に非常に敏感であるため、可能な限りデータをクリーンアップする必要があります。
データ分析を実行するための洗練された方法とツールがありますが、まずは目視検査から始めます。 簡単に分析すると、入力データにはJSON形式でキャプチャされたイベントがあり、単一のイベントには一般的な属性が含まれていることがわかります。
{
"time": "2015-09-12T02:10:26.679Z",
"channel": "#pt.wikipedia",
"cityName": null,
"comment": "Houveram problemas na última edição e tive de refazê-las, junto com as atualizações da página.",
"countryIsoCode": "BR",
"countryName": "Brazil",
"isAnonymous": true,
"isMinor": false,
"isNew": false,
"isRobot": false,
"isUnpatrolled": true,
"metroCode": null,
"namespace": "Main",
"page": "Catarina Muniz",
"regionIsoCode": null,
"regionName": null,
"user": "181.213.37.148",
"delta": 197,
"added": 197,
"deleted": 0
}
このイベントを定義する属性はかなりたくさんありますが、Druidを使用するときに特に興味深いものがいくつかあります。
- タイムスタンプ
- 寸法
- 指標
Druidは、タイムスタンプ列として識別するために特定の属性を必要とします。 ほとんどの場合、Druidのデータパーサーは最適な候補を自動的に検出できます。 ただし、特にデータに適切な属性がない場合は、常に選択することができます。
ディメンションは、Druidがそのまま保存する属性です。 グループ化、フィルタリング、アグリゲーターの適用など、あらゆる目的に使用できます。 取り込み仕様でディメンションを選択することもできます。これについては、チュートリアルで詳しく説明します。
メトリクスは、ディメンションとは異なり、デフォルトで集計形式で保存される属性です。 Druidの集計関数を選択して、取り込み中にこれらの属性に適用できます。 ロールアップを有効にすると、これらはコンパクトなデータ表現につながる可能性があります。
5.2. 摂取方法
次に、Druidでデータの取り込みを実行するさまざまな方法について説明します。 通常、イベント駆動型データは本質的にストリーミングです。つまり、ウィキペディアの編集のように、時間の経過とともにさまざまなペースで生成され続けます。
ただし、昨年行われたすべてのWikipediaの編集のように、データが本質的に静的である場合は、一定期間データをバッチ処理することがあります。
また、解決すべきさまざまなデータのユースケースがある可能性があり、Druidはそれらのほとんどを素晴らしいサポートを提供しています。 データパイプラインでDruidを使用する最も一般的な2つの方法を見てみましょう。
- ストリーミングの取り込み
- バッチ取り込み
ドルイドにデータを取り込む最も一般的な方法は、ドルイドがKafkaから直接データを読み取ることができるApacheストリーミングサービスを使用することです。 Druidは、Kinesisなどの他のプラットフォームもサポートしています。 Kafkaインデックス作成タスクを作成および管理するオーバーロードプロセスでスーパーバイザーを開始する必要があります。 オーバーロードプロセスのHTTPPOSTコマンドを介してJSONファイルとしてスーパーバイザー仕様を送信することにより、スーパーバイザーを開始できます。
または、データをバッチで取り込むこともできます(たとえば、ローカルファイルまたはリモートファイルから)。 これは、HadoopファイルシステムからHadoopファイル形式でデータを取り込むためのHadoopベースのバッチ取り込みの選択肢を提供します。 より一般的には、ネイティブバッチの取り込みを順次または並行して選択できます。 外部依存関係がないため、より便利でシンプルなアプローチです。
5.3. タスク仕様の定義
このチュートリアルでは、入力データのネイティブバッチ取り込みタスクを設定します。 Druidコンソールからタスクを構成するオプションがあります。これにより、直感的なグラフィカルインターフェイスが提供されます。 または、タスク仕様をJSONファイルとして定義し、スクリプトまたはコマンドラインを使用してオーバーロードプロセスに送信することもできます。
まず、wikipedia-index.jsonというファイルにデータを取り込むための簡単なタスク仕様を定義しましょう。
{
"type" : "index_parallel",
"spec" : {
"dataSchema" : {
"dataSource" : "wikipedia",
"dimensionsSpec" : {
"dimensions" : [
"channel",
"cityName",
"comment",
"countryIsoCode",
"countryName",
"isAnonymous",
"isMinor",
"isNew",
"isRobot",
"isUnpatrolled",
"metroCode",
"namespace",
"page",
"regionIsoCode",
"regionName",
"user",
{ "name": "added", "type": "long" },
{ "name": "deleted", "type": "long" },
{ "name": "delta", "type": "long" }
]
},
"timestampSpec": {
"column": "time",
"format": "iso"
},
"metricsSpec" : [],
"granularitySpec" : {
"type" : "uniform",
"segmentGranularity" : "day",
"queryGranularity" : "none",
"intervals" : ["2015-09-12/2015-09-13"],
"rollup" : false
}
},
"ioConfig" : {
"type" : "index_parallel",
"inputSource" : {
"type" : "local",
"baseDir" : "quickstart/tutorial/",
"filter" : "wikiticker-2015-09-12-sampled.json.gz"
},
"inputFormat" : {
"type": "json"
},
"appendToExisting" : false
},
"tuningConfig" : {
"type" : "index_parallel",
"maxRowsPerSegment" : 5000000,
"maxRowsInMemory" : 25000
}
}
}
前のサブセクションで経験した基本事項に関して、このタスク仕様を理解しましょう。
- index_parallel タスクを選択しました。これにより、ネイティブバッチの取り込みが並行して行われます。
- このタスクで使用するデータソースの名前は「wikipedia」です。
- データのタイムスタンプは、属性「time」から取得されます
- ディメンションとして追加しているデータ属性は多数あります
- 現在のタスクでは、データにメトリックを使用していません
- このタスクでは、デフォルトで有効になっているロールアップを無効にする必要があります
- タスクの入力ソースは、wikiticker-2015-09-12-sampled.json.gzという名前のローカルファイルです。
- TuningConfigで定義できるセカンダリパーティションは使用していません。
このタスク仕様は、データファイル wikiticker-2015-09-12-sampled.json.gz をダウンロードし、Druidが実行されているローカルマシンに保持していることを前提としています。 DruidをDockerコンテナーとして実行している場合、これは難しい場合があります。 幸い、Druid には、 quickstart /tutorialの場所にデフォルトで存在するこのサンプルデータが付属しています。
5.4. タスク仕様の提出
最後に、 curl などのツールを使用して、コマンドラインからこのタスク仕様をオーバーロードプロセスに送信できます。
curl -X 'POST' -H 'Content-Type:application/json' -d @wikipedia-index.json http://localhost:8081/druid/indexer/v1/task
通常、上記のコマンドは、送信が成功した場合にタスクのIDを返します。 Druidコンソールを使用するか、クエリを実行することで、取り込みタスクの状態を確認できます。これについては、次のセクションで説明します。
5.5. 高度な取り込みの概念
Druidは、処理するデータが大量にある場合に最適です。確かに、このチュートリアルで見たような種類のデータではありません。 現在、大規模な機能を有効にするには、Druidアーキテクチャが適切なツールとトリックを提供する必要があります。
このチュートリアルではそれらを使用しませんが、ロールアップとパーティショニングについて簡単に説明しましょう。
イベントデータのサイズはすぐに大量になり、達成できるクエリのパフォーマンスに影響を与える可能性があります。 多くのシナリオでは、時間の経過に伴うデータの要約が可能です。 これは、ドルイドのロールアップとして知られているものです。 ロールアップが有効になっている場合、Druidは、取り込み中に同じディメンションとタイムスタンプを持つ行をロールアップするように努めます。 スペースを節約できますが、ロールアップによってクエリの精度が低下するため、合理的に使用する必要があります。
データ量の増加に直面してより良いパフォーマンスを達成するための別の潜在的な方法は、データ、したがってワークロードを分散することです。 デフォルトでは、Druid は、タイムスタンプに基づいてデータを1つ以上のセグメントを含む時間チャンクに分割します。 さらに、データの局所性を向上させるために、自然な次元を使用して2次パーティショニングを行うことを決定できます。 さらに、Druidは、最初にタイムスタンプで、次に構成した他のディメンションで、すべてのセグメント内のデータを並べ替えます。
6. データのクエリ
データの取り込みが正常に実行されると、クエリを実行できるようになります。 Druidでデータをクエリする方法は複数あります。 Druidでクエリを実行する最も簡単な方法は、Druidコンソールを使用することです。 ただし、HTTPコマンドを送信するか、コマンドラインツールを使用してクエリを実行することもできます。
Druidでクエリを作成する2つの主要な方法は、ネイティブクエリとSQLのようなクエリです。 これらの両方の方法でいくつかの基本的なクエリを作成し、curlを使用してHTTP経由で送信します。 Druidで以前に取り込んだデータに対して簡単なクエリを作成する方法を見てみましょう。
6.1. ネイティブクエリ
Druid のネイティブクエリはJSONオブジェクトを使用し、処理のためにブローカーまたはルーターに送信できます。 他の方法の中でも特に、HTTPPOSTコマンドを介してクエリを送信して同じことを行うことができます。
simple_query_native.jsonという名前でJSONファイルを作成しましょう。
{
"queryType" : "topN",
"dataSource" : "wikipedia",
"intervals" : ["2015-09-12/2015-09-13"],
"granularity" : "all",
"dimension" : "page",
"metric" : "count",
"threshold" : 10,
"aggregations" : [
{
"type" : "count",
"name" : "count"
}
]
}
これは、2019年9月12日から13日の間にページ編集のトップ数を受け取ったトップ10ページをフェッチする単純なクエリです。
curl を使用して、これをHTTP経由で投稿しましょう。
curl -X 'POST' -H 'Content-Type:application/json' -d @simple_query_native.json http://localhost:8888/druid/v2?pretty
この応答には、JSON形式の上位10ページの詳細が含まれています。
[ {
"timestamp" : "2015-09-12T00:46:58.771Z",
"result" : [ {
"count" : 33,
"page" : "Wikipedia:Vandalismusmeldung"
}, {
"count" : 28,
"page" : "User:Cyde/List of candidates for speedy deletion/Subpage"
}, {
"count" : 27,
"page" : "Jeremy Corbyn"
}, {
"count" : 21,
"page" : "Wikipedia:Administrators' noticeboard/Incidents"
}, {
"count" : 20,
"page" : "Flavia Pennetta"
}, {
"count" : 18,
"page" : "Total Drama Presents: The Ridonculous Race"
}, {
"count" : 18,
"page" : "User talk:Dudeperson176123"
}, {
"count" : 18,
"page" : "Wikipédia:Le Bistro/12 septembre 2015"
}, {
"count" : 17,
"page" : "Wikipedia:In the news/Candidates"
}, {
"count" : 17,
"page" : "Wikipedia:Requests for page protection"
} ]
} ]
6.2. ドルイドSQL
Druidには組み込みのSQLレイヤーがあり、使い慣れたSQLのような構成でクエリを作成する自由を提供します。 Apache Calciteを利用して、クエリを解析および計画します。 ただし、Druid SQLは、SQLクエリをデータプロセスに送信する前に、クエリブローカーでネイティブクエリに変換します。
以前と同じクエリを作成する方法を見てみましょう。ただし、DruidSQLを使用します。 前と同じように、simple_query_sql.jsonという名前のJSONファイルを作成します。
{
"query":"SELECT page, COUNT(*) AS counts /
FROM wikipedia WHERE \"__time\" /
BETWEEN TIMESTAMP '2015-09-12 00:00:00' AND TIMESTAMP '2015-09-13 00:00:00' /
GROUP BY page ORDER BY Edits DESC LIMIT 10"
}
クエリは読みやすくするために複数行に分割されていますが、1行に表示される必要があることに注意してください。 繰り返しになりますが、前と同じように、このクエリをHTTP経由でPOSTしますが、別のエンドポイントに送信します。
curl -X 'POST' -H 'Content-Type:application/json' -d @simple_query_sql.json http://localhost:8888/druid/v2/sql
出力は、ネイティブクエリで以前に達成したものと非常に似ているはずです。
6.3. クエリタイプ
前のセクションで、間隔に基づいてメトリック「カウント」の上位10件の結果をフェッチするタイプのクエリを見ました。 これはDruidがサポートするクエリの一種であり、TopNクエリとして知られています。 もちろん、フィルターと集計を使用することで、この単純なTopNクエリをさらに面白くすることができます。 しかし、それはこのチュートリアルの範囲ではありません。 ただし、ドルイドには他にもいくつかの質問があり、興味を引く可能性があります。
人気のあるものには、TimeseriesやGroupByなどがあります。
Timeseries クエリは、JSONオブジェクトの配列を返します。各オブジェクトは、時系列クエリで説明されている値(たとえば、過去1か月のディメンションの日平均)を表します。
GroupBy クエリは、JSONオブジェクトの配列を返します。各オブジェクトは、group-byクエリで説明されているグループ化を表します。 たとえば、別のディメンションでグループ化された過去1か月のディメンションの日平均をクエリできます。
Scan 、 Search 、 TimeBoundary 、 SegmentMetadata 、 DatasourceMetadata など、他にもいくつかのクエリタイプがあります。
6.4. 高度なクエリの概念
Druidは、興味深いデータアプリケーションを作成するための高度なクエリを作成するための複雑なメソッドをいくつか提供しています。 これらには、信じられないほどのクエリパフォーマンスを提供しながら、データをスライスおよびダイシングするさまざまな方法が含まれます。
それらの詳細な説明はこのチュートリアルの範囲を超えていますが、結合とルックアップ、マルチテナンシー、クエリキャッシングなどの重要なものについて説明しましょう。
Druidは、データを結合する2つの方法をサポートしています。 1つ目は結合演算子で、2つ目はクエリ時のルックアップです。 ただし、クエリのパフォーマンスを向上させるには、クエリ時の結合を避けることをお勧めします。
マルチテナンシーとは、同じDruidインフラストラクチャ上で複数のテナントをサポートしながら、論理的な分離を提供する機能を指します。 Druidでこれを実現するには、テナントごとに個別のデータソースを使用するか、テナントごとにデータを分割します。
そして最後に、クエリキャッシングは、データ集約型アプリケーションのパフォーマンスの鍵です。 Druidは、セグメントおよびクエリ結果レベルでのクエリ結果キャッシュをサポートします。 さらに、キャッシュデータはメモリまたは外部永続ストレージに常駐できます。
7. 言語バインディング
Druidは、取り込み仕様の作成とJSONでのクエリの定義を優れた方法でサポートしていますが、特にクエリが複雑になる場合は、これらのクエリをJSONで定義するのが面倒な場合があります。 残念ながら、ドルイドはこの点で私たちを助けるために特定の言語でクライアントライブラリを提供していません。 しかし、コミュニティによって開発されたかなりの数の言語バインディングがあります。 そのようなクライアントライブラリの1つは、Javaでも利用できます。
Javaでこのクライアントライブラリを使用して以前に使用したTopNクエリを構築する方法をすぐに確認できます。
Mavenで必要な依存関係を定義することから始めましょう。
<dependency>
<groupId>in.zapr.druid</groupId>
<artifactId>druidry</artifactId>
<version>2.14</version>
</dependency>
この後、クライアントライブラリを使用して、TopNクエリを作成できるようになります。
DateTime startTime = new DateTime(2015, 9, 12, 0, 0, 0, DateTimeZone.UTC);
DateTime endTime = new DateTime(2015, 9, 13, 0, 0, 0, DateTimeZone.UTC);
Interval interval = new Interval(startTime, endTime);
Granularity granularity = new SimpleGranularity(PredefinedGranularity.ALL);
DruidDimension dimension = new SimpleDimension("page");
TopNMetric metric = new SimpleMetric("count");
DruidTopNQuery query = DruidTopNQuery.builder()
.dataSource("wikipedia")
.dimension(dimension)
.threshold(10)
.topNMetric(metric)
.granularity(granularity)
.filter(filter)
.aggregators(Arrays.asList(new LongSumAggregator("count", "count")))
.intervals(Collections.singletonList(interval)).build();
この後、必要なJSON構造を簡単に生成できます。これは、HTTPPOST呼び出しで使用できます。
ObjectMapper mapper = new ObjectMapper();
String requiredJson = mapper.writeValueAsString(query);
8. 結論
このチュートリアルでは、イベントデータとApacheDruidアーキテクチャの基本について説明しました。
さらに、ローカルマシンでDockerコンテナーを使用してプライマリDruidクラスターをセットアップしました。 次に、ネイティブバッチタスクを使用してDruidにサンプルデータセットを取り込むプロセスも実行しました。 この後、Druidでデータをクエリするさまざまな方法を確認しました。 最後に、Javaのクライアントライブラリを調べて、Druidクエリを作成しました。
ドルイドが提供しなければならない機能の表面をかじったところです。 ドルイドがデータパイプラインの構築とデータアプリケーションの作成に役立つ可能性はいくつかあります。 高度な取り込みおよびクエリ機能は、ドルイドの力を効果的に活用するための、学ぶべき明らかな次のステップです。
さらに、必要に応じて個々のプロセスをスケーリングする適切なドルイドクラスターを作成することは、メリットを最大化するためのターゲットである必要があります。