ArangoDB Foxx 作为 REST 后端

GRE*_*608 5 rest arangodb foxx

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

问题本身:

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

主要后端要求:

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

主要寻找:

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

附带问题(可能回答上面的一些问题):Foxx 可以利用一些通过 npm 提供的节点中间件吗?

在此先感谢您的时间!

Ala*_*lum 5

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

你提到了加密。虽然 ArangoDB 确实支持某些加密技术(例如 HMAC 签名和密码的 PBKDF2 密钥派生),但支持并不像 Node.js 那样详尽和可扩展。此外,当使用计算成本高昂的加密技术时,这将影响数据库的性能(因为与 Node.js Foxx 不同,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 的薄层后面(例如,一个简单的 Express 应用程序,主要只是代理您的 Foxx API)和/或将后端的某些部分委托给独立的 Node 是一个很好的方法。 Node.js 微服务(例如与电子邮件或 LDAP 等非 HTTP 服务集成),可以通过 HTTP 集成到 Foxx 中。

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


小智 4

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

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

对于授权和会话,我会查看 FOXX 示例:FOXX 授权会话示例

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

javascript joi 包支持条目验证等。

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

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

您可以有限制地使用 NPM 模块。请参阅JavaScript 模块