Skip to main content

设计应用

当你想出如何创造应用程序时,你要做出许多关于如何构建和组织项目而做出一些设计决策。这些决策中的大多数与你是在传统的云服务上部署还是在ICP部署与你的应用程序相关性并不大。但是,如果你打算在互联网计算机上部署,在你计划你的应用程序的实施时,你应该特别注意一些设计决定。

本节是正在进行的工作,并不完整。随着在互联网计算机上运行的应用程序的最佳实践和设计模式的发展,这里包括的信息也会相应地发展和变化。

单个或多个程序罐的架构#

在设计你的应用程序时,你可能要考虑的第一个决定是,它是应该被封装在一个程序罐里,还是由多个程序罐组成。

例如,如果你正在编写一个没有前端的简单服务,你可能想使用一个单一的程序罐来简化项目管理和维护,并专注于增加功能。如果你的应用程序既有前端资产又有后端业务逻辑,你的项目可能至少由两个程序罐组成,一个程序罐用于管理用户界面组件,另一个程序罐用于应用程序提供的后端服务。

在计划中,你也可以考虑将一些常用的、可重复的服务放在单独的程序罐中,这样它们就可以从其他业务逻辑的程序罐中导入和调用,或者提供给其他开发者使用,达到最优解耦状态。LinkedUp示例应用程序通过将专业服务应用程序分割成两个程序罐来说明这种方法。在LinkedUp的例子中,建立社交关系的功能被定义在connectd程序罐中,与用于建立职业档案的功能分开,后者被定义在linkedup程序罐中。我们很容易想象用第三个程序罐来扩展这个应用,例如,根据档案属性或共享连接来安排事件。

将Actor、types、Untils分开放#

在为您的项目规划架构时,一种常见的做法是将主要Actor的代码放在一个文件中,并有单独的附加文件来定义你程序使用的Type和不需要Actor的实用功能。

例如,你可以将你的应用程序的后端逻辑设置为由以下文件组成:

Main.mo或main.rs,包括需要actor来发送查询和更新调用的函数。

Util.mo或util.rs,包含可以被导入供actor使用的辅助函数。

Types.mo 或 types.rs 包含你的应用程序的所有数据类型定义。

使用查询调用#

正如在查询和更新方法中所讨论的,查询比更新调用更快地返回结果。因此,明确地将一个函数标记为查询是提高应用程序性能的有效策略。在规划和设计阶段,你应该考虑如何最好地使用查询调用而不是可以执行查询或更新的函数。

这是一个很好的设计规范,可以广泛地应用于大多数类别的应用程序。然而,你也应该考虑安全和性能的权衡,即查询不经过共识。对于某些应用,这种权衡可能是合适的。例如,如果你正在开发一个博客平台,检索与某个标签相匹配的文章的查询可能不需要通过共识来确保大多数节点对结果达成一致。然而,如果你的应用程序正在检索敏感信息,如金融数据,你可能希望你的结果比基本查询提供更多的保证。

作为基本查询的替代品,互联网计算机还支持认证查询。认证查询使你能够收到你可以信任的认证响应。使用认证查询是一种高级技术,在教程或其他以开发人员为重点的文档中没有涉及,但你可以了解到认证是如何工作的,以及你需要做什么来配置你的程序,以返回认证数据来响应接口规范中的查询。

数据存储和检索#

对于许多应用来说,数据库主要用于提供永久的数据存储,可以使用一个或多个关键字段进行有效索引。在互联网计算机上,这种用例通常通过哈希表这样的数据结构来解决。取代传统的数据库,互联网计算机使你能够使用稳定的内存来处理长期的数据存储--通常被称为正交持久性,并使用查询调用来检索你的数据。虽然这种方法适用于大多数应用程序和简单的键值数据库请求,但它并不完全模拟关系型数据库。

nnsdao小课堂#

正交持久性

Orthogonal Persistence Wiki

Orthogonal Persistence Revisited