4

我正在开发一个应用程序,该应用程序将极大地受益于 Arangos 的多模型功能。考虑到后端应用程序的需求,我得出的结论是,大部分(如果不是全部)可以通过 REST API 提供服务,以帮助进行更简洁的设计,以便未来的开发和与其他人集成。然后,该 API 将被多个 Web 和移动前端框架使用以处理其余逻辑。该项目将使用 NodeJS 生态系统为整个堆栈使用 Javascript 开发。

.

问题本身:

应该并且可以使用 arangodb + foxx 创建完整的后端堆栈以提供 REST API,从而避免堆栈中的另一个层/组件?例如 express/hapi/loopback 等。

.

主要后端要求:

  • 使用角色进行身份验证
  • 会话
  • 加密
  • 复杂查询(我最初想法的根源,以避免数据库和后端之间的多次跳跃)
  • 条目解析、验证和清理
  • 计划任务

.

主要找:

  • 已知的设计优势
  • 已知的设计限制
  • “隐藏”的瓶颈
  • 其他可能的未来遗憾

.

附带问题(可能会回答上面的一些问题):Foxx 能否利用一些可通过 npm 获得的节点中间件?

在此先感谢您的时间!

4

2 回答 2

4

您可以使用 ArangoDB Foxx 作为应用程序的唯一后端,但是在执行此操作时务必牢记 Foxx 的局限性(与 Node.js 等通用 JS 环境相比)。

你提到加密。虽然 ArangoDB 确实支持一些密码学(例如 HMAC 签名和密码的 PBKDF2 密钥派生),但支持不如 Node.js 中的详尽和可扩展。此外,当使用计算量大的密码学时,这将影响数据库的性能(因为与 Node.js 不同,Foxx 是严格同步的,因此所有操作都应该被视为阻塞)。

ArangoDB 不支持开箱即用的基于角色的身份验证,但使用 Foxx 在 ArangoDB 中实现它是完全合理的(就像您在 Node.js 中实现它一样,除了您不需要离开数据库)。

对于会话,通常有两种可能的方法:您可以使用带有会话文档的集合(使用 ArangoDB 作为会话后端),或者您可以使用签名令牌保持服务无状态(Foxx 提供开箱即用的 JWT 支持)。

复杂/存储的查询和输入验证(使用最初为 hapi 编写的 joi 模式库)实际上是 Foxx 的一些主要用例,因此这些不应该是任何问题。

Foxx 有自己的队列任务机制,也可以提前安排或定期重复。但是,根据您的要求,外部作业或消息队列可能更合适。好消息是您可以立即开始使用内置作业队列,如果在开发过程中出现需要,您仍然可以继续使用专用解决方案。

至于中间件和 NPM 包:Foxx 与 Node.js 代码不完全兼容。虽然我们提供了大量兼容性代码并尽可能保持核心模块的兼容性,但一个很大的区别是 Node.js 通常用于执行异步操作,而在 ArangoDB 中所有操作都是同步的。

如果您的 Node.js 模块不使用加密、文件或网络 I/O 并且不使用异步 API(例如 setTimeout、promise),它们可能与 Foxx 兼容。许多实用程序库(如 lodash)完全没有问题。即使您发现一个模块不起作用,也可以为它编写一个适配器,就像我们使用 mocha(集成到 Foxx)和 GraphQL(通过 NPM 上的 graphql-sync 包)所做的那样。

根据我的经验,将 Foxx 服务置于 Node.js 的薄层(例如,一个简单的快速应用程序,主要代理 Foxx API)和/或将后端的某些部分委托给独立的 Node.js 是一个很好的方法。 Node.js 微服务(例如与电子邮件或 LDAP 等非 HTTP 服务的集成),可以通过 HTTP 集成到 Foxx 中。

还有一件事:虽然由于特定于节点的依赖关系和异步逻辑,许多现有的 express 中间件可能与 Foxx 不兼容,但 ArangoDB 3 将带来一个新版本的 Foxx,支持使用功能 express 兼容的 API 的中间件。

于 2016-05-30T14:21:29.650 回答
3

我刚刚开始将我的 Sails 应用程序移植到 FOXX 应用程序,这样我就可以回答您的一些问题。

ArangoDB 中基于角色的授权可能比您想要的级别太高。在我们的案例中,我们使用外部服务在非常细粒度的级别(远低于顶点或边)授权各种基于 Web 和服务的应用程序。我的感觉是,该级别的授权需要您自己用 javascript 编写。如果它只是基于每个集合的 CRUD,那么它应该不需要太多的努力。

对于授权和会话,我将查看位于以下位置的 FOXX 示例:FOXX 授权会话示例

目前尚不清楚您对加密的要求是什么。如果您谈论的是 SSL 连接,那么它是本机支持的(请参阅 arangodb 端点)。至于内部加密,有一个 javascript 加密模块ArangoDb crypto

javascript joi 包支持条目验证等。

复杂的查询......绝对是在 ArangoDB 3.x 版中变得更好。遍历可以链接起来(使用一个边缘集合向下,然后使用另一个边缘集合向上)。

在考虑效率时,您是正确的。这是我们从风帆转向 FOXX 的主要原因。在我们的例子中,我们根据外部服务的权限过滤查询结果。这意味着如果客户端指定了这些属性,我们就不能使用 ArangoDB 原生的跳过和限制支持。在sails 中,我们必须以块的形式返回结果并收集,直到我们达到适当的跳过和限制值。通过迁移到 FOXX,我们节省了大量的网络和其他资源。我们通过将请求转发到我们的原型 FOXX 实现来测试这一点。这比风帆后处理设置好得多。

你可以使用有限制的 NPM 模块。请参阅Javascript 模块

于 2016-05-29T17:58:21.637 回答