利用MongoDB Atlas、Realm和AWS Wavelength的低延迟创新优势
5G网络的出现预示着低延迟商业机会的未来增长。无论是不断流行的游戏世界、AR/VR、AI/ML,还是更关键的自动驾驶汽车或远程手术领域,对于企业来说,利用低延迟应用服务和连接的机会从未如此之多。
这种通过5G的力量实现的即时通信在很大程度上仍处于发展的初级阶段,但客户正在迅速适应其好处。新的最终用户期望意味着后端服务供应商必须满足不断增长的需求。同时,企业客户希望能够无缝部署他们熟悉的基于云的后端服务,靠近他们的数据源或终端用户。有了MongoDB Realm和AWS Wavelength,你现在可以开发利用5G的低延迟和更高吞吐量的应用程序,而且你可以用你熟悉的相同工具来实现。
下面这篇博文探讨了AWS Wavelength、MongoDB Atlas和Realm的好处,以及如何设置和使用每项服务,以建立更好的网络和移动应用并发展用户体验。我们还将通过一个真实世界的使用案例,以一个智能工厂为例。
MongoDB Atlas & Realm on AWS简介
MongoDB Atlas是一个面向现代应用的全球云数据库服务。Atlas是在AWS上运行MongoDB的最佳方式,因为作为一个完全管理的数据库即服务,它将运营、维护和安全的负担卸给了世界领先的MongoDB专家,同时在业界领先的、可靠的AWS基础设施上运行。
MongoDB Atlas使你能够建立高可用性的应用程序,在全球范围内执行,并符合最苛刻的安全和隐私标准。当你在AWS上使用MongoDB Atlas时,你可以专注于推动创新和商业价值,而不是管理基础设施。还提供Atlas搜索、Realm、Atlas数据湖等服务,使MongoDB Atlas成为市场上最全面的数据平台。
MongoDB Atlas与许多AWS产品实现了无缝集成。点击这里,了解更多关于常见的集成模式。
为什么使用AWS Wavelength?
AWS Wavelength是一种AWS基础设施产品,针对移动边缘计算应用进行了优化。Wavelength Zones是AWS基础设施部署,在通信服务提供商(CSP)的数据中心内嵌入AWS计算和存储服务。
AWS Wavelength允许客户使用业界领先和熟悉的AWS工具,同时在美国13个城市以及英国伦敦、日本东京和大阪以及韩国大田将用户数据移至他们身边。将Wavelength与MongoDB的灵活数据模型和用于移动和边缘应用的响应式Realm数据库配对,客户可以得到一个熟悉的平台,可以在任何地方运行,并可以扩展以满足不断变化的需求。
为什么使用Realm?
Realm的集成应用开发服务使开发人员能够轻松地在移动设备和网络上建立行业领先的应用程序。
Realm具有三个主要特点:
-
跨平台的移动和边缘数据库
-
跨平台的移动和边缘同步解决方案
-
节省时间的应用开发服务
1.移动和边缘数据库
Realm的移动数据库是CoreData和SQLite的一个开源的、对开发者友好的替代品。通过Realm的开源数据库,移动开发者可以在一小部分时间内建立离线优先的应用程序。支持的语言包括Swift、C#、Xamarin、JavaScript、Java、ReactNative、Kotlin和Objective-C。
Realm的数据库是用一个灵活的、面向对象的数据模型建立的,所以它很容易学习,并反映了开发人员已有的编码方式。因为它是为移动而建,所以建立在Realm上的应用程序是可靠的、高性能的,并且可以跨平台工作。
2.移动和边缘同步解决方案
Realm Sync是一个开箱即用的同步服务,可使设备、终端用户和您的后台系统之间的数据实时保持更新。它消除了与REST合作的需要,简化了你的离线优先的应用架构。使用Sync来备份用户数据,建立协作功能,并在设备在线时保持数据的更新,而不用担心冲突解决或网络代码。

