Docs 菜单

Docs 主页开发应用程序Atlas Device SDKs

Atlas Device SDK 简介

在此页面上

  • 移动和边缘开发挑战
  • 与 MongoDB Atlas 同步数据
  • 使用 Atlas App Services
  • Atlas Device SDK 与 MongoDB 驱动程序对比
  • SDK Wrap Realm 数据库
  • Realm 与其他数据库对比
  • 实时查询
  • 活动对象
  • 原生数据库引擎

Atlas Device SDK 是一套工具集,可加速各种设备上的应用程序开发:

  • 内置同步客户端,可以在设备之间以及与 MongoDB Atlas 后端同步您的数据。

  • 离线优先对象数据库,用于在设备上持久化数据。

  • 能够调用 Atlas Function 以在 cloud 中执行工作。

  • 用于直接从您的应用查询 MongoDB 数据源的客户端。

您可以使用 SDK 的对象存储 Realm 来读取、写入响应设备上的数据变化。添加 Device Sync、Atlas Function 或 MongoDB Atlas 客户端,以利用 MongoDB Atlas 功能并从您的应用访问数据源。

移动和边缘开发者面临着许多独特的挑战:

  • 应对移动设备和边缘设备不可预测的环境。连接可能会丢失,设备可能随时关闭,客户端通常在发布后很久才进行更新。

  • 维护客户端、后端 API 和数据库之间的通用数据模式和 API。

  • 随时了解生态系统中所有组件的安全漏洞。

  • 在网络、数据库存储和应用程序内存之间一致地序列化对象。

  • 使用一种或多种操作系统的语言和框架进行编程。

所有这些挑战都带来了不同的障碍。您可以使用各种库和框架来单独解决每个问题。移动和边缘开发者都知道,为每个问题选择最佳解决方案并进行正确的权衡是一项挑战。

多种环境的结合带来了更多的挑战。例如,您可以在 Android 客户端上使用 Java 库来序列化对象,但该库无法在 iOS 上运行。而且这没有考虑后端服务之间的一致性。

SDK 解决了许多常见的移动和边缘编程难题:

  • 设备存储:SDK 可以直接在客户端设备上运行。使用每种平台的原生查询语言来访问对象。存储、访问和更新数据是一种简单且轻量的操作。

  • 网络可靠性:SDK 是离线优先的。您始终在设备上读取和写入持久层,而不是通过网络。启用 Device Sync 后,SDK 将在后台线程中通过网络与 App Services 同步数据。同步协议可以一致地解决每个客户端和所链接的 Atlas 集群中的冲突。

  • 反应式用户界面:活动对象始终反映数据库中存储的最新数据。您可以订阅更改,从而使用户界面始终保持最新状态。

客户端应用程序生成大量数据。无论是用户上传的评论和评分、博客上的帖子和评论,还是厨房中的库存,您都需要将该数据存储在某个位置。

SDK 使用 Atlas Device Sync 在客户端和 MongoDB Atlas 之间同步应用程序数据。Atlas Device Sync 在您应用程序的一个后台线程中处理网络访问和解决冲突,因此无论网络状况如何,您的应用程序逻辑都保持不变。

一旦您的客户端数据位于 Atlas 中,您就可以利用完整的 Atlas 开发者数据平台。利用 MongoDB 的完整功能执行聚合和其他复杂的工作负载。或者将您的 Atlas 实例连接到Charts以实时可视化您的数据。将数据存储在 Atlas 中可以轻松地在用户和平台之间共享数据。

SDK 与 App Services 集成,可以轻松、安全地处理应用程序中的数据:

如果需要,请使用 SDK 而不是 MongoDB 驱动程序:

  • 针对移动和边缘设备进行优化的跨平台对象存储,可以自动与 MongoDB Atlas 同步数据。

  • 跨用户和设备同步数据时的内置冲突解决功能。

  • 无论网络连接如何,始终能够访问设备上的数据。

  • 由数据驱动的响应式用户界面。

  • 面向客户端设备的内置用户管理和身份验证。

  • 支持处理复杂的用户权限和同步逻辑,以确定数据客户端可以读取和写入哪些内容。

  • 针对来自移动或边缘设备的繁重仅插入工作负载进行了优化。

  • 支持从客户端执行 Atlas Function。

在以下情况下,请使用 MongoDB 驱动程序,而不要使用 SDK:

  • 您在自己的基础架构上托管 MongoDB。SDK 要么仅适用于设备,要么与 MongoDB Atlas 配合使用。

  • 您希望直接使用文档而不是对象,或者您有自己的映射层。SDK 将数据作为对象存储在设备上,Device Sync 会在与 Atlas 同步时将它们映射到 MongoDB 文档。

  • 您已经拥有 MERN 或 MEAN 等堆栈,并且不需要 SDK 提供的功能。

SDK 在设备上使用的持久层是 Realm。SDK 封装了 Realm Core C++ 数据库,并提供相关语言惯用的 API 来处理文件系统上的文件并执行读写操作。

