Atlas へのデータのストリーム - Kotlin SDK
バージョン 1.10.0 の新機能。
MongoDB Atlas にストリーミングしたい大量のデータを生成するモバイルまたはクライアント アプリケーションがある場合は、Device Sync を使用してデータを一方向に同期できます。 この一方向同期を可能にする機能をData Ingestと呼びます。
Data Ingestを使用して、クライアント アプリケーションから Flexible Sync が有効化されている Atlas App Services アプリにデータをストリーミングできます。
クラウドにデータを送信する気象センサーなど、IoT アプリケーションでデータを一方向に同期したい場合があります。 Data Ingest は、小売アプリからの請求書作成や、アプリケーション イベントのログ記録など、競合の解決を必要としない他のタイプの不変データを書き込む場合にも役立ちます。
Data Ingest は、クライアント側の挿入専用ワークロードのパフォーマンスを向上させるために最適化されています。
Data Ingest にはFlexible Sync が必要です。
非対称オブジェクト
Kotlin SDK は、Data Ingest で使用する特殊なタイプの Realm オブジェクト(非対称オブジェクト)を提供します。
非対称オブジェクトは、いくつかの例外を除いて、 RealmObject
と同じプロパティタイプをほぼサポートしています。
非対称オブジェクトは、 Flexible Sync で構成された同期された Realm でのみ使用できます。 ただし、非対称オブジェクトへのサブスクリプションは作成できません。
AsymmetricRealmObject
にはEmbeddedRealmObject
型を含めることができますが、RealmObject
型やその他のAsymmetricRealmObject
型を含めることはできません。AsymmetricRealmObject
型は、他の Realm オブジェクトのプロパティとして使用することはできません。
さらに、非対称オブジェクトは他の Realm オブジェクトと同じように機能しません。 Realm から非対称オブジェクトを追加、読み取り、更新、または削除することはできません。 非対称オブジェクトのみを作成できます。その後、Device Sync でアプリにリンクされた Atlas データベースに一方向に同期します。 Realm は同期後にこのオブジェクトを削除します。
Tip
同じ Realm 内の非対称オブジェクトと非対称オブジェクト
Kotlin SDK を使用すると、同じ Realm 内で非対称オブジェクトと非対称 Realm オブジェクト( RealmObject
とEmbeddedRealmObject
タイプ)を操作できます。 Realm を開くときに、Sync 構成にすべてのオブジェクトを含めます。 ただし、非対称オブジェクトをサブスクライブすることはできません。
クライアント アプリケーションから一方向にデータを同期
非対称オブジェクトの定義
そのオブジェクトがAsymmetricRealmObject
である場合は、データを一方向に同期できます。 A対称RealmObject インターフェースを実装して非対称オブジェクトを定義します。
// Implements the `AsymmetricRealmObject` interface class WeatherSensor : AsymmetricRealmObject { var id: ObjectId = ObjectId() var deviceId: String = "" var temperatureInFarenheit: Float = 0.0F var barometricPressureInHg: Float = 0.0F var windSpeedInMph: Int = 0 }
App Services Appによる接続と認証
クライアントからバックエンド アプリにデータをストリーミングするには、App Services バックエンドに接続し、ユーザーを認証する必要があります。
val app = App.create(YOUR_APP_ID) val user = app.login(credentials)
Data Ingest は Flexible Sync の機能であるため、接続するアプリはFlexible Sync を使用する必要があります。
Realm を開く
認証済みユーザーが作成されたら、 SyncConfigurationを使用して同期された Realm を開くことができます。 同期するAsymmetricRealmObject
タイプを指定します。
val config = SyncConfiguration.create(user, setOf(WeatherSensor::class)) val realm = Realm.open(config) Log.v("Successfully opened realm: ${realm.configuration.name}")
双方向同期とは異なり、Data Ingest はFlexible Sync サブスクリプションを使用しません。 同じレルムに非対称オブジェクトがある場合は、それらのオブジェクトのみに Flexible Sync サブスクライブ クエリを追加できます。
非対称オブジェクトの作成
Realm が開いたら、 insert()拡張メソッドを使用して、書込みトランザクション内にAsymmetricRealmObject
を作成できます。
// Open a write transaction realm.write { // Create a new asymmetric object val weatherSensor = WeatherSensor().apply { deviceId = "WX1278UIT" temperatureInFarenheit = 6.7F barometricPressureInHg = 29.65F windSpeedInMph = 2 } // Insert the object into the realm with the insert() extension method insert(weatherSensor) // WeatherSensor object is inserted into the realm, then synced to the // App Services backend. You CANNOT access the object locally because it's // deleted from the local realm after sync is complete. }
これらのオブジェクトは読み取れません。 作成が完了すると、App Services バックエンドとリンクされた Atlas データベースに同期されます。
Atlas Device Sync は、このデータのライフサイクルを完全に管理します。 Data Ingest 同期が完了するまでデバイス上に保持され、その後デバイスから削除されます。