Realm Blog

Realm Cloudベータ版を発表しました

Realm PlatformのPaaS (Platform as a Service)となるRealm Cloudのベータ版を発表しました。Realm Cloudにより、オフラインファースト機能やリアルタイムのデータ同期機能をモバイルアプリに簡単に追加できます。Realm製品は、使いやすさを中心に展開してきました。世界中で何千人もの開発者がiOSとAndroidアプリのデバイスサイドにRealmを使用しています。Realm Cloudは、それらのアプリを簡単に拡張することを目的としています。

Realm Cloudは現在登録者数に制限を設けたベータ版の初期段階で、公開中のウェイトリストから毎週新しい開発者を招待しています。最初のアクティブな500人のベータユーザーは、Realmの“チャーターユーザー”としてディスカウントやRealmのノベルティの対象になります。

今Realm Cloudが必要な理由

Realm Platformは、オンプレミス製品として今からちょうど1年前となる去年の1月にリリースされました。昨年は、Realmのようなリアルタイムかつオフラインファーストのデータプラットフォームに加え、サーバーサイドのチームとオンプレミスの実装を必要とする中規模から大規模の顧客向けにRealm Platformを展開してきました。このような顧客を成功を導く過程でさまざまな需要を理解し、よりスケーラブルで信頼性が高く、開発者に優しいオンプレミス製品のリリースが決定しました。(お客様の声はこちらをご覧ください。)現在の顧客だけでなく、クラウドサービスが適していない顧客の要望に応えるべく、製品の改善が続けられます。

Realm Cloudを開発する際、サーバーサイド実装の手間や商用アプリと大規模企業向けの価格体系が課題となり、Realm Platformに興味を持つたくさんのスタートアップ企業、小規模企業、大規模企業における小さなプロジェクトチームでRealm Platformを採用できずにいました。

Realm Cloudは、それらの課題の突破口となります。Realm Cloudは簡単に使い始めることができ、直感的なユーザーエクスペリエンスとRealm Studioとのシームレスな動作により、たった10分程で最初のリアルタイムなアプリを開発、稼働できます。サーバーサイドの実装はなく、サインアップして使用を始めるだけです。現時点ではベータ版のため、価格やパッケージの詳細は未定ですが、使用開始は無償で、月額の価格体系では導入し易い価格設定にし、アプリの必要に応じて拡張できるようにする予定です。(ベータ版は完全に無償です。)

Realm Cloudの仕組みと使用開始の手順

Realm Cloudを計画した当初のゴールは、Realm Platformの操作を自動化する以上の機能を提供することでした。APIを含むすべてを簡単に使用できるようにすることが目的でした。そのため、クエリベースの新しい同期メカニズムを追加しました。

Realm Platformの発表以来、APIはいたってシンプルでした。URLで同期構成を提供し、Userオブジェクトを使用して同期したRealmを開きます。

// 構成を作成
let syncServerURL = URL(string: "realm://localhost:9080/~/userRealm")!
let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: syncServerURL))

// リモートのRealmを開く
let realm = try! Realm(configuration: config)
// このRealmに加えられた変更はすべてのデバイスで同期されます!

クライアントのデバイスでRealmに同期されたデータは、Realm Object Serverのコピーとともに、常に最新の状態を維持します。データベースを単体で使用した場合の構成を反映することから、このAPIはRealm開発者にとって見慣れたものでした。しかし、この単純さには、アプリケーションデータを複数のプライベートまたは共有Realmに分割しなくてはならないという制約がありました。

ほとんどのデータモデルにとってはシンプルでしたが、その他は同じようにマップしませんでした。それもこれで終わりです。

クエリベースの同期により、Realmのクエリエンジンを使用してクライアントのデバイスにおいて同期されたRealmで、必要なデータのサブセットを定義します。これにより、アプリケーションはユーザーが必要とするデータのみキャッシュし、ユーザー間で共有されたデータをより効率的に処理します。

新しい機能を使用するには、同期構成で有効化するだけです。次に、Realmでクエリを実行し、そのクエリをサブスクライブします。

// 一部同期されたRealmを作成
let config = Realm.Configuration(syncConfiguration: SyncConfiguration(user: user, realmURL: realmURL, partial: true))
let realm = Realm(configuration: config)

// 匿名のサブスクリプションを作成
let adults = realm.objects(Person.self).filter("age >= 18").subscribe()

サーバーがクエリを実行し、一致するすべてのオブジェクトを同期します。このクエリは、サブスクリプションの有効期間にわたって維持され、データが変更された場合、サーバーはクエリを再評価し、すべての変更を同期します。Realmはリアクティブなアーキテクチャをもつので、既存の通知APIを使用してアプリを最新の状態に保つことができます。

// 通常の変更通知
self.notificationToken = adults.observe { (changes: RealmCollectionChange) in
    switch changes {
    case .initial:
        self.tableView.reloadData()
        break
    case .update(_, let deletions, let insertions, let modifications):
        self.tableView.beginUpdates()
        self.tableView.insertRows(at: insertions.map { IndexPath(row: $0, section: 0) }, with: .automatic)
        self.tableView.deleteRows(at: deletions.map { IndexPath(row: $0, section: 0) }, with: .automatic)
        self.tableView.reloadRows(at: modifications.map { IndexPath(row: $0, section: 0) }, with: .automatic)
        self.tableView.endUpdates()
        break
    case .error(let err):
        fatalError("\(err)")
        break
    }
}

アプリケーションは、必要な分のクエリを実行できます。同期プロトコルはそれらを正規化し、クライアントを同期するために必要最低限の操作のみ送信します。データがこれ以上必要ない場合、データを取り消し、クエリ用にキャッシュされたデータはデバイスから削除されます。

// 匿名のサブスクリプションを削除
realm.unsubscribe(adults)

// 名前付きのサブスクリプションを作成
let adults = realm.objects(Person.self).filter("age >= 18").subscribe(named: "Adults")

// 名前付きのサブスクリプションを削除
let didRemove = realm.unsubscribe("Adults")

クエリベースの同期を補完するオブジェクトレベルの詳細なサポートを含む情報は、随時更新予定です。ベータ版にご登録いただいた皆様からのフィードバックをお待ちしております。

Realm Cloudのチャーター開発者になりましょう

Realm Cloudのベータ版は初期段階で登録者数に制限があるため、ウェイトリストにサインアップした順番で開発者を招待しています。Realm Cloudアプリを稼働した最初の500ユーザーは、販売開始初年度における50%割引の対象になります。さらに、ベータ期間中に実用的なフィードバックをご提供いただいた場合、ステッカー、Tシャツ、水筒などのノベルティを差し上げます。


Realm Team

At Realm, our mission is to help developers build better apps faster. We provide a unique set of tools and platform technologies designed to make it easy for developers to build apps with sophisticated, powerful features — things like realtime collaboration, augmented reality, live data synchronization, offline experiences, messaging, and more.

Everything we build is developed with an eye toward enabling developers for what we believe the mobile internet evolves into — an open network of billions of users and trillions of devices, and realtime interactivity across them all.

記事の更新情報を受け取る