以前の投稿( なぜApache Igniteが必要なのか )で始まったトピック「 Ignite / GridGainについてのアクセス可能な言語」の続きで、製品を「単なる人間」に使用する例を見てみましょう。
テラバイトのデータ、数百台のマシンのクラスター、 ビッグデータ 、高負荷、 機械学習 、 マイクロサービス 、その他の恐ろしい言葉-これらはすべてIgniteで利用可能です。 しかし、これはそれほど野心的な目的に適していないという意味ではありません。
今日は、Igniteがオブジェクトを簡単に保存し、ネットワーク上で共有し、.NETとJavaの相互作用を提供する方法を見ていきます。
.NET APIについて詳しく説明しますが、Javaにはいくつかのことが当てはまります。
組み込みデータベース
Igniteはインストールと構成を必要とせず、プロセスで直接起動できます。バージョン2.1以降、ディスクにデータを保存できます 。 これに高速でコンパクトな組み込みシリアル化を追加し、オブジェクトをディスクに保存する最も簡単な方法を取得します。
var cfg = new IgniteConfiguration { // PersistentStoreConfiguration = new PersistentStoreConfiguration() }; var ignite = Ignition.Start(cfg); ignite.SetActive(true); // persistence var cache = ignite.GetOrCreateCache<int, MyClass>("foo"); cache[cache.GetSize() + 1] = new MyClass();
それがすべてのコードです! 数回起動し、データが失われないことを確認します。
同時に、 MyClass
は要件はありません! デリゲート、匿名の型とメソッド 、 式ツリー 、 動的オブジェクト など 、あらゆる入れ子の任意のものを指定できます。 あなたのシリアライザーはこれを行うことができますか? そうは思いません 唯一の例外はIntPtr
を実行できないことですが、これはあなた自身のためです。 ポインターをシリアル化するのは悪い考えです。
さらに、シリアル化されたオブジェクトは「ブラックボックス」ではありませんIBinaryObject
使用IBinaryObject
と、オブジェクトの個々のフィールドを選択的に受信および変更できIBinaryObject
。
using (var ignite = Ignition.Start()) { var cache = ignite.CreateCache<int, object>("c"); // Type, ! cache[1] = typeof(int); Console.WriteLine(ReferenceEquals(typeof(int), cache[1])); // true // . var greeting = "Hi!"; cache[2] = (Action) (() => { Console.WriteLine(greeting); }); ((Action) cache[2])(); // , : Hi! // ! // Binary - . ICache<int, IBinaryObject> binCache = cache.WithKeepBinary<int, IBinaryObject>(); // BinaryObject. IBinaryObject binDelegate = binCache[2]; // target0 - , . IBinaryObject target = binDelegate.GetField<IBinaryObject>("target0"); // greeting. target = target.ToBuilder().SetField("greeting", "Woot!").Build(); // . binCache[2] = binDelegate.ToBuilder().SetField("target0", target).Build(); // , , . ((Action)cache[2])(); // Woot! // . cache[3] = new { Foo = "foo", Bar = 42 }; // . Console.WriteLine(binCache[3]); // ...[<Bar>i__Field=42, <Foo>i__Field=foo] // . dynamic dynObj = new ExpandoObject(); dynObj.Baz = "baz"; dynObj.Qux = 1.28; cache[4] = dynObj; Console.WriteLine(binCache[4]); // _keys=[Baz, Qux], _dataArray=[baz, 1.28, ] }
もちろん、キーと値の両方のモード( ICache.Put
、 ICache.Get
)とSQL 、 LINQ 、 全文検索の両方で、このすべてのデータを操作できます 。
ビルトインモードに加えて、IgniteはODBCおよびJDBCを介して操作できることに注意してください。
プロセス間通信
Google Chromeブラウザーは、タブごとに個別のプロセスを使用します。 Igniteでこのアプローチを実装するのは非常に簡単です。キャッシュを介してデータを簡単かつ透過的に交換し、 分散データ構造を介してコード実行を同期し、 Messagingを介してメッセージを交換できます 。
プロセスは公平にできます。 たとえば、ナビゲーション履歴はReplicated
されたキャッシュに保存できるため、各タブはリンクをクリックしたときに履歴を更新し、読み取ることができ、プロセスの1つが落ちてもデータの安全性に影響しません。 コードでは、すべてコレクションの操作のように見えます。
var history = ignite.GetCache<Guid, HistoryItem>("history"); history.Put(Guid.NewGuid(), new HistoryItem(url, DateTime.UtcNow)); // 10 history.AsCacheQueryable() .Select(x => x.Value) .OrderByDescending(x => x.Date) .Take(10);
Igniteは、クラスター全体でスレッドセーフなデータアクセスを提供します。
クロスプラットフォームコラボレーション
Igniteには、Java、.NET、C ++の完全なAPIがあります。 Windows、Linux、Macで実行できます。 たとえば、アプリケーションの一部をJavaで記述してLinuxで実行し、他の部分を.NETおよびWindowsで実行できます。
シリアル化プロトコルは汎用的であり、あるプラットフォームで記録されたオブジェクトを別のプラットフォームで読み取ることができます。 上記のデータ構造もクロスプラットフォームです。
さらに、Javaで記述されたサービスを .NET側から透過的に呼び出すことができます。
public class MyJavaService implements Service { public String sayHello(String x) { return "Hello, " + x; } } ignite.services().deployClusterSingleton("myJavaSvc", new MyJavaService());
interface IJavaService // { string sayHello(string str); // , } var prx = ignite.GetServices().GetServiceProxy<IJavaService>("myJavaSvc"); string result = prx.sayHello("Vasya");
他の場所と同様に、文字列の代わりに、任意のオブジェクトを渡すことができます。
シンプルなチャットの例を使用して、クロスプラットフォームのIgniteクラスターを構築するための詳細なガイドはこちら (英語)です。
おわりに
Igniteは、シリアル化、メモリまたはディスクへの保存、ネットワークを介した転送、一貫性とスレッドセーフの確保など、あらゆるデータの操作を迅速かつ楽しくします。 小規模なプロジェクトでも、将来のワークロードの増加を心配することなく、製品の恩恵を受けることができます。