Realm为何值得Mongodb去收购

Realm Cloud作为移动数据同步新标准,实时无缝同步数据到云端,Realm让离线数据在信号恢复后依然可用,并能有效解决冲突。

Realm拥有10万+的开发者在使用,下载量超过20亿次。Realm数据库是SQLite和Core Data的有力替代者。

MongoDB收购Realm

MongoDB于2019年4月24日宣布已Realm与签订了最终协议进行收购,此次收购预计将在2020年1月31日前完成。

MongoDB总裁兼首席执行官Dev Ittycheria说:“Realm非常受移动开发者的欢迎,因为它让移动端开发者们能够轻松地使用数据来加速创新,这与我们的理念非常一致。此次收购非常适合我们的全球云数据库MongoDB Atlas,也是对我们的无服务器平台Stitch的补充。我们期待与Realm强大的工程人员,和充满活力的开发人员社区密切合作,通过为开发人员提供更加灵活,直观和全面的移动数据处理方式,以达到在数据库市场中占据更多的份额“。

收购Realm将加深MongoDB与专注于移动端,和无服务器开发的开发者社区的关系。使用Realm的活跃开发人员超过100,000,该解决方案的下载量已超过20亿次。

Realm目前拥有Realm数据库和Realm平台(Realm platform),Realm平台能够帮助用户快速部署,实现无缝的云数据同步能力。

Realm数据库的特性

简化代码

只需通过继承RealmObject来定义schema,使用轻量级的事务进行持久化,并采用简单流畅的API进行查询。

--java-*public class Dog extends RealmObject {
  public String name;
  public int age;
}

Dog dog = new Dog();
dog.name = "Rex";
dog.age = 1;

Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
realm.copyToRealm(dog);
realm.commitTransaction();

RealmResults<Dog> pups = realm.where(Dog.class)
                               .lessThan("age", 2)
                               .findAll();

跨线程的工作

要开始一个新线程,只需获得一个新引用,一切就可以正常工作了。每个线程对数据都有一个一致的视图,这意味着不会存在非法状态。

public void onActivityCreated(Bundle savedInstanceState) {
  realm = Realm.getDefaultInstance();
  customers = realm.where(Customer.class).findAllAsync();
  changeListener = new RealmChangeListener() {
    @Override
    public void onChange(RealmResults<Customer> results) {
      listAdapter.notifyDataSetChanged(); // Update the UI
    }
  };
  customers.addChangeListener(changeListener);
}

数据加密

使用AES-256位加密用户的数据,对全球金融机构来说这已足够强大。

// Generate a random encryption key
byte[] key = new byte[64];
new SecureRandom().nextBytes(key);

// Open the encrypted Realm file
RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
        .encryptionKey(key)
        .build();

// Use the Realm as normal
Realm realm = Realm.getInstance(config);
RealmResults<Dog> results = realm.where(Dog.class).contains("name", "Fido").findAll();

利用活动(live)对象构建reactive应用

Realm对象总是活动的(always live),这意味着它们始终具有最新的数据。通过订阅通知以便在数据变化时获取更新,然后再对UI进行更新,让应用一直操持最新状态。

Realm realm = Realm.getDefaultInstance();

// Query in the background
RealmResults<Dog> results = realm.where(Dog.class)
  .greaterThan("age", 5)
  .findAllAsync();

// Use ChangeListeners to be notified about updates
results.addChangeListener(new RealmChangeListener<RealmResults<Dog>() {
  @Override
  public void onChange(RealmResults<Dog> results) {
    // Update UI
  }
});

// Or RxJava
Observable<RealmResults<Dog>> obs = results.asObservable();

无缝同步数据

Realm数据库能够很好地与Realm平台协同工作,采用Realm扩展平台,只需设置Realm平台实例的URL,其他的都保持不变,它会自动同步数据。

// Authenticating the User
User user = User.login(Credentials.google("google token"),
                       "http://realm.example.com:9080/auth");
// Opening a remote Realm
String realmURL = "realm://realm.example.com:9080/~/userRealm";
SyncConfiguration config = new SyncConfiguration.Builder(user,
                                                         realmURL).build();
Realm realm = Realm.getInstance(config);
// Any changes made to this Realm will be synced across all devices!

realm平台特性(realm platform)

Offline-First新标准

通过Realm平台的“live object”方法和嵌入式数据库,应用程序能够提供很棒的体验——不管有没有信号。Realm的实时同步功能确保数据是可访问的,并且在恢复信号连接时解决冲突。

使用Realm Cloud替换旧数据库

Realm Cloud能够在几分钟内构建强大的跨平台移动应用程序,这些应用程序由云集群支持。通过实时数据驱动功能和离线优先同步特性,快速构建复杂的移动应用程序。并通过功能扩展来让企业专注于提供更好的用户体验,而无需关心网络基础架构的麻烦。

// Open A Synchronized Realm
Realm realm = Realm.getInstance(syncConfig);

// Create a message object
Message myMessage = new Message();
myMessage.setText("Hello World");

// Write and sync the Message object
realm.beginTransaction();
final Message managedMessage = realm.copyToRealm(myMessage);
realm.commitTransaction();

// Query and subscribe to sync all Message objects
RealmResults<Message> messages = realm.where(Message.class).findAllAsync();

// Observe synced changes
results.addChangeListener(new OrderedRealmCollectionChangeListener<RealmResults<Message>>() {
    @Override
    public void onChange(RealmResults<Message> messages, OrderedCollectionChangeSet changeSet) {
      // React to change as normal
    }
});

简化REST API

将Realm作为“RESTless”中间件层,终端可以连接任意数量的服务,随着应用程序的增长很容易伸缩,并且无需维护客户端网络或序列化代码,团队专注于更重要的事情。

同步时间更短

借助Realm的实时数据同步功能,可以大幅提升应用程序的性能,并让用户感觉应用程序始终是在线的,数据作为对象意味着数据的修改在客户端和服务器之间自动同步——不需要序列化或网络代码。

边缘计算能力

边缘计算能力能够在任何地方缓存或处理数据 - 在服务器或设备上,或在其间的任何位置。Realm平台能够快速将数据同步,并把冲突解决和事件处理添加到架构中。