图2:在移动应用中实施Realm的高层次架构
Realm由客户端的Realm Mobile和Edge数据库以及后台的MongoDB Atlas提供支持,为离线使用进行了优化,并能够与你一起扩展。构建一个一流的应用程序从未如此简单。
3.应用开发服务
有了Realm应用开发服务,您的团队可以花更少的时间为您的网络应用整合后台数据,而将更多的时间用于构建创新功能,推动您的业务举措向前发展。服务包括:
-
GraphQL
-
函数
-
触发器
-
数据访问控制
-
用户认证
参考架构
高层设计
从术语上看,我们将讨论数据持久性的三个主要层级。远云、边缘和移动/IOT。远云是企业客户所习惯的传统云基础设施。在这里,主要的母体AWS区域(如弗吉尼亚州的US-EAST-1,俄勒冈州的US-WEST-2等)被用来集中保留所有数据。
虽然这些地区是众所周知和值得信赖的,但问题是,没有多少用户或物联网设备位于这些大规模数据中心附近,而且互联网路由流量没有经过优化,延迟很低。因此,我们使用AWS的波长区域作为我们的边缘区。边缘区将把相关的数据子集从集中的远云同步到边缘。分区原则的使用,使用户的数据将被存储在离他们更近的一个或几个这样的边缘波长区,通常位于主要的大都市地区。
数据持久性的最后一层是在移动或IOT设备本身。如果在现代5G基础设施上,数据可以以低延迟同步到附近的边缘区。对于延迟要求不高的应用或在母AWS区域比最近的波长区更近的地区,数据也可以直接到远云。

图3:使用5G、Wavelength和MongoDB的现代边缘感知应用的高层设计
智能工厂用例。使用Wavelength, MQTT, & Realm Sync
从理论上过渡,让我们更深入地挖掘一个参考架构。5G和低延迟应用的一个常见用例是智能工厂。在这里,工厂里的物联网设备可以连接到5G网络,用于遥测和命令/控制。
这些传感器通常通过MQTT发出信号,可以将信息发送到附近的波长边缘区。一旦到了那里,机器学习和分析可以在边缘进行,数据可以复制回远云父母AWS区域。这一点至关重要,因为边缘的计算能力虽然低延迟,但并不总是功能齐全。因此,将许多工厂集中在一起对许多应用来说是有意义的,因为它涉及到长期的存储、分析和多区域同步。
一旦数据进入边缘或远云,这些数据的消费者(如AR/VR头盔、手机等)可以以低延迟访问这些数据,以满足维护、警报和故障识别等需求。