Realm 是一个响应式、面向对象、跨平台的移动数据库:

  • 响应式:查询数据的当前状态并订阅状态更改(例如查询结果),甚至对单个对象的更改。

  • 面向对象:将数据组织为对象,而不是行、文档或列。

  • 跨平台:在 iOS、Android、Linux、macOS 或 Windows 上使用相同的数据库。只需为您使用的每个 SDK 定义一个模式即可。

  • 移动:专为移动设备的低功耗、电池敏感型实时环境而设计。

Realm 是一种跨平台且针对移动设备进行了优化的替代方案,可替代其他移动数据库(例如 SQLite , Core Data 房间。

Realm 数据模型与关系数据库和文档数据库类似,但又有明显的区别。Realm 将对象存储在设备上的文件中,应用程序可以使用多个域文件来组织数据和实施访问控制。

Realm 不是一个单一的应用程序级数据库。
基于其他数据库系统的应用程序通常将所有数据存储在单个数据库中。应用程序通常将数据拆分到多个域,以更高效地组织数据并实施访问控制。
Realm 不是关系表。
关系数据库中的规范化表仅存储一种类型的信息,例如街道地址或商店库存中的商品。Realm 可以包含任意数量与给定领域相关的对象类型。
Realm 不是无模式文档的集合。
文档数据库不一定对每个集合中数据的模式进行严格限制。虽然在形式上与文档类似,但每个 Realm 对象都符合域中特定对象类型的模式。对象不能包含其模式未描述的属性。

您可以通过查找、过滤对象并对其排序来读取存储在 Realm 中的数据。您可以选择按键的路径对这些结果进行分区,这样可以更方便地填充分区表。

所有 Realm 对象均为活动对象,这表示在修改它们时会自动进行更新。每当发生任何属性变更时,Realm 均会发出通知事件。

您可以使用活动对象以原生方式处理面向对象的数据,而无需 ORM 工具。活动对象是底层存储数据的直接代理,这意味着活动对象不直接包含数据。相反,活动对象始终引用磁盘和 延迟加载 上的最新数据 属性值(当您从集合访问这些值时)。这意味着一个 Realm 可以包含许多对象,但只需为应用程序实际使用的数据支付性能成本。

对实时对象的有效写入操作会自动持久化到域并传播到任何其他同步客户端。您无需调用更新方法、修改域或以其他方式“推送”更新。

Realm 是一个用 C++ 从零开始编写的完整数据库,而不是构建在 SQLite 等底层数据库引擎之上。 Realm 的底层存储层使用 B+ 树 来组织对象。因此,Realm 控制从存储级别一直到访问级别的优化。

Realm 将数据存储在 Realm 中,即异构 Realm 对象的集合。您可以将每个 Realm 视为一个数据库。Realm 中的每个对象相当于 SQL 数据库表或 MongoDB 文档中的一行。与 SQL 不同,Realm 不会将不同的对象类型分隔到单独的表中。

Realm 将对象存储为属性值组。我们将其称基于列的存储。这意味着,在未建立索引时,对单个对象的查询或写入可能要比基于行的存储的等效操作慢,但由于空间局限性和 CPU 内向量运算,查询多个对象的单个字段或获取多个对象的速度可能会快得多。

Realm 使用 零拷贝 旨在使查询比 ORM 更快,并且通常比原始 SQLite 更快。

Realm 使用一种名为写入时复制的技术,该技术可将每次写入操作的数据复制到磁盘上的新位置,而不是覆盖磁盘上的旧数据。一旦完全写入新的数据副本后,数据库便会更新对该数据的现有引用。仅当客户端应用程序不再引用或主动使用旧数据时,才会对旧数据进行垃圾收集。

由于采用了写入时复制,较旧的数据副本仍然有效,这是因为这些副本中的所有引用依然指向其他有效数据。Realm 利用此特性向客户端应用程序中的不同线程同时提供多个版本的数据。大多数应用程序会将数据刷新与用于控制用户界面的循环器线程的重绘周期联系起来,因为数据的刷新频率只需与用户界面的刷新频率保持一致即可。后台线程上运行时间较久的操作过程(例如,大型写入操作)可在提交更改之前,在较长一段时间内使用单个版本的数据。

写入使用 内存映射 以避免在内存和存储之间来回复制数据。访问器和赋值器通过内存映射读取和写入磁盘。因此,对象数据永远不会存储在应用的堆栈或堆上。默认情况下,数据被内存映射为只读,以防止意外写入。

Realm 使用操作系统级分页功能,并相信每个操作系统均能比仅靠自身的单个库更好地实现内存映射和持久化。

域会重用在数据库写入后产生的空闲空间。但是,即使域中存储的数据量大幅减少,域文件也不会自动缩小。压缩您的域可优化存储空间并尽可能减小文件大小。

您应该时不时压缩域,使其保持在最佳大小。您可以手动执行此操作,也可以将域配置为在启动时压缩。然而,Realm 会回收未使用的空间以供将来写入,因此压缩只是一种节省设备空间的优化。

← 欢迎使用 Atlas Device SDK 文档