图4:我们将通过这篇博文构建的高层次的三层架构
对延迟敏感的应用程序不能简单地直接写到Atlas。另外,Realm在这里很强大,因为它可以在移动设备以及服务器上运行(如在Wavelength Zone),并提供低延迟的本地读写。它将实时无缝地将数据从其本地分区同步到远云,并从远云返回或到其他边缘区。开发人员不需要编写复杂的同步逻辑;相反,他们可以专注于通过编写提供高性能和低延迟的应用程序来推动业务价值。
对于高可用的应用程序,AWS服务,如自动扩展组,可以用来满足个别工厂的可用性和可扩展性要求。传统上,这将由AWS的负载平衡服务或像HAProxy这样的开源解决方案来支撑。运营商网关部署在每个Wavelength区,运营商或客户可以处理最近的边缘区路由。
设置Wavelength
将您的应用程序部署到Wavelength需要以下AWS资源:
-
您所在地区的一个虚拟私有云(VPC)
-
运营商网关 - 一种允许进出运营商网络的流量的服务。
-
运营商IP - 您分配给驻扎在Wavelength区域的网络接口的地址
-
一个公共子网
-
公共子网中的一个EC2实例
-
波长区中的一个EC2实例,拥有一个运营商IP地址
我们将按照这里的 "开始使用AWS Wavelength "教程进行操作。在下面的后续境界部分,将需要在Wavelength区至少有一个EC2计算实例。实现这一目标的高级步骤是:
-
为你的AWS账户启用Wavelength区域
-
在您的AWS VPC和Wavelength区域之间配置网络
-
在你的公共子网中启动一个EC2实例。这将作为后续步骤的一个堡垒主机。
-
启动Wavelength应用程序
-
测试连接性
设置Realm
我们上面列出的Realm组件可以分解成三个独立的步骤:
-
在AWS上设置一个远云MongoDB Atlas集群
-
配置Realm无服务器基础设施(包括启用同步)。
-
利用Realm编写一个参考应用程序
1.在AWS上用Atlas部署你的Far Cloud
在这第一节中,我们将使用一个非常基本的Atlas部署。出于示范目的,即使是MongoDB Atlas免费层(称为M0)也足够了。你可以利用AWS MongoDB Atlas Quickstart来启动集群,所以我们将不详细列举具体步骤。然而,高层次的说明是:
-
在cloud.mongodb.com注册MongoDB Atlas账户,然后登录
-
单击 "创建 "按钮,显示 "创建新数据库部署 "对话框
-
选择一个 "共享 "集群,然后选择M0(免费)的大小
-
一定要选择AWS作为云,这里我们将使用US-EAST-1
-
部署并等待集群完成部署
2.配置Realm和Realm Sync
一旦Atlas集群完成部署,下一步就是创建一个Realm应用程序并启用Realm同步。Realm在MongoDB云平台内有一个完整的用户界面,网址是cloud.mongodb.com,但是它也有一个CLI和API,可以连接到CI/CD管道和流程,包括与GitHub的集成。我们下面的步骤将是对位于这里的一个参考应用程序的高级概述。由于Realm的配置可以导出,该配置可以从该存储库导入到你的环境。
创建该配置的高层次步骤如下:
-
在 cloud.mongodb.com 上查看您的集群时,点击顶部的 Realm 标签
-
点击 "创建一个新的应用程序",并给它一个名字,如RealmA和Wavelength
-
选择同步的目标集群为你在上一步部署的集群
现在我们已经部署了一个Realm应用程序。接下来,我们需要配置该应用以启用同步。同步需要每个同步应用的凭证。你可以在这里了解更多关于认证的信息。我们的应用程序将使用API密钥认证。要打开它:
-
点击左边的 "认证"。
-
在认证提供者标签上,找到API密钥,然后点击编辑
-
打开提供者并保存
-
如果Realm启用了草稿,顶部会出现一个蓝条,你需要确认你的更改。确认并部署更改。
-
你现在可以按 "创建API密钥 "按钮创建一个API密钥,并给它一个名字。
-
请确保以后为我们的应用程序复制这个密钥,因为出于安全原因,它不能被再次检索。
-
另外,在Realm用户界面的左上方有一个按钮,可以复制Realm应用程序ID。当我们不久后编写我们的应用程序时,我们将需要这个ID和API密钥。
最后,我们可以启用同步功能。同步配置依赖于正在写入的数据的模式。这允许我们在下一步编写的应用程序中的对象(即C#或Node.JS对象)被翻译成MongoDB文档。你可以在这里了解更多关于模式的信息。
我们还需要确定一个分区键。分区键是用来决定每个Edge节点或每个移动设备上应该存放哪些数据子集的。对于Wavelength的部署,这通常是区域名称的一个变化。一个好的分区密钥可以是每个API密钥唯一的,也可以是Wavelength区域的名称(例如 "BOS "或 "DFW")。
对于后一个例子,这意味着你的远云保留了所有区域的数据,但在波士顿的Wavelength区域将只有在_pk字段中标记了 "BOS "的数据。
定义模式的两种方法是手工编写JSON或自动生成。对于前者,我们将进入同步配置,编辑配置选项卡,选择我们先前部署的集群,定义一个分区键(如_pk为字符串),然后定义该用户被允许读写的规则。然后,你必须在Realm UI的Schema部分编写模式。
然而,让Realm自动检测并为你写模式往往更容易。这可以通过将同步系统放入 "开发模式 "来实现。虽然你仍然选择集群和分区键,但你只需要指定你想把所有数据同步到哪个数据库。之后,你下面写的应用程序就是你可以定义类,在连接到Realm Sync时,同步引擎将把你在应用程序中定义的类自动翻译成代表该模式的底层JSON。
3.使用Realm Sync编写一个应用程序。智能工厂的MQTT代理
现在,后端数据存储已经配置好了,是时候编写应用程序了。作为提醒,我们将为一个智能工厂编写一个MQTT代理。物联网设备将通过5G向这个经纪人写MQTT消息,而我们的应用程序将接收该信息包并将其插入Realm数据库。之后,因为我们完成了上面的同步配置,我们的边缘到远云的同步将是自动的。它也是双向工作的。
上面提到的参考应用可以在这个GitHub仓库中找到。它的基础是用这里的文档创建一个C#控制台应用程序。
代码相对简单:
-
在Visual Studio中创建一个新的C#控制台应用程序
-
像其他C#控制台应用程序一样,让它作为CLI参数接收Realm App ID和API Key。这些应该在以后通过Docker环境变量传入,这些值是你在前面同步设置步骤中记录的值。
-
定义RealmObject,这是写入Realm的数据模型。
-
处理传入的MQTT消息并将其写入Realm
Realm Objects的数据模型可以是复杂的,只要对你的应用程序有意义。为了证明这一切,我们将保留一个基本模型:
public class IOTDataPoint : RealmObject {
[PrimaryKey]
[MapTo("_id")]
public ObjectId Id { get; set; } = ObjectId.GenerateNewId();
[MapTo("_pk")]
public string Partition { get; set; }
[MapTo("device")]
public string DeviceName { get; set; }
[MapTo("reading")]
public int Reading { get; set; }
}
要同步一个对象,它必须继承自RealmObject类。之后,只需为你想要同步的每个数据点定义getters和setters。
这方面的C#实现将取决于你选择的MQTT库。在这里我们使用了MQTTNet,所以我们只需用MqttFactory().CreateMqttServer()创建一个新的代理,然后用特定的MqttServerOptionsBuilder来启动它,我们需要定义任何你的设置所特有的东西,如端口、加密和其他基本代理信息。然而,我们需要用.WithApplicationMessageInterceptor()来钩住传入的消息,这样,任何时候有新的MQTT数据包进入Broker,我们就把它发送到一个方法,把它写入Realm。
实际的Realm代码也很简单:
-
用App.Create()创建一个App,它接受App ID的参数,我们将其作为CLI参数传入。
-
用App.LogInAsync(Credentials.ApiKey())登录,API密钥参数再次作为CLI参数传入我们之前生成的参数。
-
为了插入数据库,Realm的所有写操作都需要在一个事务中完成。语法很简单:根据我们之前定义的RealmObject类实例化一个对象,然后用realm.Write(()=>realm.Add({message)})进行写操作。
最后,我们需要将其包装在docker容器中,以方便分发。微软有一个很好的教程,介绍了如何在Docker容器内用自动生成的Docker文件运行这个应用程序。在自动生成的Docker文件之上,确保将Realm App ID和API Key的参数传递给我们先前定义的应用程序。
学习编写Realm应用程序的内部工作原理在很大程度上超出了本博文的范围。然而,如果你想了解更多关于Realm SDK的信息,在MongoDB大学有一个很好的教程。
现在,应用程序正在运行,并在Docker中,我们可以把它部署在上面创建的Wavelength Edge Zone中。
将Realm和Wavelength结合起来
为了访问Wavelength区的应用服务器,我们必须通过我们之前创建的堡垒主机。一旦我们通过这个跳板,进入Wavelength区的EC2实例,我们就可以安装任何先决条件(如Docker),并启动运行Realm Edge数据库和MQTT应用程序的Docker容器。任何新收到的入站消息都将首先写入Edge,并无缝同步到远云的Atlas。在前面提到的GitHub仓库中,有一个适合测试这种环境的MQTT随机数生成器样本容器。
我们的智能工厂参考应用已经完成了!在这一点上:
-
智能设备可以在AWS波长区的帮助下以低延迟写入5G边缘
-
写给Wavelength Zone中的Broker的MQTT消息具有低延迟的写入,并且可以立即用于读取,因为它是通过MongoDB Realm在Edge发生的。
-
这些消息会自动同步到远云,以便永久保留、分析,或通过MongoDB Realm Sync和Atlas同步到其他区。